{"record":{"id":"529cf9beba7ba2a9","repo":"apache/hadoop","slug":"state-store-does-not-have-an-interface-for","errorCode":null,"errorMessage":"State Store does not have an interface for {}","messagePattern":"State Store does not have an interface for (.+?)","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MembershipNamenodeResolver.java","lineNumber":120,"sourceCode":"      this.membershipInterface = getStoreInterface(MembershipStore.class);\n    }\n    return this.membershipInterface;\n  }\n\n  private synchronized DisabledNameserviceStore getDisabledNameserviceStore()\n      throws IOException {\n    if (this.disabledNameserviceInterface == null) {\n      this.disabledNameserviceInterface =\n          getStoreInterface(DisabledNameserviceStore.class);\n    }\n    return this.disabledNameserviceInterface;\n  }\n\n  private <T extends RecordStore<?>> T getStoreInterface(Class<T> clazz)\n      throws IOException{\n    T store = this.stateStore.getRegisteredRecordStore(clazz);\n    if (store == null) {\n      throw new IOException(\"State Store does not have an interface for \" +\n          clazz.getSimpleName());\n    }\n    return store;\n  }\n\n  @Override\n  public boolean loadCache(boolean force) {\n    // Our cache depends on the store, update it first\n    try {\n      MembershipStore membership = getMembershipStore();\n      if (!membership.loadCache(force)) {\n        return false;\n      }\n      DisabledNameserviceStore disabled = getDisabledNameserviceStore();\n      if (!disabled.loadCache(force)) {\n        return false;\n      }\n    } catch (IOException e) {","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MembershipNamenodeResolver.java#L102-L138","documentation":"MembershipNamenodeResolver lazily obtains typed record-store interfaces (MembershipStore, DisabledNameserviceStore, RouterStore) from the State Store via getRegisteredRecordStore(). This IOException means the State Store has no record store registered for the requested interface (clazz.getSimpleName()), so the resolver cannot read federation membership data — the store driver never registered that record type during State Store initialization.","triggerScenarios":"The state store driver (dfs.federation.router.store.driver) failed to initialize or does not register the record store in question; a custom/3rd-party driver missing the registration; or the resolver is used before the router's StateStoreService finished registering its stores.","commonSituations":"Misconfigured state store driver class or unreachable backend (ZooKeeper/DB) at registration time; routers starting while the state store is down; unit tests with mock state stores missing registrations; custom driver implementations that skip record registration.","solutions":["Verify dfs.federation.router.store.driver names a supported driver (StateStoreZooKeeperImpl, StateStoreFileSystemImpl, StateStoreFileImpl, StateStoreHBaseImpl, StateStoreDBImpl) and the backend is reachable","Check router startup logs for StateStoreService/record registration errors preceding this exception","Restart the router after fixing state store connectivity so stores re-register","For custom drivers, ensure every record store (membership, disabled nameservice, router) is registered during driver initialization"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before relying on the resolver, verify the record store registered\nStateStore store = router.getStateStore();\nif (store.getRegisteredRecordStore(MembershipStore.class) == null) {\n  throw new IOException(\n      \"State store driver did not register MembershipStore; \"\n          + \"check dfs.federation.router.store.driver and backend connectivity\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Smoke-test state store connectivity before deploying router config changes","Use built-in drivers; register all record stores in custom driver implementations","Watch router startup logs for record-store registration lines before sending traffic"],"tags":["hadoop","rbf","state-store","resolver","configuration","startup"],"backgroundTag":"store-interface-not-registered","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}