grpc/grpc-java · error · IOException

Server instance already registered

Error message

Server instance already registered

What it means

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.

Solutions

  1. Create a fresh AnonymousInProcessSocketAddress for each server.
  2. Call clearServer(previousServer) on the address before registering a new server.
  3. Ensure each InProcessServerBuilder.forAddress(addr) is used for exactly one start()

Example fix

// before
addr.setServer(server1);
addr.setServer(server2); // IOException
// after
addr.setServer(server1);
addr.clearServer(server1);
addr.setServer(server2);
Defensive patterns

Strategy: validation

Validate before calling

if (addr.getServer() != null) throw new IllegalStateException("address already has a server; create a new AnonymousInProcessSocketAddress");

Try / catch

try { server.start(); } catch (IOException e) { if (e.getMessage().contains("Server instance already registered")) { addr = new AnonymousInProcessSocketAddress(); builder = InProcessServerBuilder.forAddress(addr); ... } }

Prevention

When it happens

Trigger: Calling setServer twice with different (or even repeated) server instances without clearing the first; starting a second InProcessServer on the same anonymous address.

Common situations: Reusing an anonymous address object for multiple server starts in tests; server restart logic that re-registers without clearServer; test helpers like setServerTwice.

Related errors


AI-assisted analysis of grpc/grpc-java@64daddc1f3 (2026-09-08). Data as JSON: /api/errors/0da4c7e565ae85cb. Report an issue: GitHub.

Appendix: source

Thrown at inprocess/src/main/java/io/grpc/inprocess/AnonymousInProcessSocketAddress.java:56

  @GuardedBy("this")
  @SuppressWarnings("serial")
  private InProcessServer server;

  private void writeObject(ObjectOutputStream out) throws IOException {
    throw new NotSerializableException("AnonymousInProcessSocketAddress is not serializable");
  }

  /** Creates a new AnonymousInProcessSocketAddress. */
  public AnonymousInProcessSocketAddress() { }

  @Nullable
  synchronized InProcessServer getServer() {
    return server;
  }

  synchronized void setServer(InProcessServer server) throws IOException {
    if (this.server != null) {
      throw new IOException("Server instance already registered");
    }
    this.server = server;
  }

  synchronized void clearServer(InProcessServer server) {
    checkState(this.server == server);
    this.server = null;
  }
}

View on GitHub (pinned to 64daddc1f3)