{"record":{"id":"c32289033b1ece87","repo":"sgl-project/sglang","slug":"spdk-passthrough-unknown-ssd-config-field-r-m","errorCode":null,"errorMessage":"spdk_passthrough: unknown SSD config field {!r} (must be an existing spdk_* field on UMBPSsdConfig)","messagePattern":"spdk_passthrough: unknown SSD config field (.+?) \\(must be an existing spdk_\\* field on UMBPSsdConfig\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/mem_cache/storage/umbp/umbp_store.py","lineNumber":421,"sourceCode":"            cfg.ssd.spdk_proxy_reserved_shared_bytes = int(\n                extra[\"spdk_proxy_reserved_shared_bytes\"]\n            )\n\n        # Expert escape hatch for advanced SPDK knobs outside the stable\n        # extra_config surface, forwarded to UMBPSsdConfig as-is.\n        if \"spdk_passthrough\" in extra:\n            overrides = extra[\"spdk_passthrough\"]\n            if not isinstance(overrides, dict):\n                raise ValueError(\n                    \"extra_config['spdk_passthrough'] must be a dict of \"\n                    \"spdk_* field overrides\"\n                )\n            applied = []\n            for field_name, field_value in overrides.items():\n                if not field_name.startswith(\"spdk_\") or not hasattr(\n                    cfg.ssd, field_name\n                ):\n                    raise ValueError(\n                        f\"spdk_passthrough: unknown SSD config field {field_name!r} \"\n                        \"(must be an existing spdk_* field on UMBPSsdConfig)\"\n                    )\n                current = getattr(cfg.ssd, field_name)\n                setattr(\n                    cfg.ssd,\n                    field_name,\n                    _cast_like(current, field_value, field_name),\n                )\n                applied.append(field_name)\n            if applied:\n                logger.warning(\n                    \"UMBPStore: using spdk_passthrough expert escape hatch for \"\n                    \"fields %s; these are advanced backend knobs forwarded directly \"\n                    \"to UMBPSsdConfig and are not part of the stable extra_config \"\n                    \"surface.\",\n                    applied,\n                )","sourceCodeStart":403,"sourceCodeEnd":439,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/mem_cache/storage/umbp/umbp_store.py#L403-L439","documentation":"A key in the spdk_passthrough dict is rejected because it either doesn't start with 'spdk_' or doesn't exist as an attribute on cfg.ssd (UMBPSsdConfig). Only existing spdk_* fields can be overridden.","triggerScenarios":"Passing {'io_queue_count': 4} (missing prefix) or {'spdk_future_field': 1} (not on UMBPSsdConfig in this mori version).","commonSituations":"Copying SPDK knob names from newer/older mori docs than the installed build; dropping the spdk_ prefix.","solutions":["Prefix the key with spdk_ and confirm the field exists on UMBPSsdConfig (inspect cfg.ssd attributes)","Upgrade/align the mori version if the field is genuinely new","Prefer the documented stable extra_config keys when available"],"exampleFix":"# before\nextra['spdk_passthrough'] = {'io_queue_count': 4}\n# after\nextra['spdk_passthrough'] = {'spdk_io_queue_count': 4}","handlingStrategy":"validation","validationCode":"VALID = {f for f in dir(cfg.ssd) if f.startswith('spdk_')}\nassert all(k.startswith('spdk_') and k in VALID for k in extra['spdk_passthrough'])","typeGuard":"def valid_spdk_fields(cfg, overrides) -> list:\n    valid = {f for f in dir(cfg.ssd) if f.startswith('spdk_')}\n    return [k for k in overrides if k not in valid]  # empty == ok","tryCatchPattern":null,"preventionTips":["Introspect UMBPSsdConfig fields for the installed mori version before passing overrides","Prefer stable documented extra_config keys over passthrough when possible"],"tags":["umbp","spdk","config-validation"],"backgroundTag":"unknown-config-field","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}