Merge branch 'gerrit/trinity' into 'master'

Change-Id: Iaa525ccf3067e52a0b6a645d50dd94006fa11d54
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSAllTablesDataGeneratorDatasource.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSAllTablesDataGeneratorDatasource.java
index 82303fc..430ba36 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSAllTablesDataGeneratorDatasource.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSAllTablesDataGeneratorDatasource.java
@@ -64,6 +64,6 @@
 
     @Override
     protected AlgebricksAbsolutePartitionConstraint getLocations(IClusterStateManager csm) {
-        return new AlgebricksAbsolutePartitionConstraint(csm.getClusterLocations().getLocations());
+        return csm.getSortedClusterLocations();
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSSingleTableDataGeneratorDatasource.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSSingleTableDataGeneratorDatasource.java
index 458bff6..67319e3 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSSingleTableDataGeneratorDatasource.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/TPCDSSingleTableDataGeneratorDatasource.java
@@ -68,6 +68,6 @@
 
     @Override
     protected AlgebricksAbsolutePartitionConstraint getLocations(IClusterStateManager csm) {
-        return new AlgebricksAbsolutePartitionConstraint(csm.getClusterLocations().getLocations());
+        return csm.getSortedClusterLocations();
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
index 343a23d..ffa6c87 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
@@ -171,6 +171,11 @@
     AlgebricksAbsolutePartitionConstraint getClusterLocations();
 
     /**
+     * @return the constraint representing all the partitions of the cluster sorted by node name
+     */
+    AlgebricksAbsolutePartitionConstraint getSortedClusterLocations();
+
+    /**
      * @param excludePendingRemoval true, if the desired set shouldn't have pending removal nodes
      * @return the set of participant nodes
      */
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/abstracts/AbstractExternalInputStreamFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/abstracts/AbstractExternalInputStreamFactory.java
index a1d5d0a..ac8859b 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/abstracts/AbstractExternalInputStreamFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/abstracts/AbstractExternalInputStreamFactory.java
@@ -70,8 +70,8 @@
     public void configure(IServiceContext ctx, Map<String, String> configuration, IWarningCollector warningCollector,
             IExternalFilterEvaluatorFactory filterEvaluatorFactory) throws AlgebricksException, HyracksDataException {
         this.configuration = configuration;
-        this.partitionConstraint =
-                ((ICcApplicationContext) ctx.getApplicationContext()).getClusterStateManager().getClusterLocations();
+        this.partitionConstraint = ((ICcApplicationContext) ctx.getApplicationContext()).getClusterStateManager()
+                .getSortedClusterLocations();
         this.filterEvaluatorFactory = filterEvaluatorFactory;
     }
 
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/HDFSUtils.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/HDFSUtils.java
index a11a8dd..e92448c 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/HDFSUtils.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/HDFSUtils.java
@@ -252,7 +252,7 @@
     public static AlgebricksAbsolutePartitionConstraint getPartitionConstraints(IApplicationContext appCtx,
             AlgebricksAbsolutePartitionConstraint clusterLocations) {
         if (clusterLocations == null) {
-            return ((ICcApplicationContext) appCtx).getClusterStateManager().getClusterLocations();
+            return ((ICcApplicationContext) appCtx).getClusterStateManager().getSortedClusterLocations();
         }
         return clusterLocations;
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
index e9b6111..f6aa347 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
@@ -20,9 +20,7 @@
 
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.functions.FunctionSignature;
@@ -129,9 +127,9 @@
             AlgebricksAbsolutePartitionConstraint locations);
 
     protected AlgebricksAbsolutePartitionConstraint getLocations(IClusterStateManager csm) {
-        String[] allPartitions = csm.getClusterLocations().getLocations();
-        Set<String> ncs = new HashSet<>(Arrays.asList(allPartitions));
-        return new AlgebricksAbsolutePartitionConstraint(ncs.toArray(new String[ncs.size()]));
+        String[] sortedLocations = csm.getSortedClusterLocations().getLocations();
+        return new AlgebricksAbsolutePartitionConstraint(
+                Arrays.stream(sortedLocations).distinct().toArray(String[]::new));
     }
 
     protected IDataParserFactory createDataParserFactory() {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
index 4b36b20..0a10204 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
@@ -301,6 +301,13 @@
         return clusterPartitionConstraint;
     }
 
+    @Override
+    public synchronized AlgebricksAbsolutePartitionConstraint getSortedClusterLocations() {
+        String[] clone = getClusterLocations().getLocations().clone();
+        Arrays.sort(clone);
+        return new AlgebricksAbsolutePartitionConstraint(clone);
+    }
+
     private synchronized void resetClusterPartitionConstraint() {
         ArrayList<String> clusterActiveLocations = new ArrayList<>();
         for (ClusterPartition p : clusterPartitions.values()) {