{"record":{"id":"321b34c644d14e8c","repo":"sgl-project/sglang","slug":"lora-with-name-lora-ref-lora-name-already-exists","errorCode":null,"errorMessage":"LoRA with name {lora_ref.lora_name} already exists. Loaded LoRAs: {self._registry.keys()}","messagePattern":"LoRA with name (.+?) already exists\\. Loaded LoRAs: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/lora/lora_registry.py","lineNumber":242,"sourceCode":"        If exclude_pinned is True, then return the LRU LoRA adapter that isn't pinned.\n        \"\"\"\n        async with self._registry_lock.reader_lock:\n            if not exclude_pinned:\n                return next(iter(self._registry), None)\n\n            for lora_name, lora_ref in self._registry.items():\n                if not lora_ref.pinned:\n                    return lora_name\n            else:\n                return None\n\n    def _register_adapter(self, lora_ref: LoRARef):\n        \"\"\"\n        Internal helper method to register a LoRA adapter.\n        \"\"\"\n\n        if lora_ref.lora_name in self._registry:\n            raise ValueError(\n                f\"LoRA with name {lora_ref.lora_name} already exists. Loaded LoRAs: {self._registry.keys()}\"\n            )\n        self._registry[lora_ref.lora_name] = lora_ref\n        self._counters[lora_ref.lora_id] = ConcurrentCounter()\n        return lora_ref\n\n    @property\n    def num_registered_loras(self) -> int:\n        \"\"\"\n        Returns the total number of LoRA adapters currently registered.\n        \"\"\"\n        return len(self._registry)\n\n    def get_all_adapters(self) -> Dict[str, LoRARef]:\n        \"\"\"\n        Returns a dictionary of all registered LoRA adapters.\n\n        Returns:","sourceCodeStart":224,"sourceCodeEnd":260,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/lora/lora_registry.py#L224-L260","documentation":"Raised by LoRARegistry._register_adapter when registering a LoRA name that already exists in the registry (an OrderedDict keyed by lora_name). Registration happens in registry __init__ and register(); duplicate names would alias two adapters to one key, so it is rejected.","triggerScenarios":"Constructing/registering a LoRARef whose lora_name equals an existing registry key — e.g. two load requests racing, or re-creating a registry entry with the same name.","commonSituations":"Concurrent load requests for the same name; retry logic that re-registers after a partial failure; startup lora_paths containing the same name twice.","solutions":["Unload/unregister the existing adapter before registering the same name","Use a unique lora_name for the new adapter","Serialize load operations per name (lock or single-writer) to avoid racing registrations"],"exampleFix":"# before\nawait registry.register(LoRARef(lora_name='a', lora_path=p1))\nawait registry.register(LoRARef(lora_name='a', lora_path=p2))\n# after\nawait registry.register(LoRARef(lora_name='a-v2', lora_path=p2))","handlingStrategy":"validation","validationCode":"if lora_ref.lora_name in registry._registry:\n    raise ValueError(f\"{lora_ref.lora_name} already registered; pick another name or unregister first\")","typeGuard":null,"tryCatchPattern":"try:\n    registry.register(lora_ref)\nexcept ValueError as e:\n    if 'already exists' in str(e):\n        await registry.unregister(lora_ref.lora_name)\n        registry.register(lora_ref)  # replace\n    else:\n        raise","preventionTips":["Use content-derived unique names (path hash) for adapters","Serialize concurrent load/register calls per name"],"tags":["lora","registry","duplicate","register","sglang"],"backgroundTag":"duplicate-resource-registration","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}