From 19c80df442b8afaa8ef136e50bd850b080bab1e5 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Fri, 2 Sep 2016 13:44:47 +0200 Subject: [PATCH] Try to mitigate EtcdEventIndexCleared exception (#287) This error is send by etcd when Patroni is doing "watch" on leader key which is never updated after creation and etcd cluster receives a lot of updates, what cleans history of events. Instead of doing watch on modifiedIndex + 1 we will do watch on X-Etcd-Index, which is probably still available... --- patroni/dcs/etcd.py | 5 +++-- tests/test_etcd.py | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/patroni/dcs/etcd.py b/patroni/dcs/etcd.py index d81cf968..c58a2ddb 100644 --- a/patroni/dcs/etcd.py +++ b/patroni/dcs/etcd.py @@ -292,7 +292,8 @@ class Etcd(AbstractDCS): if leader: member = Member(-1, leader.value, None, {}) member = ([m for m in members if m.name == leader.value] or [member])[0] - leader = Leader(leader.modifiedIndex, leader.ttl, member) + index = result.etcd_index if result.etcd_index > leader.modifiedIndex else leader.modifiedIndex + 1 + leader = Leader(index, leader.ttl, member) # failover key failover = nodes.get(self._FAILOVER) @@ -371,7 +372,7 @@ class Etcd(AbstractDCS): while timeout >= 1: # when timeout is too small urllib3 doesn't have enough time to connect try: - self._client.watch(self.leader_path, index=cluster.leader.index + 1, timeout=timeout + 0.5) + self._client.watch(self.leader_path, index=cluster.leader.index, timeout=timeout + 0.5) # Synchronous work of all cluster members with etcd is less expensive # than reestablishing http connection every time from every replica. return True diff --git a/tests/test_etcd.py b/tests/test_etcd.py index f3a32a41..16035d6e 100644 --- a/tests/test_etcd.py +++ b/tests/test_etcd.py @@ -103,7 +103,9 @@ def etcd_read(self, key, **kwargs): "expiration": "2015-05-15T09:11:09.611860899Z", "ttl": 30, "modifiedIndex": 20730, "createdIndex": 20730}], "modifiedIndex": 1581, "createdIndex": 1581}], "modifiedIndex": 1581, "createdIndex": 1581}} - return etcd.EtcdResult(**response) + result = etcd.EtcdResult(**response) + result.etcd_index = 0 + return result class SleepException(Exception):