diff --git a/solr/core/src/java/org/apache/solr/cloud/Overseer.java b/solr/core/src/java/org/apache/solr/cloud/Overseer.java index 799f690b8ef..9ee80a0bad9 100644 --- a/solr/core/src/java/org/apache/solr/cloud/Overseer.java +++ b/solr/core/src/java/org/apache/solr/cloud/Overseer.java @@ -581,12 +581,26 @@ public class Overseer { public void close() { isClosed = true; if (updaterThread != null) { - updaterThread.close(); - updaterThread.interrupt(); + try { + updaterThread.close(); + updaterThread.interrupt(); + } catch (Throwable t) { + log.error("Error closing updaterThread", t); + } } if (ccThread != null) { - ccThread.close(); - ccThread.interrupt(); + try { + ccThread.close(); + ccThread.interrupt(); + } catch (Throwable t) { + log.error("Error closing ccThread", t); + } + } + + try { + reader.close(); + } catch (Throwable t) { + log.error("Error closing zkStateReader", t); } } diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java index f910bf95e57..389eb3a3e47 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java +++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java @@ -348,6 +348,12 @@ public final class ZkController { log.error("Error closing overseer", t); } + try { + zkStateReader.close(); + } catch(Throwable t) { + log.error("Error closing zkStateReader", t); + } + try { zkClient.close();; } catch(Throwable t) { diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java index 6dd4b1aea40..4658b1dcb75 100644 --- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java @@ -284,6 +284,10 @@ public class LeaderElectionIntegrationTest extends SolrTestCaseJ4 { zkClient.close(); } + if (reader != null) { + reader.close(); + } + for (CoreContainer cc : containerMap.values()) { if (!cc.isShutDown()) { cc.shutdown(); diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java index a4f69fcbfce..21772017b49 100644 --- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java @@ -451,6 +451,7 @@ public class LeaderElectionTest extends SolrTestCaseJ4 { @Override public void tearDown() throws Exception { zkClient.close(); + zkStateReader.close(); server.shutdown(); super.tearDown(); } diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java index 70374e1ee6c..371f6114ef5 100644 --- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java +++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java @@ -133,6 +133,8 @@ public class ZkStateReader { private Aliases aliases = new Aliases(); + private volatile boolean closed = false; + public ZkStateReader(SolrZkClient zkClient) { this.zkClient = zkClient; initZkCmdExecutor(zkClient.getZkClientTimeout()); @@ -437,6 +439,7 @@ public class ZkStateReader { } public void close() { + this.closed = true; if (closeClient) { zkClient.close(); } @@ -469,7 +472,7 @@ public class ZkStateReader { */ public Replica getLeaderRetry(String collection, String shard, int timeout) throws InterruptedException { long timeoutAt = System.currentTimeMillis() + timeout; - while (System.currentTimeMillis() < timeoutAt) { + while (System.currentTimeMillis() < timeoutAt && !closed) { if (clusterState != null) { Replica replica = clusterState.getLeader(collection, shard); if (replica != null && getClusterState().liveNodesContain(replica.getNodeName())) { diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java index 279dc56bcef..c6cb68f2957 100644 --- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java +++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrServerTest.java @@ -85,7 +85,7 @@ public class CloudSolrServerTest extends AbstractFullDistribZkTestBase { public CloudSolrServerTest() { super(); sliceCount = 2; - shardCount = 6; + shardCount = 4; } @Override