{"record":{"id":"2b38d05b5eba2716","repo":"quarkusio/quarkus","slug":"duplicated-grpc-service-servicename","errorCode":null,"errorMessage":"Duplicated gRPC service: ${serviceName}","messagePattern":"Duplicated gRPC service: (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/grpc/reflection/src/main/java/io/quarkus/grpc/reflection/service/GrpcServerIndex.java","lineNumber":49,"sourceCode":"            List<ServerServiceDefinition> definitions) {\n        Queue<FileDescriptor> fileDescriptorsToProcess = new ArrayDeque<>();\n        Set<String> files = new HashSet<>();\n        Set<String> names = new HashSet<>();\n        Set<FileDescriptor> services = new HashSet<>();\n        Map<String, FileDescriptor> descriptorsByName = new LinkedHashMap<>();\n        Map<String, FileDescriptor> descriptorsBySymbol = new LinkedHashMap<>();\n        Map<String, Map<Integer, FileDescriptor>> descriptorsByExtensionAndNumber = new LinkedHashMap<>();\n\n        // Collect the services\n        for (ServerServiceDefinition definition : definitions) {\n            ServiceDescriptor serviceDescriptor = definition.getServiceDescriptor();\n            if (serviceDescriptor.getSchemaDescriptor() instanceof ProtoFileDescriptorSupplier) {\n                ProtoFileDescriptorSupplier supplier = (ProtoFileDescriptorSupplier) serviceDescriptor\n                        .getSchemaDescriptor();\n                FileDescriptor fd = supplier.getFileDescriptor();\n                String serviceName = serviceDescriptor.getName();\n                if (names.contains(serviceName)) {\n                    throw new IllegalStateException(\"Duplicated gRPC service: \" + serviceName);\n                }\n                services.add(fd);\n                names.add(serviceName);\n\n                if (!files.contains(fd.getName())) {\n                    files.add(fd.getName());\n                    fileDescriptorsToProcess.add(fd);\n                }\n            }\n        }\n\n        // Traverse the set of service and add dependencies\n        while (!fileDescriptorsToProcess.isEmpty()) {\n            FileDescriptor fd = fileDescriptorsToProcess.remove();\n            processFileDescriptor(fd, descriptorsByName, descriptorsBySymbol, descriptorsByExtensionAndNumber);\n            for (FileDescriptor dep : fd.getDependencies()) {\n                if (!files.contains(dep.getName())) {\n                    files.add(dep.getName());","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/grpc/reflection/src/main/java/io/quarkus/grpc/reflection/service/GrpcServerIndex.java#L31-L67","documentation":"When building the reflection index of all gRPC services served by the server, each ServiceDescriptor's name must be unique. If two service descriptors share the same service name, GrpcServerIndex's constructor throws this IllegalStateException instead of building an ambiguous reflection index.","triggerScenarios":"Registering two gRPC services (or the same service implementation twice, e.g. two beans exposed as the same proto service, or a service registered both directly and via a different port/bean) so io.grpc.ServerServiceDefinition entries contain a duplicated service name.","commonSituations":"Declaring the same service bean twice (e.g. @GrpcService plus manual registration); two different proto packages compiled to the same service full name; accidentally shipping the same proto twice under different files; running reflection against a server with duplicated service registrations from two versions of the same proto.","solutions":["Find the duplicate: enable debug logging on io.quarkus.grpc.reflection and inspect registered services; identify which proto produces the duplicate name.","Ensure each proto service has a unique package (package a.b; in the .proto) so full service names don't collide.","Remove duplicate service bean registrations — a proto service should map to exactly one implementation bean.","If two versions of the same proto are on the classpath (e.g. via a transitive dependency), exclude the older artifact."],"exampleFix":"// before: two protos both declaring\npackage foo;\nservice Greeter {...}\n// after\npackage foo.v1;\nservice Greeter {...}   // unique full name foo.v1.Greeter","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"boolean hasDuplicate(List<String> names) {\n  return names.size() != new HashSet<>(names).size();\n}","tryCatchPattern":"try {\n    startServer();\n} catch (IllegalStateException e) {\n    if (e.getMessage().startsWith(\"Duplicated gRPC service:\")) {\n        // inspect service bean registration and proto packages for the duplicated name\n    } else throw e;\n}","preventionTips":["One proto service = one implementation bean; don't double-register","Use distinct proto packages for services with the same name","Exclude older artifacts shipping the same proto","Review @GrpcService-annotated beans for accidental duplicates"],"tags":["grpc","reflection","duplicate-service","quarkus"],"backgroundTag":"duplicate-service-registration","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}