From 63ee42a85ceae2f443a3071ec7385a348f33f5f0 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Tue, 30 Nov 2021 16:33:38 +0100 Subject: [PATCH] Clear event on the leader node when /status was updated (#2125) Not doing so causing excessive HA loop runs with Zookeeper. This moment wasn't fixed correctly in the #1875 --- patroni/dcs/zookeeper.py | 23 +++++++++++++---------- tests/test_zookeeper.py | 2 ++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/patroni/dcs/zookeeper.py b/patroni/dcs/zookeeper.py index 4ac03cad..71ef44ea 100644 --- a/patroni/dcs/zookeeper.py +++ b/patroni/dcs/zookeeper.py @@ -283,17 +283,20 @@ class ZooKeeper(AbstractDCS): logger.exception('get_cluster') self.cluster_watcher(None) raise ZooKeeperError('ZooKeeper in not responding properly') - # The /status ZNode was updated or doesn't exist and we are not leader - elif (self._fetch_status and not self._fetch_cluster or not cluster.last_lsn - or cluster.has_permanent_logical_slots(self._name, False) and not cluster.slots) and\ - not (cluster.leader and cluster.leader.name == self._name): - try: - last_lsn, slots = self.get_status(cluster.leader) + # The /status ZNode was updated or doesn't exist + elif self._fetch_status and not self._fetch_cluster or not cluster.last_lsn \ + or cluster.has_permanent_logical_slots(self._name, False) and not cluster.slots: + # If current node is the leader just clear the event without fetching anything (we are updating the /status) + if cluster.leader and cluster.leader.name == self._name: self.event.clear() - cluster = Cluster(cluster.initialize, cluster.config, cluster.leader, last_lsn, - cluster.members, cluster.failover, cluster.sync, cluster.history, slots) - except Exception: - pass + else: + try: + last_lsn, slots = self.get_status(cluster.leader) + self.event.clear() + cluster = Cluster(cluster.initialize, cluster.config, cluster.leader, last_lsn, + cluster.members, cluster.failover, cluster.sync, cluster.history, slots) + except Exception: + pass return cluster def _bypass_caches(self): diff --git a/tests/test_zookeeper.py b/tests/test_zookeeper.py index 09857fb2..4ff89d8b 100644 --- a/tests/test_zookeeper.py +++ b/tests/test_zookeeper.py @@ -173,6 +173,8 @@ class TestZooKeeper(unittest.TestCase): self.assertRaises(ZooKeeperError, self.zk.get_cluster) cluster = self.zk.get_cluster(True) self.assertIsInstance(cluster.leader, Leader) + self.zk.status_watcher(None) + self.zk.get_cluster() self.zk.touch_member({'foo': 'foo'}) self.zk._name = 'bar' self.zk.status_watcher(None)