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()); + } + }
