From 89a11fed071614a3479020cf5299c3ecb477efa2 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Mon, 26 Feb 2018 18:48:30 +0100 Subject: [PATCH] Don't rediscover etcd cluster topology when watch timed out (#630) but switch to the next node if it is possible. Fixes https://github.com/zalando/patroni/issues/628 --- patroni/dcs/etcd.py | 7 +++++-- tests/test_etcd.py | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/patroni/dcs/etcd.py b/patroni/dcs/etcd.py index c945a798..a5809d1c 100644 --- a/patroni/dcs/etcd.py +++ b/patroni/dcs/etcd.py @@ -210,8 +210,11 @@ class Client(etcd.Client): self._machines_cache = self.machines if self._base_uri in self._machines_cache: self._machines_cache.remove(self._base_uri) - except etcd.EtcdConnectionFailed: - self._update_machines_cache = True + except etcd.EtcdConnectionFailed as e: + if isinstance(e, etcd.EtcdWatchTimedOut) and self._machines_cache: + self._base_uri = self._next_server() + else: + self._update_machines_cache = True if not response: raise return self._handle_server_response(response) diff --git a/tests/test_etcd.py b/tests/test_etcd.py index c4c11729..f6159131 100644 --- a/tests/test_etcd.py +++ b/tests/test_etcd.py @@ -207,6 +207,7 @@ class TestClient(unittest.TestCase): mock_machines.__get__ = Mock(return_value=['http://localhost:2379']) self.client._machines_cache_updated = 0 self.client.api_execute('/', 'POST', timeout=0) + self.client._machines_cache = [self.client._base_uri] self.assertRaises(etcd.EtcdWatchTimedOut, self.client.api_execute, '/timeout', 'POST', params={'wait': 'true'}) self.assertRaises(etcd.EtcdException, self.client.api_execute, '/', '') self.client._update_machines_cache = True