Browse Source

HDFS-17602. RBF: Fix mount point with SPACE order can not find the available namespace. (#6991). Contributed by Zhongkun Wu.

Reviewed-by: Jian Zhang <1361320460@qq.com>
Signed-off-by: He Xiaoqiao <hexiaoqiao@apache.org>
Alex 3 months ago
parent
commit
a487209990

+ 5 - 2
hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/order/AvailableSpaceResolver.java

@@ -29,6 +29,7 @@ import java.util.Random;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hdfs.server.federation.resolver.PathLocation;
+import org.apache.hadoop.hdfs.server.federation.resolver.RemoteLocation;
 import org.apache.hadoop.hdfs.server.federation.resolver.order.AvailableSpaceResolver.SubclusterAvailableSpace;
 import org.apache.hadoop.hdfs.server.federation.router.RBFConfigKeys;
 import org.apache.hadoop.hdfs.server.federation.router.Router;
@@ -116,8 +117,10 @@ public class AvailableSpaceResolver
   protected String chooseFirstNamespace(String path, PathLocation loc) {
     Map<String, SubclusterAvailableSpace> subclusterInfo =
         getSubclusterMapping();
-    List<SubclusterAvailableSpace> subclusterList = new LinkedList<>(
-        subclusterInfo.values());
+    List<SubclusterAvailableSpace> subclusterList = new LinkedList<>();
+    for (RemoteLocation dest : loc.getDestinations()) {
+      subclusterList.add(subclusterInfo.get(dest.getNameserviceId()));
+    }
     Collections.sort(subclusterList, comparator);
 
     return subclusterList.size() > 0 ? subclusterList.get(0).getNameserviceId()

+ 8 - 0
hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/order/TestAvailableSpaceResolver.java

@@ -229,4 +229,12 @@ public class TestAvailableSpaceResolver {
     }
     subclusters.clear();
   }
+
+  @Test
+  public void testChooseFirstNamespace() throws Exception {
+    MultipleDestinationMountTableResolver mountTableResolver =
+            mockAvailableSpaceResolver(1.0f);
+    PathLocation loc = mountTableResolver.getDestinationForPath("/space");
+    assertEquals("subcluster9", loc.getDefaultLocation().getNameserviceId());
+  }
 }