You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2020/04/21 11:43:39 UTC

[lucene-solr] branch jira/solr-12845 created (now 44b215d)

This is an automated email from the ASF dual-hosted git repository.

ab pushed a change to branch jira/solr-12845
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git.


      at 44b215d  SOLR-12845: Fix test failures. Expose the default policy by saving it on OverseerTriggerThread startup.

This branch includes the following new commits:

     new 8248589  SOLR-12845: Initial change based on Shalin's patch. Many tests are failing.
     new 04cb3e3  Merge branch 'master' into jira/solr-12845
     new 44b215d  SOLR-12845: Fix test failures. Expose the default policy by saving it on OverseerTriggerThread startup.

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[lucene-solr] 03/03: SOLR-12845: Fix test failures. Expose the default policy by saving it on OverseerTriggerThread startup.

Posted by ab...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ab pushed a commit to branch jira/solr-12845
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 44b215da2715fed45812305b9d6892b560590fdd
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Tue Apr 21 13:42:31 2020 +0200

    SOLR-12845: Fix test failures. Expose the default policy by saving it on
    OverseerTriggerThread startup.
---
 .../java/org/apache/solr/cloud/api/collections/Assign.java  |  2 +-
 .../solr/cloud/autoscaling/OverseerTriggerThread.java       | 13 ++++++++++++-
 .../org/apache/solr/cloud/autoscaling/TestPolicyCloud.java  |  3 +++
 .../solr/cloud/autoscaling/sim/TestSimPolicyCloud.java      |  3 +++
 .../apache/solr/cloud/autoscaling/sim/TestSimScenario.java  |  1 +
 .../apache/solr/client/solrj/cloud/autoscaling/Policy.java  | 11 ++++++++---
 .../solr/client/solrj/cloud/autoscaling/Suggestion.java     |  5 +----
 .../solrj/solr/autoscaling/testSuggestionsRebalance2.json   |  3 ++-
 .../solr/client/solrj/cloud/autoscaling/TestPolicy2.java    |  3 +--
 9 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
index 90e4902..19f2131 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
@@ -300,7 +300,7 @@ public class Assign {
     // do custom preferences exist
     if (!autoScalingConfig.getPolicy().hasEmptyPreferences()) return true;
     // does a cluster policy exist
-    if (!autoScalingConfig.getPolicy().hasEmptyClusterPolicy()) return true;
+    if (!autoScalingConfig.getPolicy().getClusterPolicy().isEmpty()) return true;
     // finally we check if the current collection has a policy
     return !collection.isPresent() || collection.get().getPolicyName() != null;
   }
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java
index 14bfb0b..540fae0 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/OverseerTriggerThread.java
@@ -33,6 +33,7 @@ import org.apache.solr.client.solrj.cloud.DistribStateManager;
 import org.apache.solr.client.solrj.cloud.autoscaling.AutoScalingConfig;
 import org.apache.solr.client.solrj.cloud.autoscaling.BadVersionException;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
+import org.apache.solr.client.solrj.cloud.autoscaling.Policy;
 import org.apache.solr.client.solrj.cloud.autoscaling.TriggerEventType;
 import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.SolrCloseable;
@@ -143,7 +144,8 @@ public class OverseerTriggerThread implements Runnable, SolrCloseable {
           break;
         }
         AutoScalingConfig autoScalingConfig = cloudManager.getDistribStateManager().getAutoScalingConfig();
-        AutoScalingConfig updatedConfig = withAutoAddReplicasTrigger(autoScalingConfig);
+        AutoScalingConfig updatedConfig = withDefaultPolicy(autoScalingConfig);
+        updatedConfig = withAutoAddReplicasTrigger(updatedConfig);
         updatedConfig = withScheduledMaintenanceTrigger(updatedConfig);
         if (updatedConfig.equals(autoScalingConfig)) break;
         log.debug("Adding .auto_add_replicas and .scheduled_maintenance triggers");
@@ -343,6 +345,15 @@ public class OverseerTriggerThread implements Runnable, SolrCloseable {
     }
   }
 
