{"record":{"id":"abbf7b9666774889","repo":"apache/hadoop","slug":"invalid-registration-no-nameservice-specified","errorCode":null,"errorMessage":"Invalid registration, no nameservice specified {}","messagePattern":"Invalid registration, no nameservice specified (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipState.java","lineNumber":246,"sourceCode":"\n  /**\n   * Check if the namenode is available.\n   *\n   * @return If the namenode is available.\n   */\n  public boolean isAvailable() {\n    return getState() == ACTIVE;\n  }\n\n  /**\n   * Validates the entry. Throws an IllegalArgementException if the data record\n   * is missing required information.\n   */\n  @Override\n  public void validate() {\n    super.validate();\n    if (getNameserviceId() == null || getNameserviceId().length() == 0) {\n      throw new IllegalArgumentException(\n          ERROR_MSG_NO_NS_SPECIFIED + this);\n    }\n    if (getWebAddress() == null || getWebAddress().length() == 0) {\n      throw new IllegalArgumentException(\n          ERROR_MSG_NO_WEB_ADDR_SPECIFIED + this);\n    }\n    if (getRpcAddress() == null || getRpcAddress().length() == 0) {\n      throw new IllegalArgumentException(\n          ERROR_MSG_NO_RPC_ADDR_SPECIFIED + this);\n    }\n    if (!isBadState() &&\n        (getBlockPoolId().isEmpty() || getBlockPoolId().length() == 0)) {\n      throw new IllegalArgumentException(\n          ERROR_MSG_NO_BP_SPECIFIED + this);\n    }\n  }\n\n","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/store/records/MembershipState.java#L228-L264","documentation":"MembershipState.validate() (which also calls BaseRecord.validate()) enforces that a membership registration carries a nameservice id; a null or empty getNameserviceId() throws IllegalArgumentException(ERROR_MSG_NO_NS_SPECIFIED + this). Memberships are keyed by nameservice, so a record without one cannot be stored or resolved. The record itself is appended to the message, showing exactly what was registered.","triggerScenarios":"A Namenode registration/heartbeat or a programmatic store.put of a MembershipState where the nameservice id was never set: resolver submitted a registration with blank nsId; test/tooling code built MembershipState.newInstance() and skipped setNameserviceId before validate/put.","commonSituations":"Custom federation tooling or tests constructing membership records directly; a heartbeat from a NN whose federation configuration lacks the nameservice mapping; state store migration inserting rows without the nsId column.","solutions":["If building MembershipState in code, set the nameservice id (plus rpc/web/block-pool fields) before put: record.setNameserviceId(nsId).","For real registrations, check the Namenode-side federation config: dfs.nameservices / federation resolver settings must give every NN a nameservice.","Inspect the record dump in the message — it shows the actual field values that were missing.","Remove malformed rows from the state store so clean heartbeats regenerate them."],"exampleFix":"// before\nMembershipState m = MembershipState.newInstance();\nm.setRpcAddress(\"nn1:8020\");\nstore.put(m); // throws: no nameservice specified\n\n// after: full registration record\nMembershipState m = MembershipState.newInstance();\nm.setNameserviceId(\"ns1\");\nm.setNamenodeId(\"nn1\");\nm.setRpcAddress(\"nn1:8020\");\nm.setWebAddress(\"nn1:9870\");\nm.setBlockPoolId(\"BP-1234\");\nstore.put(m);","handlingStrategy":"validation","validationCode":"// Validate registration completeness before storing\nMembershipState m = MembershipState.newInstance();\nm.setNameserviceId(nsId);\nif (m.getNameserviceId() == null || m.getNameserviceId().isEmpty()) {\n  throw new IllegalArgumentException(\"nameservice required before put()\");\n}","typeGuard":"boolean isCompleteMembership(MembershipState m) {\n  return m.getNameserviceId() != null && !m.getNameserviceId().isEmpty()\n      && m.getRpcAddress() != null && !m.getRpcAddress().isEmpty()\n      && m.getWebAddress() != null && !m.getWebAddress().isEmpty()\n      && m.getBlockPoolId() != null && !m.getBlockPoolId().isEmpty();\n}","tryCatchPattern":"try {\n  store.put(membership);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().contains(\"no nameservice specified\")) {\n    // registration source is broken: fix the heartbeat/resolver, don't retry the same record\n    throw new IllegalStateException(\"Incomplete registration: \" + e.getMessage(), e);\n  }\n  throw e;\n}","preventionTips":["Use isCompleteMembership-style checks in federation tooling before writing membership records.","Ensure every federated NN has dfs.nameservices/resolver config so heartbeats always carry nsId.","Never edit state store rows without replicating the full registration field set."],"tags":["hdfs","router-based-federation","state-store","membership","record-validation"],"backgroundTag":"invalid-service-registration","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}