diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index c0c88561590..f64f552768f 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -184,6 +184,9 @@ Bug Fixes * SOLR-8694: DistributedMap/Queue can create too many Watchers and some code simplification. (Scott Blum via Mark Miller) + +* SOLR-8695: Ensure ZK watchers are not triggering our watch logic on connection events and + make this handling more consistent. (Scott Blum via Mark Miller) Optimizations ---------------------- 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 056b4b9846e..af27f0010bc 100644 --- a/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java +++ b/solr/core/src/java/org/apache/solr/cloud/LeaderElector.java @@ -367,8 +367,7 @@ public class LeaderElector { @Override public void process(WatchedEvent event) { - // session events are not change events, - // and do not remove the watcher + // session events are not change events, and do not remove the watcher if (EventType.None.equals(event.getType())) { return; } diff --git a/solr/core/src/java/org/apache/solr/cloud/OverseerTaskQueue.java b/solr/core/src/java/org/apache/solr/cloud/OverseerTaskQueue.java index ea219d30623..cf9d5834e8d 100644 --- a/solr/core/src/java/org/apache/solr/cloud/OverseerTaskQueue.java +++ b/solr/core/src/java/org/apache/solr/cloud/OverseerTaskQueue.java @@ -129,11 +129,13 @@ public class OverseerTaskQueue extends DistributedQueue { @Override public void process(WatchedEvent event) { - Event.EventType eventType = event.getType(); - // None events are ignored + // session events are not change events, and do not remove the watcher + if (Event.EventType.None.equals(event.getType())) { + return; + } // If latchEventType is not null, only fire if the type matches - LOG.info("{} fired on path {} state {} latchEventType {}", eventType, event.getPath(), event.getState(), latchEventType); - if (eventType != Event.EventType.None && (latchEventType == null || eventType == latchEventType)) { + LOG.info("{} fired on path {} state {} latchEventType {}", event.getType(), event.getPath(), event.getState(), latchEventType); + if (latchEventType == null || event.getType() == latchEventType) { synchronized (lock) { this.event = event; lock.notifyAll(); 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 e436716c422..7874e2b0167 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java +++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java @@ -2365,7 +2365,8 @@ public final class ZkController { @Override public void process(WatchedEvent event) { - if (event.getState() == Event.KeeperState.Disconnected || event.getState() == Event.KeeperState.Expired) { + // session events are not change events, and do not remove the watcher + if (Event.EventType.None.equals(event.getType())) { return; } diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java b/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java index 18c7d057188..713d6fce88c 100644 --- a/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java +++ b/solr/core/src/java/org/apache/solr/handler/CdcrBufferStateManager.java @@ -154,6 +154,7 @@ class CdcrBufferStateManager extends CdcrStateManager { String shard = core.getCoreDescriptor().getCloudDescriptor().getShardId(); log.info("The CDCR buffer state has changed: {} @ {}:{}", event, collectionName, shard); + // session events are not change events, and do not remove the watcher if (Event.EventType.None.equals(event.getType())) { return; } diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java b/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java index 59313d333ea..7d8ddc40656 100644 --- a/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java +++ b/solr/core/src/java/org/apache/solr/handler/CdcrLeaderStateManager.java @@ -137,6 +137,7 @@ class CdcrLeaderStateManager extends CdcrStateManager { String shard = core.getCoreDescriptor().getCloudDescriptor().getShardId(); log.debug("The leader state has changed: {} @ {}:{}", event, collectionName, shard); + // session events are not change events, and do not remove the watcher if (Event.EventType.None.equals(event.getType())) { return; } diff --git a/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java b/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java index 7630702db46..b1c8ddaba27 100644 --- a/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java +++ b/solr/core/src/java/org/apache/solr/handler/CdcrProcessStateManager.java @@ -154,6 +154,7 @@ class CdcrProcessStateManager extends CdcrStateManager { String shard = core.getCoreDescriptor().getCloudDescriptor().getShardId(); log.info("The CDCR process state has changed: {} @ {}:{}", event, collectionName, shard); + // session events are not change events, and do not remove the watcher if (Event.EventType.None.equals(event.getType())) { return; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java index 8bc21305ab5..e2ce63d063f 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java @@ -248,6 +248,10 @@ public final class ZookeeperInfoHandler extends RequestHandlerBase { */ @Override public void process(WatchedEvent event) { + // session events are not change events, and do not remove the watcher + if (Event.EventType.None.equals(event.getType())) { + return; + } synchronized (this) { cachedCollections = null; } 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 bfe89e35224..910b47e0407 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 @@ -306,8 +306,7 @@ public class ZkStateReader implements Closeable { @Override public void process(WatchedEvent event) { - // session events are not change events, - // and do not remove the watcher + // session events are not change events, and do not remove the watcher if (EventType.None.equals(event.getType())) { return; } @@ -359,8 +358,7 @@ public class ZkStateReader implements Closeable { @Override public void process(WatchedEvent event) { - // session events are not change events, - // and do not remove the watcher + // session events are not change events, and do not remove the watcher if (EventType.None.equals(event.getType())) { return; } @@ -797,15 +795,14 @@ public class ZkStateReader implements Closeable { @Override public void process(WatchedEvent event) { - if (!interestingCollections.contains(coll)) { - // This collection is no longer interesting, stop watching. - LOG.info("Uninteresting collection [{}]", coll); + // session events are not change events, and do not remove the watcher + if (EventType.None.equals(event.getType())) { return; } - // session events are not change events, - // and do not remove the watcher - if (EventType.None.equals(event.getType())) { + if (!interestingCollections.contains(coll)) { + // This collection is no longer interesting, stop watching. + LOG.info("Uninteresting collection {}", coll); return; } @@ -852,8 +849,7 @@ public class ZkStateReader implements Closeable { @Override public void process(WatchedEvent event) { - // session events are not change events, - // and do not remove the watcher + // session events are not change events, and do not remove the watcher if (EventType.None.equals(event.getType())) { return; } @@ -890,8 +886,7 @@ public class ZkStateReader implements Closeable { @Override public void process(WatchedEvent event) { - // session events are not change events, - // and do not remove the watcher + // session events are not change events, and do not remove the watcher if (EventType.None.equals(event.getType())) { return; } @@ -924,8 +919,7 @@ public class ZkStateReader implements Closeable { @Override public void process(WatchedEvent event) { - // session events are not change events, - // and do not remove the watcher + // session events are not change events, and do not remove the watcher if (EventType.None.equals(event.getType())) { return; }