{"record":{"id":"69162a075c84b1d4","repo":"jumpserver/jumpserver","slug":"create-session-failed","errorCode":null,"errorMessage":"create session failed","messagePattern":"create session failed","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"apps/common/sdk/gm/base/device.py","lineNumber":40,"sourceCode":"\n        self.__load_driver(driver_path)\n        # open device\n        self.__open_device()\n        self.reset_key_store()\n\n    def close(self):\n        if self.__device is None:\n            raise Exception(\"device not turned on\")\n        ret = self._driver.SDF_CloseDevice(self.__device)\n        if ret != 0:\n            raise Exception(\"turn off device failed\")\n        self.__device = None\n\n    def new_session(self):\n        session = c_void_p()\n        ret = self._driver.SDF_OpenSession(self.__device, pointer(session))\n        if ret != 0:\n            raise Exception(\"create session failed\")\n        return Session(self._driver, session)\n\n    def generate_ecc_key_pair(self):\n        session = self.new_session()\n        return session.generate_ecc_key_pair(alg_id=0x00020200)\n\n    def generate_random(self, length=64):\n        session = self.new_session()\n        return session.generate_random(length)\n\n    def verify_sign(self, public_key, raw_data, sign_data):\n        session = self.new_session()\n        return session.verify_sign_ecc(\n            SGD_SM2,\n            base64.b64decode(public_key),\n            base64.b64decode(raw_data),\n            base64.b64decode(sign_data),\n        )","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/jumpserver/jumpserver/blob/6ec464fabd61b95912d539455a3a5f15f5c59fe0/apps/common/sdk/gm/base/device.py#L22-L58","documentation":"new_session() calls SDF_OpenSession and raises Exception('create session failed') on a non-zero return. Almost every crypto operation (generate_ecc_key_pair, generate_random, verify_sign, sm3_hmac, ciphers) goes through new_session, so this error surfaces from virtually any GM crypto call.","triggerScenarios":"Calling any crypto op after the device handle became invalid (closed, unplugged); exceeding the driver's max session count; concurrent use of a non-thread-safe device handle; device not opened yet (__device is None).","commonSituations":"Long-running processes holding a device handle that went stale; high concurrency exhausting session limits; calling generate_random before successful open in startup race.","solutions":["Ensure open() succeeded before any op and the device wasn't closed elsewhere","Serialize device access with a lock or use a device pool/session pool","Retry with re-open: on failure, re-open the device then retry once","Check vendor docs for max concurrent sessions and size your worker pool accordingly"],"exampleFix":"# before\ndef sign(data):\n    return dev.verify_sign(...)  # fails if handle stale\n# after\nimport threading\n_lock = threading.Lock()\ndef sign(data):\n    with _lock:\n        try:\n            return dev.verify_sign(...)\n        except Exception:\n            dev2 = reopen_device()\n            return dev2.verify_sign(...)","handlingStrategy":"retry","validationCode":"assert device_is_open(dev), 'open device before crypto ops'","typeGuard":null,"tryCatchPattern":"try:\n    sig = dev.verify_sign(...)\nexcept Exception as e:\n    if 'create session failed' in str(e):\n        dev = reopen_device(); sig = dev.verify_sign(...)","preventionTips":["Guard all device calls with a lock; reopen on session errors once","Warm up with a generate_random call at startup to fail fast"],"tags":["gm-crypto","hardware","session","sdk-error-code"],"backgroundTag":"hardware-session-open-failed","analyzedSha":"6ec464fabd61b95912d539455a3a5f15f5c59fe0","analyzedAt":"2026-08-28T11:33:00.925Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}