{"record":{"id":"18a1608d0b5dc90d","repo":"sgl-project/sglang","slug":"staging-is-enabled-but-kv-manager-kv-buffer-tensor","errorCode":null,"errorMessage":"Staging is enabled but kv_manager.kv_buffer_tensors is None. Check that set_kv_buffer_tensors() was called during kv_manager init.","messagePattern":"Staging is enabled but kv_manager\\.kv_buffer_tensors is None\\. Check that set_kv_buffer_tensors\\(\\) was called during kv_manager init\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/disaggregation/common/staging_handler.py","lineNumber":135,"sourceCode":"        if prefill_tp > self.decode_tp:\n            tp_writers = prefill_tp // max(1, self.decode_tp)\n        else:\n            tp_writers = 1\n        pp_writers = prefill_info.pp_size // self.kv_manager.pp_size\n        return tp_writers * pp_writers\n\n    @classmethod\n    def create(cls, kv_manager, scheduler, tp_rank: int) -> DecodeStagingHandler:\n        \"\"\"Factory: create handler. Raises if staging infra is missing.\"\"\"\n        staging_allocator = kv_manager._staging_ctx.allocator\n        if staging_allocator is None:\n            raise RuntimeError(\n                \"Staging is enabled but kv_manager._staging_ctx.allocator is None. \"\n                \"Check that the transfer backend correctly initializes the staging allocator.\"\n            )\n        kv_buffer_info = kv_manager.kv_buffer_tensors\n        if kv_buffer_info is None:\n            raise RuntimeError(\n                \"Staging is enabled but kv_manager.kv_buffer_tensors is None. \"\n                \"Check that set_kv_buffer_tensors() was called during kv_manager init.\"\n            )\n        decode_tp = kv_manager.attn_tp_size\n\n        from sglang.srt.disaggregation.common.staging_buffer import (\n            resolve_total_kv_heads,\n        )\n\n        total_kv_heads = resolve_total_kv_heads(kv_manager.kv_args, decode_tp)\n        return cls(\n            kv_manager=kv_manager,\n            staging_allocator=staging_allocator,\n            kv_buffer_info=kv_buffer_info,\n            decode_tp=decode_tp,\n            total_kv_heads=total_kv_heads,\n            tp_rank=tp_rank,\n            scheduler=scheduler,","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/disaggregation/common/staging_handler.py#L117-L153","documentation":"DecodeStagingHandler.create checks kv_manager.kv_buffer_tensors after the allocator check and raises if it is None. Staging transfers read/write through the kv_buffer_tensors handles, so they must have been registered via set_kv_buffer_tensors() during kv_manager init.","triggerScenarios":"Staging enabled (SGLANG_DISAGG_STAGING_BUFFER=1), allocator present, but set_kv_buffer_tensors() was never called on the kv_manager — a backend or init path that skips buffer-tensor registration.","commonSituations":"Backend integration that allocates the staging allocator but forgets to publish kv_buffer_tensors; init order change where the handler is created before buffer registration.","solutions":["Call set_kv_buffer_tensors(...) on the kv_manager during its init (as the supported backends do)","Upgrade/patch the transfer backend so its kv_manager init registers kv_buffer_tensors","Disable SGLANG_DISAGG_STAGING_BUFFER if the feature is not needed"],"exampleFix":"# before\n# kv_manager init ends without buffer registration\n# after\nkv_manager.set_kv_buffer_tensors(kv_buffer_tensors)","handlingStrategy":"validation","validationCode":"if envs.SGLANG_DISAGG_STAGING_BUFFER.get():\n    assert kv_manager.kv_buffer_tensors is not None, 'set_kv_buffer_tensors not called'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Call set_kv_buffer_tensors in every backend's kv_manager init","Add a unit test asserting both staging preconditions after init"],"tags":["disaggregation","staging-buffer","kv-buffer-tensors","initialization"],"backgroundTag":"missing-required-field","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}