{"record":{"id":"964b5aabfb5ee110","repo":"sgl-project/sglang","slug":"pd-decode-dcp-requires-disaggregation-transfer-b","errorCode":null,"errorMessage":"PD decode DCP requires --disaggregation-transfer-backend mooncake, nixl, or fake for synthetic benchmarking, got {}.","messagePattern":"PD decode DCP requires --disaggregation-transfer-backend mooncake, nixl, or fake for synthetic benchmarking, got (.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/arg_groups/pd_disaggregation_hook.py","lineNumber":58,"sourceCode":"            \"with MC_FORCE_TCP=1 (TCP transport, no RDMA)\"\n        )\n\n    if cfg.disaggregation_mode == \"prefill\" and cfg.dcp_size > 1:\n        logger.warning(\n            \"DCP on a PD prefill server is supported when prefill and decode \"\n            \"use the same DCP layout, but it usually adds communication \"\n            \"overhead without improving prefill performance.\"\n        )\n\n    if cfg.disaggregation_mode == \"decode\" and cfg.dcp_size > 1:\n        # Fake transfer moves no KV and is only used for synthetic decode\n        # benchmarks, so it does not need the DCP relayout from Mooncake/NIXL.\n        if cfg.disaggregation_transfer_backend not in (\n            \"mooncake\",\n            \"nixl\",\n            \"fake\",\n        ):\n            raise ValueError(\n                \"PD decode DCP requires --disaggregation-transfer-backend \"\n                \"mooncake, nixl, or fake for synthetic benchmarking, got \"\n                f\"{cfg.disaggregation_transfer_backend!r}.\"\n            )\n        if cfg.disaggregation_decode_enable_radix_cache:\n            raise ValueError(\n                \"PD decode DCP currently requires chunk cache; \"\n                \"--disaggregation-decode-enable-radix-cache is not supported.\"\n            )\n        if cfg.enable_hierarchical_cache:\n            raise ValueError(\n                \"PD decode DCP currently requires chunk cache; \"\n                \"--enable-hierarchical-cache is not supported.\"\n            )\n\n    if cfg.disaggregation_mode == \"decode\":\n        if cfg.disaggregation_decode_enable_radix_cache:\n            if cfg.enable_hisparse:","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/arg_groups/pd_disaggregation_hook.py#L40-L76","documentation":"Prefill-decode disaggregation with decode-side cache-protected (DCP) transfer requires a real KV transfer engine (mooncake or nixl) or the fake backend for synthetic benchmarks. Other transfer backends (e.g. ascends etc.) cannot perform the DCP relayout.","triggerScenarios":"Enabling PD decode DCP with --disaggregation-transfer-backend set to anything besides mooncake/nixl/fake.","commonSituations":"Enabling a DCP feature flag on a cluster configured with a custom or vendor-specific transfer backend.","solutions":["Set --disaggregation-transfer-backend mooncake (production default)","Or nixl if that is your stack","Use fake only for synthetic benchmarking"],"exampleFix":"# before\n--disaggregation-transfer-backend <other> <dcp-flags>\n# after\n--disaggregation-transfer-backend mooncake <dcp-flags>","handlingStrategy":"validation","validationCode":"if dcp_enabled:\n    assert cfg.disaggregation_transfer_backend in (\"mooncake\", \"nixl\", \"fake\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pin transfer backend to mooncake for production PD deployments"],"tags":["sglang","pd-disaggregation","dcp","transfer-backend","config-validation"],"backgroundTag":"unsupported-argument-combination","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}