{"record":{"id":"f47d6f89850260ec","repo":"apache/hadoop","slug":"operation-is-not-supported","errorCode":null,"errorMessage":"Operation \"{}\" is not supported","messagePattern":"Operation \"(.+?)\" is not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"warning","filePath":"hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClientProtocol.java","lineNumber":1259,"sourceCode":"    RemoteMethod method = new RemoteMethod(\"refreshNodes\", new Class<?>[] {});\n    final Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();\n    rpcClient.invokeConcurrent(nss, method, true, true);\n  }\n\n  @Override\n  public void finalizeUpgrade() throws IOException {\n    rpcServer.checkOperation(NameNode.OperationCategory.UNCHECKED);\n\n    RemoteMethod method = new RemoteMethod(\"finalizeUpgrade\",\n        new Class<?>[] {});\n    final Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();\n    rpcClient.invokeConcurrent(nss, method, true, false);\n  }\n\n  @Override\n  public boolean upgradeStatus() throws IOException {\n    String methodName = RouterRpcServer.getMethodName();\n    throw new UnsupportedOperationException(\n        \"Operation \\\"\" + methodName + \"\\\" is not supported\");\n  }\n\n  @Override\n  public RollingUpgradeInfo rollingUpgrade(HdfsConstants.RollingUpgradeAction action)\n      throws IOException {\n    rpcServer.checkOperation(NameNode.OperationCategory.READ);\n\n    RemoteMethod method = new RemoteMethod(\"rollingUpgrade\",\n        new Class<?>[] {HdfsConstants.RollingUpgradeAction.class}, action);\n    final Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();\n    Map<FederationNamespaceInfo, RollingUpgradeInfo> ret =\n        rpcClient.invokeConcurrent(\n            nss, method, true, false, RollingUpgradeInfo.class);\n\n    // Return the first rolling upgrade info\n    RollingUpgradeInfo info = null;\n    for (RollingUpgradeInfo infoNs : ret.values()) {","sourceCodeStart":1241,"sourceCodeEnd":1277,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/RouterClientProtocol.java#L1241-L1277","documentation":"RouterClientProtocol.upgradeStatus() throws UnsupportedOperationException naming the intercepted method. The Router implements most ClientProtocol methods by proxying, but upgradeStatus is in the UNSUPPORTED set: router-side upgrade status has no federated semantics (each nameserver upgrades independently), so the Router refuses it explicitly. finalizeUpgrade, by contrast, fans out to all namespaces.","triggerScenarios":"A management client or HA tooling invoking upgradeStatus through the Router's client RPC port; scripts mixing NameNode admin RPCs against an RBF endpoint; version upgrade checkers probing upgradeStatus on every endpoint they discover.","commonSituations":"Operators reuse NameNode health-check scripts against Router addresses; rolling-upgrade automation probing all ClientProtocol endpoints; SDKs calling upgradeStatus generically.","solutions":["Target upgradeStatus at each underlying NameNode, not the Router","Remove/guard the upgradeStatus call in scripts that talk to RBF endpoints","Use the Router's supported admin surface (e.g. finalizeUpgrade fans out; rollingUpgrade proxies) instead"],"exampleFix":"# before: fails against Router\nhdfs dfsadmin -fs hdfs://router -upgradeStatus   # conceptually\n\n# after: query each subcluster NameNode\nhdfs dfsadmin -fs hdfs://ns1 -upgradeStatus","handlingStrategy":"try-catch","validationCode":"// Route upgrade status queries to NameNodes, not the Router\nif (uriPointsAtRouter(conf)) {\n  throw new UnsupportedOperationException(\"upgradeStatus unsupported via Router; query each NameNode\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  clientProtocol.upgradeStatus();\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"upgradeStatus\")) {\n    // expected on RBF: query each underlying NameNode for its upgrade status\n  } else { throw e; }\n}","preventionTips":["Point HA/rolling-upgrade scripts at NameNode RPC addresses for upgrade status","Maintain an allowlist of Router-supported ClientProtocol methods for admin tooling"],"tags":["hdfs","router-based-federation","upgrade","unsupported-operation","admin"],"backgroundTag":"unsupported-operation","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}