This is an automated email from the ASF dual-hosted git repository. jsweeney pushed a commit to branch branch_9x in repository https://gitbox.apache.org/repos/asf/solr.git
commit 179ed4817cce5eb6a19fd9a7b4a179f6c1ac8f53 Author: patsonluk <[email protected]> AuthorDate: Thu Jul 6 06:21:19 2023 -0700 SOLR-16860: Remove collection -> synthetic core mapping in Coordinator Node upon collection deletion (#1754) * CoordinatorHttpSolrCall should remove collection from mapping upon collection deletion * Updated CHANGES.txt --------- Co-authored-by: Justin Sweeney <[email protected]> --- solr/CHANGES.txt | 2 -- .../org/apache/solr/servlet/CoordinatorHttpSolrCall.java | 11 ++++++++++- .../test/org/apache/solr/search/TestCoordinatorRole.java | 15 ++++++++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 3a4967656bd..bdc23977a13 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -247,8 +247,6 @@ Bug Fixes * SOLR-16861: Coordinator node does not have the correct collection/core in MDCLoggingContext (Patson Luk) - - Dependency Upgrades --------------------- * PR#1494: Upgrade forbiddenapis to 3.5 (Uwe Schindler) diff --git a/solr/core/src/java/org/apache/solr/servlet/CoordinatorHttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/CoordinatorHttpSolrCall.java index df95f712a4c..ee30474a506 100644 --- a/solr/core/src/java/org/apache/solr/servlet/CoordinatorHttpSolrCall.java +++ b/solr/core/src/java/org/apache/solr/servlet/CoordinatorHttpSolrCall.java @@ -105,7 +105,16 @@ public class CoordinatorHttpSolrCall extends HttpSolrCall { .cores .getZkController() .getZkStateReader() - .registerDocCollectionWatcher(collectionName, collection -> collection == null); + .registerDocCollectionWatcher( + collectionName, + collection -> { + if (collection == null) { + factory.collectionVsCoreNameMapping.remove(collectionName); + return true; + } else { + return false; + } + }); if (log.isDebugEnabled()) { log.debug("coordinator node, returns synthetic core: {}", core.getName()); } diff --git a/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java b/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java index 705429de5e5..14d866d1f3a 100644 --- a/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java +++ b/solr/core/src/test/org/apache/solr/search/TestCoordinatorRole.java @@ -443,19 +443,32 @@ public class TestCoordinatorRole extends SolrCloudTestCase { assertTrue(!zkWatchAccessor.getWatchedCollections().contains(TEST_COLLECTION)); new QueryRequest(new SolrQuery("*:*")) .setPreferredNodes(List.of(coordinatorJetty.getNodeName())) - .process(client, TEST_COLLECTION); + .process(client, TEST_COLLECTION); // ok no exception thrown // now it should be watching it after the query assertTrue(zkWatchAccessor.getWatchedCollections().contains(TEST_COLLECTION)); CollectionAdminRequest.deleteReplica(TEST_COLLECTION, "shard1", 1).process(client); cluster.waitForActiveCollection(TEST_COLLECTION, 1, 1); + new QueryRequest(new SolrQuery("*:*")) + .setPreferredNodes(List.of(coordinatorJetty.getNodeName())) + .process(client, TEST_COLLECTION); // ok no exception thrown // still one replica left, should not remove the watch assertTrue(zkWatchAccessor.getWatchedCollections().contains(TEST_COLLECTION)); CollectionAdminRequest.deleteCollection(TEST_COLLECTION).process(client); zkStateReader.waitForState(TEST_COLLECTION, 30, TimeUnit.SECONDS, Objects::isNull); + assertNull(zkStateReader.getCollection(TEST_COLLECTION)); // check the cluster state + + // ensure querying throws exception + assertExceptionThrownWithMessageContaining( + SolrException.class, + List.of("Collection not found"), + () -> + new QueryRequest(new SolrQuery("*:*")) + .setPreferredNodes(List.of(coordinatorJetty.getNodeName())) + .process(client, TEST_COLLECTION)); // watch should be removed after collection deletion assertTrue(!zkWatchAccessor.getWatchedCollections().contains(TEST_COLLECTION));
