{"record":{"id":"0da4c7e565ae85cb","repo":"grpc/grpc-java","slug":"server-instance-already-registered","errorCode":null,"errorMessage":"Server instance already registered","messagePattern":"Server instance already registered","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"inprocess/src/main/java/io/grpc/inprocess/AnonymousInProcessSocketAddress.java","lineNumber":56,"sourceCode":"  @GuardedBy(\"this\")\n  @SuppressWarnings(\"serial\")\n  private InProcessServer server;\n\n  private void writeObject(ObjectOutputStream out) throws IOException {\n    throw new NotSerializableException(\"AnonymousInProcessSocketAddress is not serializable\");\n  }\n\n  /** Creates a new AnonymousInProcessSocketAddress. */\n  public AnonymousInProcessSocketAddress() { }\n\n  @Nullable\n  synchronized InProcessServer getServer() {\n    return server;\n  }\n\n  synchronized void setServer(InProcessServer server) throws IOException {\n    if (this.server != null) {\n      throw new IOException(\"Server instance already registered\");\n    }\n    this.server = server;\n  }\n\n  synchronized void clearServer(InProcessServer server) {\n    checkState(this.server == server);\n    this.server = null;\n  }\n}\n","sourceCodeStart":38,"sourceCodeEnd":66,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/inprocess/src/main/java/io/grpc/inprocess/AnonymousInProcessSocketAddress.java#L38-L66","documentation":"An AnonymousInProcessSocketAddress can hold exactly one InProcessServer instance. setServer throws IOException if a server is already registered on the address, preventing two servers from silently sharing one anonymous address.","triggerScenarios":"Calling setServer twice with different (or even repeated) server instances without clearing the first; starting a second InProcessServer on the same anonymous address.","commonSituations":"Reusing an anonymous address object for multiple server starts in tests; server restart logic that re-registers without clearServer; test helpers like setServerTwice.","solutions":["Create a fresh AnonymousInProcessSocketAddress for each server.","Call clearServer(previousServer) on the address before registering a new server.","Ensure each InProcessServerBuilder.forAddress(addr) is used for exactly one start()"],"exampleFix":"// before\naddr.setServer(server1);\naddr.setServer(server2); // IOException\n// after\naddr.setServer(server1);\naddr.clearServer(server1);\naddr.setServer(server2);","handlingStrategy":"validation","validationCode":"if (addr.getServer() != null) throw new IllegalStateException(\"address already has a server; create a new AnonymousInProcessSocketAddress\");","typeGuard":null,"tryCatchPattern":"try { server.start(); } catch (IOException e) { if (e.getMessage().contains(\"Server instance already registered\")) { addr = new AnonymousInProcessSocketAddress(); builder = InProcessServerBuilder.forAddress(addr); ... } }","preventionTips":["One server per anonymous address","Call clearServer before re-registering","Create fresh addresses per test/start"],"tags":["grpc","inprocess","server-registration"],"backgroundTag":"address-already-in-use","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}