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

noble pushed a commit to branch jira/solr15722
in repository https://gitbox.apache.org/repos/asf/solr.git

commit bb8f3730f4a087e7cea5d012bb076d9b2b526b3a
Author: Noble Paul <[email protected]>
AuthorDate: Thu Oct 28 22:31:52 2021 +1100

    SOLR-15722
---
 solr/CHANGES.txt                                   |  2 +
 .../apache/solr/cloud/overseer/SliceMutator.java   |  3 +-
 .../client/solrj/impl/CloudSolrClientTest.java     | 52 +++++++++++++++++-----
 3 files changed, 46 insertions(+), 11 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 8576f90..14e841f 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -431,6 +431,8 @@ Bug Fixes
 
 * SOLR-15628: The SolrException.log() helper method has been fixed to 
correctly passes the Throwable to the Logger w/o stringification (hossman)
 
+* SOLR-15722: Delete Replica does not delete the Per replica state (noble)
+
 Build
 ---------------------
 
diff --git 
a/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java 
b/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
index 4d7d93b..59d6304 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
@@ -130,7 +130,8 @@ public class SliceMutator {
 
 
     if (coll.isPerReplicaState()) {
-      return new ZkWriteCommand(collection, coll.copyWithSlices(newSlices), 
PerReplicaStatesOps.deleteReplica(cnn, coll.getPerReplicaStates()) , true);
+      PerReplicaStatesOps replicaOps = PerReplicaStatesOps.deleteReplica(cnn, 
PerReplicaStates.fetch(coll.getZNode(), zkClient, coll.getPerReplicaStates()) );
+      return new ZkWriteCommand(collection, coll.copyWithSlices(newSlices), 
replicaOps, true);
     } else {
       return new ZkWriteCommand(collection, coll.copyWithSlices(newSlices));
     }
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
index fc6f9bb..2916beb 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
@@ -43,10 +43,7 @@ import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
-import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.client.solrj.request.*;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.client.solrj.response.RequestStatusState;
 import org.apache.solr.client.solrj.response.SolrPingResponse;
@@ -57,12 +54,7 @@ import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.ClusterState;
-import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.DocRouter;
-import org.apache.solr.common.cloud.Replica;
-import org.apache.solr.common.cloud.Slice;
-import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.cloud.*;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
@@ -84,6 +76,8 @@ import org.junit.rules.ExpectedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
+
 
 /**
  * This test would be faster if we simulated the zk state instead.
@@ -1054,4 +1048,42 @@ public class CloudSolrClientTest extends 
SolrCloudTestCase {
     assertEquals("This should be OK", 0, response.getStatus());
   }
 
+  public void testPerReplicaStateCollection() throws Exception {
+    CollectionAdminRequest.createCollection("versions_collection", "conf", 2, 
1)
+            .process(cluster.getSolrClient());
+
+    String testCollection = "perReplicaState_test";
+    int liveNodes = cluster.getJettySolrRunners().size();
+    CollectionAdminRequest.createCollection(testCollection, "conf", 2, 2)
+            .setPerReplicaState(Boolean.TRUE)
+            .process(cluster.getSolrClient());
+    cluster.waitForActiveCollection(testCollection, 2, 4);
+    final SolrClient clientUnderTest = getRandomClient();
+    final SolrPingResponse response = clientUnderTest.ping(testCollection);
+    assertEquals("This should be OK", 0, response.getStatus());
+    DocCollection c = 
cluster.getSolrClient().getZkStateReader().getCollection(testCollection);
+    c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
+    PerReplicaStates prs = 
PerReplicaStates.fetch(ZkStateReader.getCollectionPath(testCollection), 
cluster.getZkClient(), null);
+    assertEquals(4, prs.states.size());
+    JettySolrRunner jsr = cluster.startJettySolrRunner();
+    // Now let's do an add replica
+    CollectionAdminRequest
+            .addReplicaToShard(testCollection, "shard1")
+            .process(cluster.getSolrClient());
+    prs = 
PerReplicaStates.fetch(ZkStateReader.getCollectionPath(testCollection), 
cluster.getZkClient(), null);
+    assertEquals(5, prs.states.size());
+
+    testCollection = "perReplicaState_testv2";
+    new V2Request.Builder("/collections")
+            .withMethod(POST)
+            .withPayload("{create: {name: perReplicaState_testv2, config : 
conf, numShards : 2, nrtReplicas : 2, perReplicaState : true, maxShardsPerNode 
: 5}}")
+            .build()
+            .process(cluster.getSolrClient());
+    cluster.waitForActiveCollection(testCollection, 2, 4);
+    c = 
cluster.getSolrClient().getZkStateReader().getCollection(testCollection);
+    c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
+    prs = 
PerReplicaStates.fetch(ZkStateReader.getCollectionPath(testCollection), 
cluster.getZkClient(), null);
+    assertEquals(4, prs.states.size());
+  }
+
 }

Reply via email to