{"record":{"id":"67a9d8cfd3335db0","repo":"micro/go-micro","slug":"rpc-service-already-defined-sname","errorCode":null,"errorMessage":"rpc: service already defined: ${sname}","messagePattern":"rpc: service already defined: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/grpc/server.go","lineNumber":155,"sourceCode":"\tdefer server.mu.Unlock()\n\tlog := server.logger\n\tif server.serviceMap == nil {\n\t\tserver.serviceMap = make(map[string]*service)\n\t}\n\ts := new(service)\n\ts.typ = reflect.TypeOf(rcvr)\n\ts.rcvr = reflect.ValueOf(rcvr)\n\tsname := reflect.Indirect(s.rcvr).Type().Name()\n\tif sname == \"\" {\n\t\tlogger.Fatalf(\"rpc: no service name for type %v\", s.typ.String())\n\t}\n\tif !isExported(sname) {\n\t\ts := \"rpc Register: type \" + sname + \" is not exported\"\n\t\tlog.Log(logger.ErrorLevel, s)\n\t\treturn errors.New(s)\n\t}\n\tif _, present := server.serviceMap[sname]; present {\n\t\treturn errors.New(\"rpc: service already defined: \" + sname)\n\t}\n\ts.name = sname\n\ts.method = make(map[string]*methodType)\n\n\t// Install the methods\n\tfor m := 0; m < s.typ.NumMethod(); m++ {\n\t\tmethod := s.typ.Method(m)\n\t\tif mt := prepareEndpoint(method, log); mt != nil {\n\t\t\ts.method[method.Name] = mt\n\t\t}\n\t}\n\n\tif len(s.method) == 0 {\n\t\ts := \"rpc Register: type \" + sname + \" has no exported methods of suitable type\"\n\t\tlog.Log(logger.ErrorLevel, s)\n\t\treturn errors.New(s)\n\t}\n\tserver.serviceMap[s.name] = s","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/micro/go-micro/blob/24529f140421a11a33b6999ab7944f2021cfd69c/server/grpc/server.go#L137-L173","documentation":"The gRPC server keeps a serviceMap keyed by service type name; register() returns this error when a service with the same name is registered a second time on the same server, since duplicate registrations would overwrite method dispatch. The message includes the duplicate name via ${sname}.","triggerScenarios":"Calling Register/RegisterSubscriber (or pb.RegisterXxxServer) twice for the same handler type on one server; accidental double-bootstrap where startup code runs registration twice (e.g. both an init path and a manual call); registering the same struct value and pointer under the same name.","commonSituations":"Copy-pasted registration lines in main(); plugin/module systems that each register the same service; hot-reload logic constructing a new service but re-registering on the old server instance.","solutions":["Remove the duplicate registration call so each service type is registered once per server","Guard registration with a sync.Once or boolean flag in startup code","If re-registration is intended, create a new server instance instead of reusing the old one","Check startup hooks (options, BeforeStart, init) for double invocation"],"exampleFix":"// before\npb.RegisterGreeterHandler(srv.Server(), h)\npb.RegisterGreeterHandler(srv.Server(), h) // rpc: service already defined\n// after\nvar once sync.Once\nonce.Do(func() {\n  pb.RegisterGreeterHandler(srv.Server(), h)\n})","handlingStrategy":"validation","validationCode":"var registered sync.Map\nfunc registerOnce(srv server.Server, name string, h interface{}) error {\n  if _, dup := registered.LoadOrStore(name, true); dup {\n    return nil // already registered\n  }\n  return srv.Register(h)\n}","typeGuard":null,"tryCatchPattern":"if err := srv.register(h); err != nil {\n  if strings.Contains(err.Error(), \"already defined\") {\n    return nil // tolerate idempotent re-registration\n  }\n  return err\n}","preventionTips":["Register each service exactly once, guarded by sync.Once","Audit init()/BeforeStart hooks for duplicate registration paths","Use a fresh server instance when re-registration is required"],"tags":["grpc","rpc","duplicate-registration","lifecycle"],"backgroundTag":"rpc-service-already-registered","analyzedSha":"24529f140421a11a33b6999ab7944f2021cfd69c","analyzedAt":"2026-09-01T02:52:24.923Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}