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...
This commit is contained in:
Alexander Kukushkin
2016-09-02 13:44:47 +02:00
committed by GitHub
parent b0beecffea
commit 19c80df442
2 changed files with 6 additions and 3 deletions
+3 -2
View File
@@ -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
+3 -1
View File
@@ -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):