You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2020/06/25 01:20:39 UTC
[lucene-solr] branch branch_8x updated: SOLR-14409: Existing violations allow bypassing policy rules when add… (#1598)
This is an automated email from the ASF dual-hosted git repository.
noble pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
The following commit(s) were added to refs/heads/branch_8x by this push:
new da2ba97 SOLR-14409: Existing violations allow bypassing policy rules when add… (#1598)
da2ba97 is described below
commit da2ba970de32189b4e767b79ca0b6b0496be42f1
Author: Noble Paul <no...@users.noreply.github.com>
AuthorDate: Thu Jun 25 10:33:28 2020 +1000
SOLR-14409: Existing violations allow bypassing policy rules when add… (#1598)
* SOLR-14409: Existing violations allow bypassing policy rules when adding new replicas
---
solr/CHANGES.txt | 2 +
.../client/solrj/cloud/autoscaling/Suggester.java | 2 +-
.../solr/autoscaling/testAddTooManyPerPolicy.json | 129 +++++++++++++++++++++
.../solrj/cloud/autoscaling/TestPolicy2.java | 12 ++
4 files changed, 144 insertions(+), 1 deletion(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index b6001f4..5625b6b 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -177,6 +177,8 @@ Bug Fixes
* SOLR-14577: Return 400 BAD REQUEST when field is missing on a Terms query parser request
(Tomás Fernández Löbbe)
+* SOLR-14409: Existing violations allow bypassing policy rules when adding new replicas (noble, ab)
+
* SOLR-14584: Correct SOLR_SSL_KEY_STORE and SOLR_SSL_TRUST_STORE example comments in solr.in.sh and solr.in.cmd files
(Aren Cambre via Christine Poerschke)
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggester.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggester.java
index 28460cd..b9d5faf 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggester.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/autoscaling/Suggester.java
@@ -291,7 +291,7 @@ public abstract class Suggester implements MapWriter {
//the computed value can change over time. So it's better to evaluate it in the end
if (isTxOpen && v.getClause().hasComputedValue) continue;
int idx = originalViolations.indexOf(v);
- if (idx < 0 /*|| originalViolations.get(idx).isLessSerious(v)*/) return true;
+ if (idx < 0 || originalViolations.get(idx).isLessSerious(v)) return true;
}
return false;
}
diff --git a/solr/solrj/src/test-files/solrj/solr/autoscaling/testAddTooManyPerPolicy.json b/solr/solrj/src/test-files/solrj/solr/autoscaling/testAddTooManyPerPolicy.json
new file mode 100644
index 0000000..23ab471
--- /dev/null
+++ b/solr/solrj/src/test-files/solrj/solr/autoscaling/testAddTooManyPerPolicy.json
@@ -0,0 +1,129 @@
+{
+ "diagnostics": {
+ "sortedNodes": [
+ {
+ "node": "127.0.0.1:61737_solr",
+ "isLive": true,
+ "cores": 2.0,
+ "freedisk": 184.94042205810547,
+ "totaldisk": 465.62699127197266,
+ "replicas": {
+ "TooManyPerPolicy": {
+ "shard1": [
+ {
+ "core_node3": {
+ "core": "TooManyPerPolicy_shard1_replica_n1",
+ "shard": "shard1",
+ "collection": "TooManyPerPolicy",
+ "node_name": "127.0.0.1:61737_solr",
+ "type": "NRT",
+ "leader": "true",
+ "base_url": "http://127.0.0.1:61737/solr",
+ "state": "active",
+ "force_set_state": "false",
+ "INDEX.sizeInGB": 6.426125764846802E-8
+ }
+ },
+ {
+ "core_node8": {
+ "core": "TooManyPerPolicy_shard1_replica_n7",
+ "shard": "shard1",
+ "collection": "TooManyPerPolicy",
+ "node_name": "127.0.0.1:61737_solr",
+ "type": "NRT",
+ "base_url": "http://127.0.0.1:61737/solr",
+ "state": "down",
+ "force_set_state": "false",
+ "INDEX.sizeInGB": 6.426125764846802E-8
+ }}]}}},
+ {
+ "node": "127.0.0.1:61738_solr",
+ "isLive": true,
+ "cores": 1.0,
+ "freedisk": 184.94042205810547,
+ "totaldisk": 465.62699127197266,
+ "replicas": {
+ "TooManyPerPolicy": {
+ "shard3": [
+ {
+ "core_node6": {
+ "core": "TooManyPerPolicy_shard3_replica_n4",
+ "shard": "shard3",
+ "collection": "TooManyPerPolicy",
+ "node_name": "127.0.0.1:61738_solr",
+ "type": "NRT",
+ "leader": "true",
+ "base_url": "http://127.0.0.1:61738/solr",
+ "state": "active",
+ "force_set_state": "false",
+ "INDEX.sizeInGB": 6.426125764846802E-8
+ }}]}}},
+ {
+ "node": "127.0.0.1:61739_solr",
+ "isLive": true,
+ "cores": 1.0,
+ "freedisk": 184.94042205810547,
+ "totaldisk": 465.62699127197266,
+ "replicas": {
+ "TooManyPerPolicy": {
+ "shard2": [
+ {
+ "core_node5": {
+ "core": "TooManyPerPolicy_shard2_replica_n2",
+ "shard": "shard2",
+ "collection": "TooManyPerPolicy",
+ "node_name": "127.0.0.1:61739_solr",
+ "type": "NRT",
+ "leader": "true",
+ "base_url": "http://127.0.0.1:61739/solr",
+ "state": "active",
+ "force_set_state": "false",
+ "INDEX.sizeInGB": 6.426125764846802E-8
+ }}]}}}
+ ],
+ "liveNodes": [
+ "127.0.0.1:61738_solr",
+ "127.0.0.1:61739_solr",
+ "127.0.0.1:61737_solr"
+ ],
+ "violations": [
+ {
+ "collection": "TooManyPerPolicy",
+ "node": "127.0.0.1:61737_solr",
+ "tagKey": "127.0.0.1:61737_solr",
+ "violation": {
+ "replica": {"NRT": 2, "count": 2},
+ "delta": 1.0},
+ "clause": {
+ "replica": "<2", "shard": "#ANY", "node": "#ANY", "strict": true, "collection": "TooManyPerPolicy"},
+ "violatingReplicas": [
+ {
+ "core_node3": {
+ "core": "TooManyPerPolicy_shard1_replica_n1",
+ "shard": "shard1",
+ "collection": "TooManyPerPolicy",
+ "node_name": "127.0.0.1:61737_solr",
+ "type": "NRT",
+ "leader": "true",
+ "base_url": "http://127.0.0.1:61737/solr",
+ "state": "active",
+ "force_set_state": "false",
+ "INDEX.sizeInGB": 6.426125764846802E-8}},
+ {
+ "core_node8": {
+ "core": "TooManyPerPolicy_shard1_replica_n7",
+ "shard": "shard1",
+ "collection": "TooManyPerPolicy",
+ "node_name": "127.0.0.1:61737_solr",
+ "type": "NRT",
+ "base_url": "http://127.0.0.1:61737/solr",
+ "state": "down",
+ "force_set_state": "false",
+ "INDEX.sizeInGB": 6.426125764846802E-8
+ }}]}],
+ "config": {
+ "cluster-preferences": [
+ {"minimize": "cores", "precision": 1},
+ {"maximize": "freedisk"}],
+ "cluster-policy": [
+ {"replica": "<2", "shard": "#ANY", "node": "#ANY", "strict": true}]}}}
\ 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 9b64198..09520a9 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
@@ -40,6 +40,7 @@ import org.apache.solr.client.solrj.cloud.NodeStateProvider;
import org.apache.solr.client.solrj.cloud.SolrCloudManager;
import org.apache.solr.client.solrj.impl.ClusterStateProvider;
import org.apache.solr.client.solrj.impl.SolrClientNodeStateProvider;
+import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.ReplicaPosition;
import org.apache.solr.common.util.Utils;
@@ -516,6 +517,17 @@ public class TestPolicy2 extends SolrTestCaseJ4 {
System.out.println(suggestions);
}
+ @SuppressWarnings({"unchecked"})
+ public void testAddTooManyPerPolicy() {
+ Map<String, Object> m = (Map<String, Object>) loadFromResource("testAddTooManyPerPolicy.json");
+ SolrCloudManager cloudManagerFromDiagnostics = createCloudManagerFromDiagnostics(m);
+ AutoScalingConfig autoScalingConfig = new AutoScalingConfig((Map<String, Object>) getObjectByPath(m, false, "diagnostics/config"));
+ SolrException exp = expectThrows(SolrException.class, () -> PolicyHelper.getReplicaLocations("TooManyPerPolicy", autoScalingConfig, cloudManagerFromDiagnostics,
+ EMPTY_MAP, Collections.singletonList("shard1"), 1, 0, 0, null));
+ assertTrue(exp.getMessage().contains("No node can satisfy the rules"));
+
+ }
+
public static Object loadFromResource(String file) {
try (InputStream is = TestPolicy2.class.getResourceAsStream("/solrj/solr/autoscaling/" + file)) {
return Utils.fromJSON(is, MAPOBJBUILDER);