HDFS-15579. RBF: The constructor of PathLocation may got some misunderstanding. Contributed by Janus Chow.
diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MultipleDestinationMountTableResolver.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MultipleDestinationMountTableResolver.java
index b09a883..752f5c9 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MultipleDestinationMountTableResolver.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/MultipleDestinationMountTableResolver.java
@@ -99,8 +99,9 @@
 
         // Change the order of the name spaces according to the policy
         if (firstNamespace != null) {
-          // This is the entity in the tree, we need to create our own copy
-          mountTableResult = new PathLocation(mountTableResult, firstNamespace);
+          // Create our own prioritized copy based on the entity in the tree.
+          mountTableResult = PathLocation.prioritizeDestination(
+              mountTableResult, firstNamespace);
           LOG.debug("Ordered locations following {} are {}",
               order, mountTableResult);
         } else {
diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/PathLocation.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/PathLocation.java
index cb04ff8..44856cb 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/PathLocation.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/server/federation/resolver/PathLocation.java
@@ -87,6 +87,7 @@
    * @param other Other path location to copy from.
    * @param firstNsId Identifier of the namespace to place first.
    */
+  @Deprecated
   public PathLocation(PathLocation other, String firstNsId) {
     this.sourcePath = other.sourcePath;
     this.destOrder = other.destOrder;
@@ -94,6 +95,21 @@
   }
 
   /**
+   * Return a path location with the prioritized destinations based on
+   * the current path location.
+   *
+   * @param base The base path location we'd like to prioritize on.
+   * @param firstNsId Identifier of the namespace to place first.
+   */
+  public static PathLocation prioritizeDestination(
+      PathLocation base, String firstNsId) {
+    List<RemoteLocation> prioritizedDestinations = orderedNamespaces(
+        base.destinations, firstNsId);
+    return new PathLocation(base.sourcePath, prioritizedDestinations,
+        base.destOrder);
+  }
+
+  /**
    * Prioritize a location/destination by its name space/nameserviceId.
    * This destination might be used by other threads, so the source is not
    * modifiable.
diff --git a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestMultipleDestinationResolver.java b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestMultipleDestinationResolver.java
index 3915c56..c4b211c 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestMultipleDestinationResolver.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-rbf/src/test/java/org/apache/hadoop/hdfs/server/federation/resolver/TestMultipleDestinationResolver.java
@@ -360,6 +360,15 @@
     assertEquals(3, destinations.size());
   }
 
+  @Test
+  public void testPrioritizeDestination() throws IOException {
+    PathLocation dest0 = resolver.getDestinationForPath("/hashall/file0.txt");
+    assertDest("subcluster0", dest0);
+    PathLocation prioritizedDest = PathLocation.prioritizeDestination(dest0,
+        "subcluster1");
+    assertDest("subcluster1", prioritizedDest);
+  }
+
   /**
    * Test that a path has files distributed across destinations evenly.
    * @param path Path to check.