{"record":{"id":"dc5e0de54ff7b4f5","repo":"apache/hadoop","slug":"serverside-implements-the-following-requested","errorCode":null,"errorMessage":"Serverside implements {}. The following requested protocol is unknown: {}","messagePattern":"Serverside implements (.+?)\\. The following requested protocol is unknown: (.+?)","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/protocolPB/HAServiceProtocolServerSideTranslatorPB.java","lineNumber":190,"sourceCode":"        .setState(retState)\n        .setReadyToBecomeActive(s.isReadyToBecomeActive());\n    if (!s.isReadyToBecomeActive()) {\n      ret.setNotReadyReason(s.getNotReadyReason());\n    }\n    return ret.build();\n  }\n\n  @Override\n  public long getProtocolVersion(String protocol, long clientVersion)\n      throws IOException {\n    return RPC.getProtocolVersion(HAServiceProtocolPB.class);\n  }\n\n  @Override\n  public ProtocolSignature getProtocolSignature(String protocol,\n      long clientVersion, int clientMethodsHash) throws IOException {\n    if (!protocol.equals(RPC.getProtocolName(HAServiceProtocolPB.class))) {\n      throw new IOException(\"Serverside implements \" +\n          RPC.getProtocolName(HAServiceProtocolPB.class) +\n          \". The following requested protocol is unknown: \" + protocol);\n    }\n\n    return ProtocolSignature.getProtocolSignature(clientMethodsHash,\n        RPC.getProtocolVersion(HAServiceProtocolPB.class),\n        HAServiceProtocolPB.class);\n  }\n}\n","sourceCodeStart":172,"sourceCodeEnd":200,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/protocolPB/HAServiceProtocolServerSideTranslatorPB.java#L172-L200","documentation":"The server-side PB translator for HAServiceProtocol validates that the protocol name sent by the RPC client exactly matches org.apache.hadoop.ha.protocolPB.HAServiceProtocolPB. If the client asks for a different protocol FQCN, the server throws IOException stating what it implements versus what was requested. This is Hadoop's standard protocol negotiation guard and almost always means client/server jar mismatch or the wrong proxy type.","triggerScenarios":"An RPC client proxying to the HAServiceProtocol RPC server (NameNode service RPC address) but built against a different Hadoop version where the protobuf protocol class name differs; mixing hadoop-common jars of different versions on one classpath; sending ZKFCProtocol requests to an HAServiceProtocol endpoint.","commonSituations":"Client applications or custom tooling compiled against one Hadoop release talking to a cluster of another release; fat jars bundling an old hadoop-common; shaded plugins that relocated org.apache.hadoop classes.","solutions":["Align versions: make the client use the same hadoop-common/hadoop-hdfs artifacts as the server (check 'hadoop version' on both ends)","Inspect the client classpath for multiple hadoop-common*.jar versions and keep only one","Confirm you are creating the right proxy (HAServiceProtocol via HAServiceProtocolPB) for this endpoint"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// client-side sanity before RPC: ensure the protocol class resolves to the expected name\nString expected = \"org.apache.hadoop.ha.protocolPB.HAServiceProtocolPB\";\nif (!expected.equals(RPC.getProtocolName(HAServiceProtocolPB.class))) {\n  throw new IllegalStateException(\"unexpected hadoop-common on classpath\");\n}\n// and check versions on both ends: hadoop version","typeGuard":null,"tryCatchPattern":"try {\n  proxy = HAServiceHelper... // build RPC proxy\n} catch (IOException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"requested protocol is unknown\")) {\n    // client/server hadoop version skew - fail fast with a clear config error\n  }\n}","preventionTips":["Pin the exact hadoop-client version to the cluster's release in your build","Assert a single hadoop-common jar on the classpath in CI (dependency:enforce)","Avoid shading/relocating org.apache.hadoop in fat jars"],"tags":["hadoop","rpc","protocol","version-mismatch","ha"],"backgroundTag":"rpc-protocol-version-mismatch","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}