{"record":{"id":"f245ac0a8b14d26a","repo":"apache/hadoop","slug":"no-mount-point-for-s-f245ac","errorCode":null,"errorMessage":"No mount point for %s","messagePattern":"No mount point 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/router/async/RouterAsyncClientProtocol.java","lineNumber":1180,"sourceCode":"    return asyncReturn(boolean.class);\n  }\n\n  @Override\n  public Path getEnclosingRoot(String src) throws IOException {\n    final Path[] mountPath = new Path[1];\n    if (defaultNameServiceEnabled) {\n      mountPath[0] = new Path(\"/\");\n    }\n\n    if (subclusterResolver instanceof MountTableResolver) {\n      MountTableResolver mountTable = (MountTableResolver) subclusterResolver;\n      if (mountTable.getMountPoint(src) != null) {\n        mountPath[0] = new Path(mountTable.getMountPoint(src).getSourcePath());\n      }\n    }\n\n    if (mountPath[0] == null) {\n      throw new IOException(String.format(\"No mount point for %s\", src));\n    }\n\n    getEZForPath(src);\n    asyncApply((ApplyFunction<EncryptionZone, Path>)zone -> {\n      if (zone == null) {\n        return mountPath[0];\n      } else {\n        Path zonePath = new Path(zone.getPath());\n        return zonePath.depth() > mountPath[0].depth() ? zonePath : mountPath[0];\n      }\n    });\n    return asyncReturn(Path.class);\n  }\n\n  @Override\n  public Token<DelegationTokenIdentifier> getDelegationToken(Text renewer)\n      throws IOException {\n    rpcServer.checkOperation(NameNode.OperationCategory.WRITE, true);","sourceCodeStart":1162,"sourceCodeEnd":1198,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/router/async/RouterAsyncClientProtocol.java#L1162-L1198","documentation":"RouterAsyncClientProtocol.getEnclosingRoot computes the enclosing root of a path (mount point or deeper encryption zone) for clients like HFDS encryption tooling. It starts from the default-nameservice root if enabled (dfs.federation.router.default.nameservice.*), otherwise it relies on MountTableResolver.getMountPoint(src). If neither yields a mount path (resolver is not a MountTableResolver, or no mount entry covers src and no default nameservice is enabled), it throws IOException('No mount point for <src>').","triggerScenarios":"Calling getEnclosingRoot (e.g. 'hdfs crypto' flows via an async Router) for a path not covered by any mount-table entry while the default nameservice feature is disabled; using a subcluster resolver other than MountTableResolver (e.g. ConstantResolver/SingleResolver) which has no mount points.","commonSituations":"Encryption-zone tooling run through a Router whose mount table lacks an entry for the path; deployments with resolver class dfs.federation.router.subcluster.resolver set to a non-mount-table implementation; default nameservice disabled after an admin refactor.","solutions":["Add a mount entry covering the path (hdfs dfsrouteradmin -add /path ns1; -refresh)","Or enable the fallback root: set dfs.federation.router.default.nameservice.enabled=true and dfs.federation.router.default.nameservice=<ns> so '/' is the enclosing root","Ensure dfs.federation.router.subcluster.resolver=org.apache.hadoop.hdfs.server.federation.resolver.MountTableResolver if mount semantics are expected"],"exampleFix":"<!-- before -->\n<property>\n  <name>dfs.federation.router.subcluster.resolver</name>\n  <value>org.apache.hadoop.hdfs.server.federation.resolver.SubclusterResolverCustom</value>\n</property>\n\n<!-- after -->\n<property>\n  <name>dfs.federation.router.subcluster.resolver</name>\n  <value>org.apache.hadoop.hdfs.server.federation.resolver.MountTableResolver</value>\n</property>","handlingStrategy":"try-catch","validationCode":"// Precheck mount coverage before crypto/enclosing-root flows:\n// hdfs dfsrouteradmin -ls <path-prefix>\n// must show an entry covering the path, or enable default nameservice.","typeGuard":null,"tryCatchPattern":"catch (IOException e) {\n  if (e.getMessage().startsWith(\"No mount point for \")) {\n    // add a mount entry covering the path, or enable\n    // dfs.federation.router.default.nameservice.* on the Router\n  }\n}","preventionTips":["Enable the default nameservice fallback if clients expect a root-level enclosing path","Use MountTableResolver when encryption zones and enclosing-root semantics are required","Cover all client-facing top-level directories with explicit mount entries"],"tags":["hadoop","hdfs","rbf","mount-table","encryption-zone","path-resolution","async-rpc"],"backgroundTag":"unresolved-mount-path","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}