+  private AutoScalingConfig withDefaultPolicy(AutoScalingConfig autoScalingConfig) {
+    Policy policy = autoScalingConfig.getPolicy();
+    if (policy.hasEmptyClusterPolicy()) {
+      policy = policy.withClusterPolicy(Policy.DEFAULT_CLUSTER_POLICY);
+      autoScalingConfig = autoScalingConfig.withPolicy(policy);
+    }
+    return autoScalingConfig;
+  }
+
   private AutoScalingConfig withAutoAddReplicasTrigger(AutoScalingConfig autoScalingConfig) {
     Map<String, Object> triggerProps = AutoScaling.AUTO_ADD_REPLICAS_TRIGGER_PROPS;
     return withDefaultTrigger(triggerProps, autoScalingConfig);
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
index 18cc270..c8dbfbe 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
@@ -85,6 +85,9 @@ public class TestPolicyCloud extends SolrCloudTestCase {
     cluster.deleteAllCollections();
     cluster.getSolrClient().getZkStateReader().getZkClient().setData(ZkStateReader.SOLR_AUTOSCALING_CONF_PATH,
         "{}".getBytes(StandardCharsets.UTF_8), true);
+    // remove default policy
+    String commands =  "{set-cluster-policy : []}";
+    cluster.getSolrClient().request(AutoScalingRequest.create(SolrRequest.METHOD.POST, commands));
   }
 
   public void testCreateCollection() throws Exception  {
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimPolicyCloud.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimPolicyCloud.java
index 36c94a0..c5af182 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimPolicyCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimPolicyCloud.java
@@ -63,6 +63,9 @@ public class TestSimPolicyCloud extends SimSolrCloudTestCase {
   @Before
   public void setupCluster() throws Exception {
     configureCluster(5, TimeSource.get("simTime:50"));
+    // reset autoscaling policy to empty
+    String commands =  "{set-cluster-policy : []}";
+    cluster.simGetSolrClient().request(AutoScalingRequest.create(SolrRequest.METHOD.POST, commands));
   }
   
   @After
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimScenario.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimScenario.java
index 2a0e6c5..e08999b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimScenario.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimScenario.java
@@ -64,6 +64,7 @@ public class TestSimScenario extends SimSolrCloudTestCase {
 
   String testSuggestionsScenario =
       "create_cluster numNodes=2\n" +
+      "load_autoscaling json={'cluster-policy':[]}\n" +
       "solr_request /admin/collections?action=CREATE&autoAddReplicas=true&name=testCollection&numShards=2&replicationFactor=2&maxShardsPerNode=2\n" +
       "wait_collection collection=testCollection&shards=2&replicas=2\n" +
       "ctx_set key=myNode&value=${_random_node_}\n" +
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java
index d538f12..a1294c1 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java
@@ -86,7 +86,7 @@ public class Policy implements MapWriter {
           new Preference((Map<String, Object>) Utils.fromJSONString("{minimize : cores, precision:1}")),
           new Preference((Map<String, Object>) Utils.fromJSONString("{maximize : freedisk}"))));
 
-  public static final List<Map<String, Object>> DEFAULT_CLUSTER_POLICY = Collections.unmodifiableList(
+  public static final List<Map<String, Object>> DEFAULT_CLUSTER_POLICY_JSON = Collections.unmodifiableList(
       Arrays.asList(
           Utils.makeMap("replica","<2", "shard","#EACH", "node", "#ANY", "strict", "false"),
           Utils.makeMap("replica", "#EQUAL", "node", "#ANY", "strict", "false"),
@@ -94,6 +94,10 @@ public class Policy implements MapWriter {
       )
   );
 
+  public static final List<Clause> DEFAULT_CLUSTER_POLICY = DEFAULT_CLUSTER_POLICY_JSON.stream()
+      .map(Clause::create)
+      .collect(collectingAndThen(toList(), Collections::unmodifiableList));
+
   /**
    * These parameters are always fetched for all nodes regardless of whether they are used in preferences or not
    */
@@ -152,7 +156,8 @@ public class Policy implements MapWriter {
     // if json map has CLUSTER_POLICY and even if its size is 0, we consider it as a custom cluster policy
     // and do not add the implicit policy clauses
     emptyClusterPolicy = !jsonMap.containsKey(CLUSTER_POLICY);
-    clusterPolicy = ((List<Map<String, Object>>) jsonMap.getOrDefault(CLUSTER_POLICY, DEFAULT_CLUSTER_POLICY)).stream()
+
+    clusterPolicy = ((List<Map<String, Object>>) jsonMap.getOrDefault(CLUSTER_POLICY, DEFAULT_CLUSTER_POLICY_JSON)).stream()
         .map(Clause::create)
         .filter(clause -> {
           clause.addTags(newParams);
@@ -162,7 +167,7 @@ public class Policy implements MapWriter {
 
     for (String newParam : new ArrayList<>(newParams)) {
       Type t = VariableBase.getTagType(newParam);
-      if(t != null && !t.associatedPerNodeValues.isEmpty()){
+      if(t != null && !t.associatedPerNodeValues.isEmpty()) {
         for (String s : t.associatedPerNodeValues) {
           if(!newParams.contains(s)) newParams.add(s);
         }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java
index 612eeec..dd83eb4 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java
@@ -67,10 +67,7 @@ public class Suggestion {
     }
 
     public boolean hasTimedOut() {
-      //nocommit
-      return false;
-      //return session.cloudManager.getTimeSource().getTimeNs() >= endTime;
-
+      return session.cloudManager.getTimeSource().getTimeNs() >= endTime;
     }
 
     public boolean needMore() {
diff --git a/solr/solrj/src/test-files/solrj/solr/autoscaling/testSuggestionsRebalance2.json b/solr/solrj/src/test-files/solrj/solr/autoscaling/testSuggestionsRebalance2.json
index 958efc0..d976303 100644
--- a/solr/solrj/src/test-files/solrj/solr/autoscaling/testSuggestionsRebalance2.json
+++ b/solr/solrj/src/test-files/solrj/solr/autoscaling/testSuggestionsRebalance2.json
@@ -127,4 +127,5 @@
         "minimize":"cores",
         "precision":1}
       ,{
-          "maximize":"freedisk"}]}}}
\ No newline at end of file
+          "maximize":"freedisk"}],
+      "cluster-policy": []}}}
\ No newline at end of file
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java b/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java
index f5cb060..63b7da4 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java
@@ -430,8 +430,7 @@ public class TestPolicy2 extends SolrTestCaseJ4 {
     AutoScalingConfig autoScalingConfig = new AutoScalingConfig((Map<String, Object>) getObjectByPath(m, false, "diagnostics/config"));
     List<Suggester.SuggestionInfo> suggestions = PolicyHelper.getSuggestions(autoScalingConfig, cloudManagerFromDiagnostics);
 
-    // nocommit 3->2
-    assertEquals(2, suggestions.size());
+    assertEquals(3, suggestions.size());
 
     for (Suggester.SuggestionInfo suggestion : suggestions) {
       assertEquals("improvement", suggestion._get("type", null));


[lucene-solr] 01/03: SOLR-12845: Initial change based on Shalin's patch. Many tests are failing.

Posted by ab...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ab pushed a commit to branch jira/solr-12845
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 8248589a4c03ffa08c20993d58159c79b7ac6e6a
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Thu Apr 2 17:19:19 2020 +0200

    SOLR-12845: Initial change based on Shalin's patch. Many tests are failing.
---
 .../apache/solr/cloud/api/collections/Assign.java  |  4 +--
 .../org/apache/solr/cloud/TestUtilizeNode.java     |  8 ++----
 .../cloud/autoscaling/sim/TestSimLargeCluster.java |  2 ++
 .../client/solrj/cloud/autoscaling/Clause.java     |  5 ++--
 .../client/solrj/cloud/autoscaling/Policy.java     | 32 ++++++++++++++++++++--
 .../client/solrj/cloud/autoscaling/Suggestion.java |  4 ++-
 .../client/solrj/cloud/autoscaling/TestPolicy.java | 29 ++++++++++++++++++--
 .../solrj/cloud/autoscaling/TestPolicy2.java       |  3 +-
 8 files changed, 69 insertions(+), 18 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
index cf47ab4..90e4902 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
@@ -298,9 +298,9 @@ public class Assign {
     // if no autoscaling configuration exists then obviously we cannot use the policy framework
     if (autoScalingConfig.getPolicy().isEmpty()) return false;
     // do custom preferences exist
-    if (!autoScalingConfig.getPolicy().isEmptyPreferences()) return true;
+    if (!autoScalingConfig.getPolicy().hasEmptyPreferences()) return true;
     // does a cluster policy exist
-    if (!autoScalingConfig.getPolicy().getClusterPolicy().isEmpty()) return true;
+    if (!autoScalingConfig.getPolicy().hasEmptyClusterPolicy()) return true;
     // finally we check if the current collection has a policy
     return !collection.isPresent() || collection.get().getPolicyName() != null;
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java b/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java
index e51263a..96d7704 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestUtilizeNode.java
@@ -72,12 +72,12 @@ public class TestUtilizeNode extends SolrCloudTestCase {
 
   @Test
   public void test() throws Exception {
-    int REPLICATION = 2;
+    cluster.waitForAllNodes(5);
     String coll = "utilizenodecoll";
     CloudSolrClient cloudClient = cluster.getSolrClient();
     
     log.info("Creating Collection...");
-    CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(coll, "conf1", 2, REPLICATION)
+    CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(coll, "conf1", 2, 2)
         .setMaxShardsPerNode(2);
     cloudClient.request(create);
 
@@ -129,10 +129,6 @@ public class TestUtilizeNode extends SolrCloudTestCase {
     cloudClient.request(new CollectionAdminRequest.UtilizeNode(jettyY.getNodeName()));
 
     assertSomeReplicas("jettyY should now be utilized: ", coll, jettyY);
-    
-    assertNoReplicas("jettyX should no longer be utilized: ", coll, jettyX); 
-    
-
   }
 
   /**
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimLargeCluster.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimLargeCluster.java
index adf2e67..2efcaeb 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimLargeCluster.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/sim/TestSimLargeCluster.java
@@ -297,6 +297,8 @@ public class TestSimLargeCluster extends SimSolrCloudTestCase {
   }
   
   @Test
+  // impossible to complete due to the slowness of policy calculations
+  @AwaitsFix( bugUrl = "https://issues.apache.org/jira/browse/SOLR-14275")
   public void testAddNode() throws Exception {
     SolrClient solrClient = cluster.simGetSolrClient();
     assertAutoScalingRequest
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Clause.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Clause.java
index f12ecce..68d30b5 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Clause.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Clause.java
@@ -117,7 +117,7 @@ public class Clause implements MapWriter, Comparable<Clause> {
     Optional<String> globalTagName = m.keySet().stream().filter(Policy.GLOBAL_ONLY_TAGS::contains).findFirst();
     if (globalTagName.isPresent()) {
       globalTag = parse(globalTagName.get(), m);
-      if (m.size() > 2) {
+      if (m.size() > 3) {
         throw new RuntimeException("Only one extra tag supported for the tag " + globalTagName.get() + " in " + toJSONString(m));
       }
       tag = parse(m.keySet().stream()
@@ -677,7 +677,8 @@ public class Clause implements MapWriter, Comparable<Clause> {
       for (Row r : session.matrix) {
         computedValueEvaluator.node = r.node;
         SealedClause sealedClause = getSealedClause(computedValueEvaluator);
-        if (!sealedClause.getGlobalTag().isPass(r)) {
+        // check only live nodes
+        if (r.isLive() && !sealedClause.getGlobalTag().isPass(r)) {
           ctx.resetAndAddViolation(r.node, null, new Violation(sealedClause, null, null, r.node, r.getVal(sealedClause.globalTag.name),
               sealedClause.globalTag.delta(r.getVal(globalTag.name)), r.node));
           addViolatingReplicasForGroup(sealedClause.globalTag, computedValueEvaluator, ctx, Type.CORES.tagName, r.node, ctx.currentViolation, session.matrix);
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java
index 39237dd..d538f12 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Policy.java
@@ -86,6 +86,14 @@ public class Policy implements MapWriter {
           new Preference((Map<String, Object>) Utils.fromJSONString("{minimize : cores, precision:1}")),
           new Preference((Map<String, Object>) Utils.fromJSONString("{maximize : freedisk}"))));
 
+  public static final List<Map<String, Object>> DEFAULT_CLUSTER_POLICY = Collections.unmodifiableList(
+      Arrays.asList(
+          Utils.makeMap("replica","<2", "shard","#EACH", "node", "#ANY", "strict", "false"),
+          Utils.makeMap("replica", "#EQUAL", "node", "#ANY", "strict", "false"),
+          Utils.makeMap("cores", "#EQUAL", "node","#ANY", "strict", "false")
+      )
+  );
+
   /**
    * These parameters are always fetched for all nodes regardless of whether they are used in preferences or not
    */
@@ -107,6 +115,12 @@ public class Policy implements MapWriter {
    */
   private final boolean emptyPreferences;
 
+  /**
+   * True if cluster policy was originally empty, false otherwise. It is used to figure out if the
+   * current policy was implicitly added or not.
+   */
+  final boolean emptyClusterPolicy;
+
   public Policy() {
     this(Collections.emptyMap());
   }
@@ -134,7 +148,11 @@ public class Policy implements MapWriter {
     final SortedSet<String> paramsOfInterest = new TreeSet<>(DEFAULT_PARAMS_OF_INTEREST);
     clusterPreferences.forEach(preference -> paramsOfInterest.add(preference.name.toString()));
     List<String> newParams = new ArrayList<>(paramsOfInterest);
-    clusterPolicy = ((List<Map<String, Object>>) jsonMap.getOrDefault(CLUSTER_POLICY, emptyList())).stream()
+
+    // if json map has CLUSTER_POLICY and even if its size is 0, we consider it as a custom cluster policy
+    // and do not add the implicit policy clauses
+    emptyClusterPolicy = !jsonMap.containsKey(CLUSTER_POLICY);
+    clusterPolicy = ((List<Map<String, Object>>) jsonMap.getOrDefault(CLUSTER_POLICY, DEFAULT_CLUSTER_POLICY)).stream()
         .map(Clause::create)
         .filter(clause -> {
           clause.addTags(newParams);
@@ -173,6 +191,7 @@ public class Policy implements MapWriter {
     this.empty = policies == null && clusterPolicy == null && clusterPreferences == null;
     this.zkVersion = version;
     this.policies = policies != null ? Collections.unmodifiableMap(policies) : Collections.emptyMap();
+    this.emptyClusterPolicy = clusterPolicy == null;
     this.clusterPolicy = clusterPolicy != null ? Collections.unmodifiableList(clusterPolicy) : Collections.emptyList();
     this.emptyPreferences = clusterPreferences == null;
     this.clusterPreferences = emptyPreferences ? DEFAULT_PREFERENCES : Collections.unmodifiableList(clusterPreferences);
@@ -240,7 +259,7 @@ public class Policy implements MapWriter {
         for (Preference p : clusterPreferences) iw.add(p);
       });
     }
-    if (!clusterPolicy.isEmpty()) {
+    if (!emptyClusterPolicy) {
       ew.put(CLUSTER_POLICY, (IteratorWriter) iw -> {
         for (Clause c : clusterPolicy) {
           iw.add(c);
@@ -503,10 +522,17 @@ public class Policy implements MapWriter {
   /**
    * @return true if no preferences were specified by the user, false otherwise
    */
-  public boolean isEmptyPreferences() {
+  public boolean hasEmptyPreferences() {
     return emptyPreferences;
   }
 
+  /**
+   * @return true if no cluster policy was specified by the user, false otherwise
+   */
+  public boolean hasEmptyClusterPolicy() {
+    return emptyClusterPolicy;
+  }
+
   /*This stores the logical state of the system, given a policy and
    * a cluster state.
    *
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java
index ae67e44..612eeec 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggestion.java
@@ -67,7 +67,9 @@ public class Suggestion {
     }
 
     public boolean hasTimedOut() {
-      return session.cloudManager.getTimeSource().getTimeNs() >= endTime;
+      //nocommit
+      return false;
+      //return session.cloudManager.getTimeSource().getTimeNs() >= endTime;
 
     }
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy.java b/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy.java
index 35c969c..9c47ecf 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy.java
@@ -76,6 +76,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.solr.client.solrj.cloud.autoscaling.Policy.CLUSTER_POLICY;
 import static org.apache.solr.client.solrj.cloud.autoscaling.Policy.CLUSTER_PREFERENCES;
 import static org.apache.solr.client.solrj.cloud.autoscaling.TestPolicy2.loadFromResource;
 import static org.apache.solr.client.solrj.cloud.autoscaling.Variable.Type.CORES;
@@ -1303,6 +1304,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
     Map<String, Map> nodeValues = (Map<String, Map>) Utils.fromJSONString("{" +
         "node1:{cores:2}," +
         "node3:{cores:4}" +
+        "node2:{cores:2}" +
         "}");
     Policy policy = new Policy(new HashMap<>());
     Suggester suggester = policy.createSession(getSolrCloudManager(nodeValues,
@@ -1310,7 +1312,8 @@ public class TestPolicy extends SolrTestCaseJ4 {
         .getSuggester(MOVEREPLICA)
         .hint(Hint.COLL, "collection1")
         .hint(Hint.COLL, "collection2")
-        .hint(Suggester.Hint.SRC_NODE, "node2");
+        .hint(Suggester.Hint.SRC_NODE, "node2")
+        .forceOperation(true);
     SolrRequest op = suggester.getSuggestion();
     assertNotNull(op);
     assertEquals("collection2", op.getParams().get("collection"));
@@ -1322,7 +1325,8 @@ public class TestPolicy extends SolrTestCaseJ4 {
         .getSuggester(MOVEREPLICA)
         .hint(Hint.COLL, "collection1")
         .hint(Hint.COLL, "collection2")
-        .hint(Suggester.Hint.SRC_NODE, "node2");
+        .hint(Suggester.Hint.SRC_NODE, "node2")
+        .forceOperation(true);
     op = suggester.getSuggestion();
     assertNotNull(op);
     assertEquals("collection2", op.getParams().get("collection"));
@@ -2049,7 +2053,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
   }
 
   public void testEmptyClusterState() {
-    String autoScaleJson = " {'policies':{'c1':[{" +
+    String autoScaleJson = " {'cluster-policy':[], 'policies':{'c1':[{" +
         "        'replica':1," +
         "        'shard':'#EACH'," +
         "        'port':'50096'}]}}";
@@ -3088,5 +3092,24 @@ public class TestPolicy extends SolrTestCaseJ4 {
     // since the user explicitly added those preferences, they should be written by MapWriter
     assertEquals(1, writtenKeys.size());
     assertTrue(writtenKeys.contains(CLUSTER_PREFERENCES));
+
+    // reset
+    writtenKeys.clear();
+    // now we create a cluster policy that is intentionally empty which should prevent the implicit
+    // cluster policy from being written but should emit an empty key/val pair for cluster policy
+    policy = new Policy(Utils.makeMap(CLUSTER_POLICY, Collections.emptyList()));
+    // sanity checks
+    assertFalse(policy.isEmpty());
+    assertTrue(policy.hasEmptyPreferences());
+    assertFalse(policy.hasEmptyClusterPolicy());
+    policy.writeMap(new MapWriter.EntryWriter() {
+      @Override
+      public MapWriter.EntryWriter put(CharSequence k, Object v) throws IOException {
+        writtenKeys.add(k.toString());
+        return this;
+      }
+    });
+    assertEquals(1, writtenKeys.size());
+    assertTrue(writtenKeys.contains(CLUSTER_POLICY));
   }
 }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java b/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java
index 63b7da4..f5cb060 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/cloud/autoscaling/TestPolicy2.java
@@ -430,7 +430,8 @@ public class TestPolicy2 extends SolrTestCaseJ4 {
     AutoScalingConfig autoScalingConfig = new AutoScalingConfig((Map<String, Object>) getObjectByPath(m, false, "diagnostics/config"));
     List<Suggester.SuggestionInfo> suggestions = PolicyHelper.getSuggestions(autoScalingConfig, cloudManagerFromDiagnostics);
 
-    assertEquals(3, suggestions.size());
+    // nocommit 3->2
+    assertEquals(2, suggestions.size());
 
     for (Suggester.SuggestionInfo suggestion : suggestions) {
       assertEquals("improvement", suggestion._get("type", null));


[lucene-solr] 02/03: Merge branch 'master' into jira/solr-12845

Posted by ab...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ab pushed a commit to branch jira/solr-12845
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 04cb3e35879fca0c7e5201f194515eb433b6da3d
Merge: 8248589 89e14fa
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Mon Apr 20 11:53:14 2020 +0200

    Merge branch 'master' into jira/solr-12845

 .gitattributes                                     |   3 +
 .github/workflows/gradle-precommit.yml             |   2 +
 .github/workflows/gradle-wrapper-validation.yml    |  11 -
 build.gradle                                       |  24 +-
 .../apache/lucene/gradle/WrapperDownloader.java    | 129 ++++++
 dev-tools/doap/lucene.rdf                          |   7 +
 dev-tools/doap/solr.rdf                            |   7 +
 gradle/defaults-javadoc.gradle                     |  77 ----
 gradle/help.gradle                                 |   3 +-
 .../intellij-idea.gradle}                          |  24 ++
 gradle/jar-manifest.gradle                         |  82 ++++
 gradle/render-javadoc.gradle                       | 287 +++++++-----
 gradle/testing/randomization.gradle                |   9 -
 gradle/validation/forbidden-apis/defaults.all.txt  |   2 +-
 gradle/validation/git-status.gradle                |  39 +-
 gradle/validation/jar-checks.gradle                |   2 +-
 gradle/validation/missing-docs-check.gradle        |   4 +-
 gradle/validation/precommit.gradle                 |   4 +
 gradle/validation/validate-log-calls.gradle        | 239 ++++++++++
 gradle/wrapper/gradle-wrapper.jar                  | Bin 55616 -> 58702 bytes
 gradle/wrapper/gradle-wrapper.jar.sha256           |   1 +
 gradle/wrapper/gradle-wrapper.jar.version          |   1 +
 gradlew                                            |  10 +-
 gradlew.bat                                        |   9 +-
 help/ant.txt                                       |   2 +-
 help/validateLogCalls.txt                          |  50 +++
 lucene/CHANGES.txt                                 |  41 ++
 .../lucene/index/TestBackwardsCompatibility.java   |  33 +-
 .../org/apache/lucene/index/index.8.5.1-cfs.zip    | Bin 0 -> 15880 bytes
 .../org/apache/lucene/index/index.8.5.1-nocfs.zip  | Bin 0 -> 15872 bytes
 .../test/org/apache/lucene/index/sorted.8.5.1.zip  | Bin 0 -> 394412 bytes
 .../simpletext/SimpleTextCompoundFormat.java       |  31 +-
 .../simpletext/TestSimpleTextCompoundFormat.java   |   5 +
 .../apache/lucene/codecs/CompoundDirectory.java    |  83 ++++
 .../org/apache/lucene/codecs/CompoundFormat.java   |   4 +-
 .../lucene/codecs/MultiLevelSkipListReader.java    |   8 +-
 .../codecs/lucene50/Lucene50CompoundFormat.java    |   3 +-
 .../codecs/lucene50/Lucene50CompoundReader.java    |  49 +--
 .../codecs/perfield/PerFieldDocValuesFormat.java   |   3 +
 .../org/apache/lucene/index/BufferedUpdates.java   |  35 +-
 .../org/apache/lucene/index/DocumentsWriter.java   | 191 ++++----
 .../lucene/index/DocumentsWriterDeleteQueue.java   |  87 +++-
 .../lucene/index/DocumentsWriterFlushControl.java  | 438 ++++++++-----------
 .../lucene/index/DocumentsWriterPerThread.java     | 117 ++++-
 .../lucene/index/DocumentsWriterPerThreadPool.java | 290 +++++--------
 .../lucene/index/DocumentsWriterStallControl.java  |   5 +-
 .../lucene/index/FlushByRamOrCountsPolicy.java     |  26 +-
 .../java/org/apache/lucene/index/FlushPolicy.java  |  38 +-
 .../apache/lucene/index/FrozenBufferedUpdates.java |   4 +-
 .../java/org/apache/lucene/index/IndexWriter.java  |  65 +--
 .../org/apache/lucene/index/IndexWriterConfig.java |  22 -
 .../apache/lucene/index/LiveIndexWriterConfig.java |  16 -
 .../org/apache/lucene/index/ReadersAndUpdates.java |  44 +-
 .../org/apache/lucene/index/SegmentCommitInfo.java |  40 +-
 .../apache/lucene/index/SegmentCoreReaders.java    |   3 +-
 .../java/org/apache/lucene/index/SegmentInfos.java |  38 +-
 .../org/apache/lucene/index/SegmentMerger.java     |   2 +-
 .../org/apache/lucene/index/SegmentReader.java     |   8 +
 .../search/ControlledRealTimeReopenThread.java     |  18 +-
 .../apache/lucene/store/BufferedIndexInput.java    | 226 ++++------
 .../org/apache/lucene/store/NIOFSDirectory.java    |  34 +-
 .../src/java/org/apache/lucene/util/BitUtil.java   | 128 +-----
 .../src/java/org/apache/lucene/util/Version.java   |  14 +
 .../org/apache/lucene/util/fst/BitTableUtil.java   | 172 ++++++++
 .../src/java/org/apache/lucene/util/fst/FST.java   | 353 ++++++---------
 .../java/org/apache/lucene/util/fst/FSTEnum.java   |  17 +-
 .../java/org/apache/lucene/util/fst/NodeHash.java  |   2 +-
 .../src/java/org/apache/lucene/util/fst/Util.java  |  19 +-
 .../codecs/lucene60/TestLucene60PointsFormat.java  |  11 +-
 .../perfield/TestPerFieldDocValuesFormat.java      |  40 +-
 .../lucene/document/BaseXYShapeTestCase.java       |   4 +-
 .../apache/lucene/index/TestBufferedUpdates.java   |  57 +++
 .../src/test/org/apache/lucene/index/TestDoc.java  |   2 +-
 .../org/apache/lucene/index/TestFieldsReader.java  |   6 +-
 .../lucene/index/TestFlushByRamOrCountsPolicy.java |  82 ++--
 .../org/apache/lucene/index/TestIndexWriter.java   | 294 +++++++++++--
 .../apache/lucene/index/TestIndexWriterConfig.java |   1 -
 .../apache/lucene/index/TestIndexWriterDelete.java |   4 +-
 .../lucene/index/TestIndexWriterOnDiskFull.java    |   4 +-
 .../index/TestIndexWriterThreadsToSegments.java    |   4 +-
 .../lucene/index/TestIndexWriterWithThreads.java   |   2 +-
 .../lucene/index/TestNumericDocValuesUpdates.java  | 155 +++++++
 .../index/TestOneMergeWrappingMergePolicy.java     |   2 +-
 .../apache/lucene/index/TestPendingDeletes.java    |   6 +-
 .../lucene/index/TestPendingSoftDeletes.java       |   2 +-
 .../org/apache/lucene/index/TestSegmentInfos.java  |  39 +-
 .../org/apache/lucene/index/TestSegmentMerger.java |   2 +-
 .../search/TestControlledRealTimeReopenThread.java |   8 +-
 .../lucene/store/TestBufferedIndexInput.java       | 114 +----
 .../test/org/apache/lucene/util/TestBitUtil.java   |  87 ----
 .../apache/lucene/util/fst/TestBitTableUtil.java   | 138 ++++++
 .../lucene/util/fst/TestFSTDirectAddressing.java   |  85 +++-
 lucene/ivy-versions.properties                     |   4 +-
 .../jetty-continuation-9.4.24.v20191120.jar.sha1   |   1 -
 .../jetty-continuation-9.4.27.v20200227.jar.sha1   |   1 +
 .../licenses/jetty-http-9.4.24.v20191120.jar.sha1  |   1 -
 .../licenses/jetty-http-9.4.27.v20200227.jar.sha1  |   1 +
 lucene/licenses/jetty-io-9.4.24.v20191120.jar.sha1 |   1 -
 lucene/licenses/jetty-io-9.4.27.v20200227.jar.sha1 |   1 +
 .../jetty-server-9.4.24.v20191120.jar.sha1         |   1 -
 .../jetty-server-9.4.27.v20200227.jar.sha1         |   1 +
 .../jetty-servlet-9.4.24.v20191120.jar.sha1        |   1 -
 .../jetty-servlet-9.4.27.v20200227.jar.sha1        |   1 +
 .../licenses/jetty-util-9.4.24.v20191120.jar.sha1  |   1 -
 .../licenses/jetty-util-9.4.27.v20200227.jar.sha1  |   1 +
 .../apache/lucene/luke/models/util/IndexUtils.java |   6 +-
 .../luke/models/overview/OverviewImplTest.java     |   2 +-
 .../org/apache/lucene/index/IndexSplitter.java     |   2 +-
 .../java/org/apache/lucene/store/RAFDirectory.java |  18 +-
 .../org/apache/lucene/store/WindowsDirectory.java  |   5 +-
 .../apache/lucene/replicator/nrt/PrimaryNode.java  |   2 +-
 .../lucene/codecs/cranky/CrankyCompoundFormat.java |   3 +-
 .../lucene/index/BaseCompoundFormatTestCase.java   |  42 ++
 .../lucene/index/BaseIndexFileFormatTestCase.java  |  18 +-
 .../lucene/index/BaseLiveDocsFormatTestCase.java   |   4 +-
 .../lucene/index/BaseMergePolicyTestCase.java      |   6 +-
 .../org/apache/lucene/index/RandomIndexWriter.java |   4 +-
 .../apache/lucene/store/MockDirectoryWrapper.java  |  18 +-
 lucene/tools/forbiddenApis/base.txt                |   2 +-
 solr/CHANGES.txt                                   |  57 ++-
 solr/build.xml                                     |   2 +-
 .../apache/solr/analytics/facet/QueryFacet.java    |   8 +-
 .../apache/solr/analytics/facet/RangeFacet.java    |   8 +-
 .../stream/AnalyticsShardRequestManager.java       |   4 +-
 .../solr/analytics/util/OldAnalyticsParams.java    |  34 +-
 .../util/OldAnalyticsRequestConverter.java         |   4 +-
 .../analytics/legacy/facetWithDottedFields.txt     |  16 +
 .../solr/collection1/conf/schema-analytics.xml     |   2 +
 .../util/OldAnalyticsRequestConverterUnitTest.java |  64 +++
 .../java/org/apache/solr/ltr/feature/Feature.java  |  41 ++
 .../solr/ltr/feature/OriginalScoreFeature.java     |  23 +-
 .../org/apache/solr/ltr/feature/SolrFeature.java   | 201 +++------
 ...stOriginalScoreScorer.java => TestFeature.java} |  21 +-
 .../collector/SchedulerMetricsCollector.java       |   4 +-
 .../solr/prometheus/exporter/SolrExporter.java     |   6 +-
 .../prometheus/scraper/SolrCloudScraperTest.java   |   4 +-
 .../scraper/SolrStandaloneScraperTest.java         |   4 +-
 .../src/java/org/apache/solr/api/AnnotatedApi.java |   2 +-
 solr/core/src/java/org/apache/solr/api/ApiBag.java |   2 +-
 .../src/java/org/apache/solr/api/V2HttpCall.java   |  22 +-
 .../client/solrj/embedded/JettySolrRunner.java     |  15 +-
 .../src/java/org/apache/solr/cloud/Overseer.java   |   2 +-
 .../apache/solr/cloud/OverseerTaskProcessor.java   |   4 +-
 .../org/apache/solr/cloud/RecoveryStrategy.java    |   4 -
 .../java/org/apache/solr/cloud/SyncStrategy.java   |  34 +-
 .../java/org/apache/solr/cloud/ZkController.java   |  59 ++-
 .../OverseerCollectionMessageHandler.java          |   4 +-
 .../cloud/autoscaling/OverseerTriggerThread.java   |   9 +-
 .../solr/cloud/autoscaling/ScheduledTriggers.java  |   6 +-
 .../cloud/autoscaling/sim/SimCloudManager.java     |  13 +-
 .../autoscaling/sim/SimDistribStateManager.java    |   4 +-
 .../java/org/apache/solr/core/BlobRepository.java  |   4 +-
 .../apache/solr/core/CachingDirectoryFactory.java  |  32 +-
 .../src/java/org/apache/solr/core/CloudConfig.java |  25 +-
 .../org/apache/solr/core/ConfigSetProperties.java  |   4 +-
 .../org/apache/solr/core/ConfigSetService.java     |   2 +-
 .../java/org/apache/solr/core/CoreContainer.java   |  82 ++--
 .../apache/solr/core/CorePropertiesLocator.java    |  16 +-
 .../org/apache/solr/core/HdfsDirectoryFactory.java |  21 +-
 .../src/java/org/apache/solr/core/PluginBag.java   |  34 +-
 .../org/apache/solr/core/QuerySenderListener.java  |   2 +-
 .../java/org/apache/solr/core/RequestHandlers.java |   6 +-
 .../java/org/apache/solr/core/RequestParams.java   |   8 +-
 .../org/apache/solr/core/SchemaCodecFactory.java   |   4 +-
 .../src/java/org/apache/solr/core/SolrConfig.java  |  44 +-
 .../src/java/org/apache/solr/core/SolrCore.java    |  62 ++-
 .../src/java/org/apache/solr/core/SolrCores.java   |  10 +-
 .../org/apache/solr/core/SolrDeletionPolicy.java   |  12 +-
 .../src/java/org/apache/solr/core/SolrPaths.java   |   7 +-
 .../org/apache/solr/core/SolrResourceLoader.java   |  37 +-
 .../java/org/apache/solr/core/SolrXmlConfig.java   |   9 +-
 .../apache/solr/core/StandardDirectoryFactory.java |   2 +-
 .../solr/core/TransientSolrCoreCacheDefault.java   |   4 +-
 .../java/org/apache/solr/core/XmlConfigFile.java   |  12 +-
 .../src/java/org/apache/solr/core/ZkContainer.java |  28 +-
 .../solr/core/snapshots/SolrSnapshotManager.java   |   8 +-
 .../snapshots/SolrSnapshotMetaDataManager.java     |  14 +-
 .../solr/core/snapshots/SolrSnapshotsTool.java     |  15 +-
 .../apache/solr/filestore/DistribPackageStore.java |  13 +-
 .../org/apache/solr/filestore/PackageStoreAPI.java |   2 +-
 .../apache/solr/handler/CdcrReplicatorManager.java |   4 +-
 .../solr/handler/CdcrReplicatorScheduler.java      |   6 +-
 .../apache/solr/handler/CdcrRequestHandler.java    |   4 +-
 .../solr/handler/CdcrUpdateLogSynchronizer.java    |   4 +-
 .../java/org/apache/solr/handler/IndexFetcher.java |   4 +-
 .../apache/solr/handler/ReplicationHandler.java    |   6 +-
 .../org/apache/solr/handler/SolrConfigHandler.java |   4 +-
 .../org/apache/solr/handler/StreamHandler.java     |  14 +-
 .../solr/handler/admin/CoreAdminHandler.java       |   4 +-
 .../solr/handler/admin/HealthCheckHandler.java     |  76 +++-
 .../solr/handler/admin/MetricsHistoryHandler.java  |   4 +-
 .../solr/handler/admin/ZookeeperStatusHandler.java |  72 +++-
 .../solr/handler/component/ExpandComponent.java    |  13 +-
 .../handler/component/HttpShardHandlerFactory.java |  20 +-
 .../handler/component/IterativeMergeStrategy.java  |   4 +-
 .../solr/handler/tagger/TaggerRequestHandler.java  | 111 +++--
 .../solr/highlight/DefaultSolrHighlighter.java     |   6 +-
 .../java/org/apache/solr/logging/LogWatcher.java   |   8 +-
 .../org/apache/solr/logging/MDCLoggingContext.java |  78 ++--
 .../org/apache/solr/metrics/MetricSuppliers.java   |  10 +-
 .../java/org/apache/solr/metrics/MetricsMap.java   |   2 +-
 .../org/apache/solr/metrics/SolrMetricManager.java |  31 +-
 .../apache/solr/metrics/SolrMetricReporter.java    |   4 +-
 .../metrics/reporters/ReporterClientCache.java     |   4 +-
 .../solr/metrics/reporters/SolrJmxReporter.java    |   6 +-
 .../metrics/reporters/jmx/JmxMetricsReporter.java  |  20 +-
 .../reporters/solr/SolrClusterReporter.java        |   6 +-
 .../solr/metrics/reporters/solr/SolrReporter.java  |  10 +-
 .../metrics/reporters/solr/SolrShardReporter.java  |  16 +-
 .../apache/solr/metrics/rrd/SolrRrdBackend.java    |   2 +-
 .../solr/metrics/rrd/SolrRrdBackendFactory.java    |  24 +-
 .../packagemanager/DefaultPackageRepository.java   |   4 +-
 .../apache/solr/packagemanager/PackageManager.java |   2 +-
 .../src/java/org/apache/solr/pkg/PackageAPI.java   |   4 +-
 .../java/org/apache/solr/pkg/PackageListeners.java |   5 +-
 .../java/org/apache/solr/pkg/PackageLoader.java    |  10 +-
 .../org/apache/solr/pkg/PackagePluginHolder.java   |  10 +-
 .../java/org/apache/solr/request/SimpleFacets.java |  15 +-
 .../apache/solr/request/SolrRequestHandler.java    |   2 +-
 .../org/apache/solr/request/SolrRequestInfo.java   |   2 +-
 .../apache/solr/response/BinaryResponseWriter.java |   2 +-
 .../org/apache/solr/response/SchemaXmlWriter.java  |   2 +-
 .../java/org/apache/solr/response/XMLWriter.java   |   4 +-
 .../apache/solr/response/XSLTResponseWriter.java   |   2 +-
 .../java/org/apache/solr/rest/ManagedResource.java |  12 +-
 .../apache/solr/rest/ManagedResourceStorage.java   |  33 +-
 .../src/java/org/apache/solr/rest/RestManager.java |  21 +-
 .../analysis/ManagedSynonymFilterFactory.java      |   4 +-
 .../analysis/ManagedSynonymGraphFilterFactory.java |   4 +-
 .../schema/analysis/ManagedWordSetResource.java    |   7 +-
 .../solr/schema/AbstractSpatialFieldType.java      |   2 +-
 .../schema/AbstractSpatialPrefixTreeFieldType.java |   4 +-
 .../java/org/apache/solr/schema/BinaryField.java   |   2 +-
 .../solr/schema/ExternalFileFieldReloader.java     |   4 +-
 .../apache/solr/schema/FieldTypePluginLoader.java  |  19 +-
 .../java/org/apache/solr/schema/IndexSchema.java   |  47 +-
 .../apache/solr/schema/JsonPreAnalyzedParser.java  |  14 +-
 .../org/apache/solr/schema/ManagedIndexSchema.java |  73 ++--
 .../solr/schema/ManagedIndexSchemaFactory.java     |  50 +--
 .../solr/schema/OpenExchangeRatesOrgProvider.java  |  14 +-
 .../org/apache/solr/schema/PreAnalyzedField.java   |   8 +-
 .../java/org/apache/solr/schema/SchemaManager.java |   6 +-
 .../apache/solr/schema/ZkIndexSchemaReader.java    |  16 +-
 .../solr/search/CollapsingQParserPlugin.java       | 479 +++++++++------------
 .../java/org/apache/solr/search/DocSetUtil.java    |   8 +-
 .../src/java/org/apache/solr/search/Grouping.java  |  19 +-
 .../java/org/apache/solr/search/QueryUtils.java    |  32 +-
 .../apache/solr/search/SolrDocumentFetcher.java    |   6 +-
 .../org/apache/solr/search/SolrIndexSearcher.java  | 182 +++-----
 .../apache/solr/search/SurroundQParserPlugin.java  |   2 +-
 .../apache/solr/search/facet/AggValueSource.java   |   2 +-
 .../java/org/apache/solr/search/facet/AvgAgg.java  |   2 +-
 .../org/apache/solr/search/facet/CountAgg.java     |   2 +-
 .../org/apache/solr/search/facet/CountValsAgg.java |   2 +-
 .../solr/search/facet/FacetFieldProcessor.java     |  16 +-
 .../search/facet/FacetFieldProcessorByHashDV.java  |  24 +-
 .../org/apache/solr/search/facet/FacetHeatmap.java |   4 +-
 .../apache/solr/search/facet/FacetProcessor.java   |  14 +-
 .../org/apache/solr/search/facet/FacetRange.java   |   2 +-
 .../java/org/apache/solr/search/facet/HLLAgg.java  |   2 +-
 .../org/apache/solr/search/facet/MinMaxAgg.java    |   2 +-
 .../org/apache/solr/search/facet/MissingAgg.java   |   2 +-
 .../apache/solr/search/facet/PercentileAgg.java    |   2 +-
 .../apache/solr/search/facet/RelatednessAgg.java   |   2 +-
 .../java/org/apache/solr/search/facet/SlotAcc.java |  19 +-
 .../org/apache/solr/search/facet/StddevAgg.java    |   2 +-
 .../java/org/apache/solr/search/facet/SumAgg.java  |   2 +-
 .../org/apache/solr/search/facet/SumsqAgg.java     |   2 +-
 .../apache/solr/search/facet/UnInvertedField.java  |   8 +-
 .../org/apache/solr/search/facet/UniqueAgg.java    |   2 +-
 .../apache/solr/search/facet/UniqueBlockAgg.java   |   2 +-
 .../solr/search/facet/UniqueBlockFieldAgg.java     |   2 +-
 .../solr/search/facet/UniqueBlockQueryAgg.java     |   2 +-
 .../org/apache/solr/search/facet/VarianceAgg.java  |   2 +-
 .../solr/search/function/FileFloatSource.java      |  26 +-
 .../solr/search/grouping/CommandHandler.java       |  14 +-
 .../search/join/ChildFieldValueSourceParser.java   |   4 +-
 .../solr/search/stats/ExactSharedStatsCache.java   |   4 +-
 .../apache/solr/search/stats/ExactStatsCache.java  |  12 +-
 .../apache/solr/search/stats/LRUStatsCache.java    |   8 +-
 .../org/apache/solr/search/stats/StatsUtil.java    |  17 +-
 .../apache/solr/security/AuditLoggerPlugin.java    |  14 +-
 .../org/apache/solr/security/HadoopAuthPlugin.java |  28 +-
 .../org/apache/solr/security/JWTAuthPlugin.java    |  12 +-
 .../solr/security/JWTVerificationkeyResolver.java  |   6 +-
 .../org/apache/solr/security/KerberosFilter.java   |   4 +-
 .../org/apache/solr/security/KerberosPlugin.java   |  10 +-
 .../solr/security/MultiDestinationAuditLogger.java |   6 +-
 .../solr/security/PKIAuthenticationPlugin.java     |  20 +-
 .../security/RuleBasedAuthorizationPlugin.java     |  34 +-
 .../security/Sha256AuthenticationProvider.java     |   4 +-
 .../solr/security/SolrLogAuditLoggerPlugin.java    |   8 +-
 .../java/org/apache/solr/servlet/HttpSolrCall.java |  19 +-
 .../org/apache/solr/servlet/ResponseUtils.java     |   2 +-
 .../apache/solr/servlet/SolrDispatchFilter.java    |  29 +-
 .../solr/spelling/DirectSolrSpellChecker.java      |   4 +-
 .../solr/spelling/suggest/SolrSuggester.java       |  24 +-
 .../apache/solr/spelling/suggest/Suggester.java    |  14 +-
 .../suggest/jaspell/JaspellLookupFactory.java      |   2 +-
 .../org/apache/solr/store/hdfs/HdfsDirectory.java  |   4 +-
 .../solr/store/hdfs/HdfsLocalityReporter.java      |  10 +-
 .../java/org/apache/solr/update/CommitTracker.java |   4 +-
 .../src/java/org/apache/solr/update/PeerSync.java  |   7 +-
 .../org/apache/solr/update/PeerSyncWithLeader.java |   3 -
 .../src/java/org/apache/solr/update/UpdateLog.java |   4 +-
 .../org/apache/solr/update/UpdateShardHandler.java |   6 +-
 .../DocExpirationUpdateProcessorFactory.java       |   4 +-
 .../src/java/org/apache/solr/util/DynamicMap.java  |  55 +++
 .../src/java/org/apache/solr/util/ExportTool.java  |   5 +-
 .../src/java/org/apache/solr/util/FSHDFSUtils.java |  21 +-
 .../ScoreFilter.java => util/FloatConsumer.java}   |  24 +-
 .../org/apache/solr/util/IntFloatDynamicMap.java   | 118 +++++
 .../org/apache/solr/util/IntIntDynamicMap.java     | 120 ++++++
 .../org/apache/solr/util/IntLongDynamicMap.java    | 120 ++++++
 .../src/java/org/apache/solr/util/PackageTool.java |   6 +-
 .../src/java/org/apache/solr/util/SolrCLI.java     |  50 ++-
 .../org/apache/solr/util/StartupLoggingUtils.java  |   3 +-
 .../java/org/apache/solr/util/TestInjection.java   |   2 +-
 .../SSLCredentialProviderFactory.java              |   4 +-
 .../providers/HadoopSSLCredentialProvider.java     |   2 +-
 .../solr/util/plugin/AbstractPluginLoader.java     |   8 +-
 .../org/apache/solr/util/stats/MetricUtils.java    |   6 +-
 .../apache/solr/util/xslt/TransformerProvider.java |  11 +-
 solr/core/src/test-files/solr/solr-jmxreporter.xml |   1 -
 .../core/src/test-files/solr/solr-solrreporter.xml |   1 -
 .../test-files/solr/solr-trackingshardhandler.xml  |   1 -
 solr/core/src/test-files/solr/solr.xml             |   1 -
 .../apache/solr/cloud/BasicDistributedZkTest.java  |   4 +-
 .../apache/solr/cloud/ConnectionManagerTest.java   |   4 +-
 .../apache/solr/cloud/DistributedQueueTest.java    |   4 +-
 .../org/apache/solr/cloud/LeaderElectionTest.java  |   4 +-
 .../test/org/apache/solr/cloud/OverseerTest.java   |   9 +-
 .../cloud/SharedFSAutoReplicaFailoverTest.java     |   4 +-
 .../test/org/apache/solr/cloud/SyncSliceTest.java  |   1 +
 .../cloud/TestStressCloudBlindAtomicUpdates.java   |   4 +-
 .../org/apache/solr/cloud/TestStressLiveNodes.java |   4 +-
 .../cloud/TestWaitForStateWithJettyShutdowns.java  |   4 +-
 .../apache/solr/cloud/UnloadDistributedZkTest.java |   6 +-
 .../org/apache/solr/cloud/ZkControllerTest.java    |   9 +-
 .../CollectionsAPIAsyncDistributedZkTest.java      |   4 +-
 .../AutoAddReplicasIntegrationTest.java            |   6 +
 .../autoscaling/sim/TestSimDistributedQueue.java   |   4 +-
 .../cloud/cdcr/CdcrReplicationHandlerTest.java     |   4 +-
 .../apache/solr/cloud/hdfs/HdfsSyncSliceTest.java  |   2 -
 .../solr/common/cloud/ZkDynamicConfigTest.java     |  62 +++
 .../test/org/apache/solr/core/SolrCoreTest.java    |   6 +-
 .../admin}/HealthCheckHandlerTest.java             |  58 ++-
 .../handler/admin/ZookeeperStatusHandlerTest.java  |  20 +-
 .../org/apache/solr/handler/tagger/TaggerTest.java |  18 +
 .../apache/solr/schema/CurrencyFieldTypeTest.java  |  94 ++--
 .../apache/solr/schema/TestSortableTextField.java  |   6 +-
 .../solr/search/CurrencyRangeFacetCloudTest.java   |  64 ++-
 .../org/apache/solr/search/facet/DebugAgg.java     |  10 +-
 ...stributedFacetSimpleRefinementLongTailTest.java |  14 +-
 .../solr/search/facet/RangeFacetCloudTest.java     |  14 +-
 .../apache/solr/search/facet/TestJsonFacets.java   |  58 +++
 .../solr/search/facet/TestJsonRangeFacets.java     |  38 ++
 .../solr/security/AuditLoggerIntegrationTest.java  |   6 +-
 .../org/apache/solr/update/AddBlockUpdateTest.java |   6 +-
 .../solr/update/TestInPlaceUpdatesDistrib.java     |  18 +-
 .../processor/RoutedAliasUpdateProcessorTest.java  |   4 +-
 .../processor/TestDocBasedVersionConstraints.java  |   4 +-
 .../test/org/apache/solr/util/DynamicMapsTest.java |  90 ++++
 .../http2-client-9.4.24.v20191120.jar.sha1         |   1 -
 .../http2-client-9.4.27.v20200227.jar.sha1         |   1 +
 .../http2-common-9.4.24.v20191120.jar.sha1         |   1 -
 .../http2-common-9.4.27.v20200227.jar.sha1         |   1 +
 .../licenses/http2-hpack-9.4.24.v20191120.jar.sha1 |   1 -
 .../licenses/http2-hpack-9.4.27.v20200227.jar.sha1 |   1 +
 ...http-client-transport-9.4.24.v20191120.jar.sha1 |   1 -
 ...http-client-transport-9.4.27.v20200227.jar.sha1 |   1 +
 .../http2-server-9.4.24.v20191120.jar.sha1         |   1 -
 .../http2-server-9.4.27.v20200227.jar.sha1         |   1 +
 .../jetty-alpn-client-9.4.24.v20191120.jar.sha1    |   1 -
 .../jetty-alpn-client-9.4.27.v20200227.jar.sha1    |   1 +
 ...etty-alpn-java-client-9.4.24.v20191120.jar.sha1 |   1 -
 ...etty-alpn-java-client-9.4.27.v20200227.jar.sha1 |   1 +
 ...etty-alpn-java-server-9.4.24.v20191120.jar.sha1 |   1 -
 ...etty-alpn-java-server-9.4.27.v20200227.jar.sha1 |   1 +
 .../jetty-alpn-server-9.4.24.v20191120.jar.sha1    |   1 -
 .../jetty-alpn-server-9.4.27.v20200227.jar.sha1    |   1 +
 .../jetty-client-9.4.24.v20191120.jar.sha1         |   1 -
 .../jetty-client-9.4.27.v20200227.jar.sha1         |   1 +
 .../jetty-continuation-9.4.24.v20191120.jar.sha1   |   1 -
 .../jetty-continuation-9.4.27.v20200227.jar.sha1   |   1 +
 .../jetty-deploy-9.4.24.v20191120.jar.sha1         |   1 -
 .../jetty-deploy-9.4.27.v20200227.jar.sha1         |   1 +
 solr/licenses/jetty-http-9.4.24.v20191120.jar.sha1 |   1 -
 solr/licenses/jetty-http-9.4.27.v20200227.jar.sha1 |   1 +
 solr/licenses/jetty-io-9.4.24.v20191120.jar.sha1   |   1 -
 solr/licenses/jetty-io-9.4.27.v20200227.jar.sha1   |   1 +
 solr/licenses/jetty-jmx-9.4.24.v20191120.jar.sha1  |   1 -
 solr/licenses/jetty-jmx-9.4.27.v20200227.jar.sha1  |   1 +
 .../jetty-rewrite-9.4.24.v20191120.jar.sha1        |   1 -
 .../jetty-rewrite-9.4.27.v20200227.jar.sha1        |   1 +
 .../jetty-security-9.4.24.v20191120.jar.sha1       |   1 -
 .../jetty-security-9.4.27.v20200227.jar.sha1       |   1 +
 .../jetty-server-9.4.24.v20191120.jar.sha1         |   1 -
 .../jetty-server-9.4.27.v20200227.jar.sha1         |   1 +
 .../jetty-servlet-9.4.24.v20191120.jar.sha1        |   1 -
 .../jetty-servlet-9.4.27.v20200227.jar.sha1        |   1 +
 .../jetty-servlets-9.4.24.v20191120.jar.sha1       |   1 -
 .../jetty-servlets-9.4.27.v20200227.jar.sha1       |   1 +
 .../jetty-start-9.4.24.v20191120-shaded.jar.sha1   |   1 -
 .../jetty-start-9.4.27.v20200227-shaded.jar.sha1   |   1 +
 solr/licenses/jetty-util-9.4.24.v20191120.jar.sha1 |   1 -
 solr/licenses/jetty-util-9.4.27.v20200227.jar.sha1 |   1 +
 .../jetty-webapp-9.4.24.v20191120.jar.sha1         |   1 -
 .../jetty-webapp-9.4.27.v20200227.jar.sha1         |   1 +
 solr/licenses/jetty-xml-9.4.24.v20191120.jar.sha1  |   1 -
 solr/licenses/jetty-xml-9.4.27.v20200227.jar.sha1  |   1 +
 solr/licenses/metrics-core-4.1.2.jar.sha1          |   1 -
 solr/licenses/metrics-core-4.1.5.jar.sha1          |   1 +
 solr/licenses/metrics-graphite-4.1.2.jar.sha1      |   1 -
 solr/licenses/metrics-graphite-4.1.5.jar.sha1      |   1 +
 solr/licenses/metrics-jetty9-4.1.2.jar.sha1        |   1 -
 solr/licenses/metrics-jetty9-4.1.5.jar.sha1        |   1 +
 solr/licenses/metrics-jmx-4.1.2.jar.sha1           |   1 -
 solr/licenses/metrics-jmx-4.1.5.jar.sha1           |   1 +
 solr/licenses/metrics-jvm-4.1.2.jar.sha1           |   1 -
 solr/licenses/metrics-jvm-4.1.5.jar.sha1           |   1 +
 solr/licenses/start.jar.sha1                       |   2 +-
 solr/packaging/build.gradle                        |   9 +
 .../src/implicit-requesthandlers.adoc              |   2 +
 .../src/major-changes-in-solr-9.adoc               |   5 +
 .../setting-up-an-external-zookeeper-ensemble.adoc |   2 +
 .../src/solrcloud-autoscaling-triggers.adoc        |  25 +-
 .../org/apache/solr/client/solrj/SolrClient.java   |   4 +-
 .../client/solrj/impl/BaseCloudSolrClient.java     |   4 +-
 .../impl/ConcurrentUpdateHttp2SolrClient.java      |   4 +-
 .../solrj/impl/ConcurrentUpdateSolrClient.java     |   4 +-
 .../solr/client/solrj/impl/Http2SolrClient.java    |   4 +-
 .../solr/client/solrj/impl/HttpSolrClient.java     |   4 +-
 .../solr/client/solrj/impl/LBSolrClient.java       |   4 +-
 .../client/solrj/io/graph/GatherNodesStream.java   |   4 +-
 .../client/solrj/io/graph/ShortestPathStream.java  |   4 +-
 .../client/solrj/io/stream/CloudSolrStream.java    |   4 +-
 .../solr/client/solrj/io/stream/DaemonStream.java  |   4 +-
 .../client/solrj/io/stream/DeepRandomStream.java   |   4 +-
 .../client/solrj/io/stream/ExecutorStream.java     |   4 +-
 .../solrj/io/stream/FeaturesSelectionStream.java   |   4 +-
 .../client/solrj/io/stream/ParallelListStream.java |   4 +-
 .../solrj/io/stream/SignificantTermsStream.java    |   4 +-
 .../client/solrj/io/stream/TextLogitStream.java    |   4 +-
 .../solr/client/solrj/io/stream/TopicStream.java   |   4 +-
 .../org/apache/solr/common/cloud/SolrZkClient.java |  31 +-
 .../apache/solr/common/cloud/ZkDynamicConfig.java  | 144 +++++++
 .../apache/solr/common/cloud/ZkStateReader.java    |   4 +-
 .../org/apache/solr/common/util/ExecutorUtil.java  |   2 +-
 .../solr/common/util/SolrNamedThreadFactory.java}  |  23 +-
 .../solr/common/util/SolrjNamedThreadFactory.java  |  49 ---
 .../org/apache/solr/client/solrj/GetByIdTest.java  |  27 +-
 .../impl/ConcurrentUpdateHttp2SolrClientTest.java  |   6 +-
 .../solrj/impl/ConcurrentUpdateSolrClientTest.java |   6 +-
 .../solrj/impl/HttpSolrClientConPoolTest.java      |   4 +-
 .../apache/solr/common/cloud/SolrZkClientTest.java |   8 +-
 .../apache/solr/BaseDistributedSearchTestCase.java |   7 +-
 .../src/java/org/apache/solr/SolrTestCaseHS.java   |  45 ++
 .../src/java/org/apache/solr/SolrTestCaseJ4.java   |   4 +-
 .../solr/cloud/AbstractFullDistribZkTestBase.java  |  10 +-
 .../java/org/apache/solr/cloud/ChaosMonkey.java    |   6 +-
 .../apache/solr/cloud/MiniSolrCloudCluster.java    |   6 +-
 solr/webapp/web/index.html                         |   4 +-
 solr/webapp/web/js/angular/controllers/cloud.js    |   5 +-
 solr/webapp/web/libs/angular-chosen.min.js         |   4 +-
 solr/webapp/web/partials/cloud.html                |   3 +-
 versions.lock                                      |  58 +--
 versions.props                                     |   6 +-
 468 files changed, 6390 insertions(+), 3909 deletions(-)