You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2020/11/09 04:08:05 UTC

[lucene-solr] 03/04: @1102 Remove leader watch on cancel/close.

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

markrmiller pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 27ed84ad0657b1e5a9750605cf807d2639481ff6
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Sun Nov 8 21:05:45 2020 -0600

    @1102 Remove leader watch on cancel/close.
---
 .../java/org/apache/solr/cloud/LeaderElector.java  | 28 ++++++++++++++++------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java b/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java
index a54aea7..9cb54a8 100644
--- a/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java
+++ b/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java
@@ -31,7 +31,9 @@ import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.ParWork;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.solr.common.cloud.SolrZooKeeper;
 import org.apache.solr.common.cloud.ZooKeeperException;
+import org.apache.solr.common.util.IOUtils;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.KeeperException.ConnectionLossException;
@@ -161,7 +163,7 @@ public class LeaderElector implements Closeable {
 
         ElectionWatcher oldWatcher = watcher;
         if (oldWatcher != null) {
-          oldWatcher.cancel();
+          oldWatcher.close();
         }
         zkClient.exists(watchedNode, watcher = new ElectionWatcher(context.leaderSeqPath,
             watchedNode, getSeq(context.leaderSeqPath), context));
@@ -344,10 +346,11 @@ public class LeaderElector implements Closeable {
 
   @Override
   public void close() throws IOException {
+    IOUtils.closeQuietly(watcher);
     this.isClosed = true;
   }
 
-  private class ElectionWatcher implements Watcher {
+  private class ElectionWatcher implements Watcher, Closeable {
     final String myNode, watchedNode;
     final ElectionContext context;
 
@@ -359,10 +362,6 @@ public class LeaderElector implements Closeable {
       this.context = context;
     }
 
-    void cancel() {
-      canceled = true;
-    }
-
     @Override
     public void process(WatchedEvent event) {
       // session events are not change events, and do not remove the watcher
@@ -387,6 +386,21 @@ public class LeaderElector implements Closeable {
         return;
       }
     }
+
+    @Override
+    public void close() throws IOException {
+      SolrZooKeeper zk = zkClient.getSolrZooKeeper();
+      if (zk != null) {
+        try {
+          zk.removeWatches(context.leaderSeqPath, this, WatcherType.Any, true);
+        } catch (InterruptedException e) {
+          log.info("Interrupted removing leader watch");
+        } catch (KeeperException e) {
+          log.error("Exception removing leader watch", e);
+        }
+      }
+      canceled = true;
+    }
   }
 
   /**
@@ -411,7 +425,7 @@ public class LeaderElector implements Closeable {
         prevContext.close();
       }
     }
-    if (watcher != null) watcher.cancel();
+    if (watcher != null) watcher.close();
     this.context.close();
     this.context = context;
     joinElection(context, true, joinAtHead);