{"record":{"id":"9592fb259146ad0b","repo":"quarkusio/quarkus","slug":"extension-name-extensionname-and-number-exten","errorCode":null,"errorMessage":"Extension name ${extensionName} and number ${extensionNumber} are already defined","messagePattern":"Extension name (.+?) and number (.+?) are already defined","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/grpc/reflection/src/main/java/io/quarkus/grpc/reflection/service/GrpcServerIndex.java","lineNumber":169,"sourceCode":"            processType(nestedType, fd, descriptorsBySymbol, descriptorsByExtensionAndNumber);\n        }\n    }\n\n    private void processExtension(Descriptors.FieldDescriptor extension, FileDescriptor fd,\n            Map<String, Map<Integer, FileDescriptor>> descriptorsByExtensionAndNumber) {\n        String extensionName = extension.getContainingType().getFullName();\n        int extensionNumber = extension.getNumber();\n\n        descriptorsByExtensionAndNumber.computeIfAbsent(extensionName,\n                new Function<String, Map<Integer, FileDescriptor>>() {\n                    @Override\n                    public Map<Integer, FileDescriptor> apply(String s) {\n                        return new HashMap<>();\n                    }\n                });\n\n        if (descriptorsByExtensionAndNumber.get(extensionName).containsKey(extensionNumber)) {\n            throw new IllegalStateException(\n                    \"Extension name \" + extensionName + \" and number \" + extensionNumber + \" are already defined\");\n        }\n        descriptorsByExtensionAndNumber.get(extensionName).put(extensionNumber, fd);\n    }\n\n}\n","sourceCodeStart":151,"sourceCodeEnd":176,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/grpc/reflection/src/main/java/io/quarkus/grpc/reflection/service/GrpcServerIndex.java#L151-L176","documentation":"When indexing proto extensions for reflection, each extension is keyed by (extension full name, extension number). processExtension throws this IllegalStateException if that name/number pair was already defined, i.e. two descriptors declare the same extension with the same number.","triggerScenarios":"Two proto files extend the same message with an extension of the same name and field number; duplicated protos on the classpath re-declaring the same extensions.","commonSituations":"Two teams declaring extensions for a shared base message using identical names/numbers; duplicated dependency protos containing extension declarations.","solutions":["Coordinate extension numbers: give each team/module a distinct extension number range in the shared base proto.","Rename one of the colliding extensions (extension full names must be unique anyway).","Remove duplicated protos from the classpath via dependency exclusions.","Regenerate stubs with a clean build after resolving the collision."],"exampleFix":"// before: both files\nextend Base { optional string meta = 100; }\n// after: fileB\nextend Base { optional string meta_b = 101; }","handlingStrategy":"validation","validationCode":"// lint: allocate unique extension numbers per team/module\nMap<Integer,String> numbers = new HashMap<>();\nfor (ExtensionDef e : allExtensions)\n  if (numbers.put(e.getNumber(), e.getName()) != null)\n    throw new IllegalStateException(\"Duplicate extension number \" + e.getNumber());","typeGuard":null,"tryCatchPattern":"try {\n    startServer();\n} catch (IllegalStateException e) {\n    if (e.getMessage().startsWith(\"Extension name\")) {\n        // renumber/rename the colliding extension reported in the message\n    } else throw e;\n}","preventionTips":["Reserve disjoint extension number ranges per team/module in the base proto","Document extension allocations in the base proto file","Lint protos for duplicate extension name/number pairs","Avoid duplicated proto artifacts on the classpath"],"tags":["grpc","reflection","protobuf","extensions","duplicate-symbol"],"backgroundTag":"duplicate-proto-symbol","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}