From a2736cd2b7d09e025aa0cba4c585c07a31f9e01d Mon Sep 17 00:00:00 2001 From: Oleksii Kliukin Date: Mon, 26 Oct 2015 10:36:34 +0100 Subject: [PATCH] Add nofailover property to Patroni and Cluster. Add checks for nofailover tag in is_failover_possible in order to save on API calls for the nodes with this tag set. --- patroni/__init__.py | 4 ++++ patroni/dcs.py | 4 ++++ patroni/ha.py | 7 +++---- tests/test_ha.py | 1 + 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/patroni/__init__.py b/patroni/__init__.py index 5769a8fc..78d8e619 100644 --- a/patroni/__init__.py +++ b/patroni/__init__.py @@ -26,6 +26,10 @@ class Patroni: self.ha = Ha(self) self.next_run = time.time() + @property + def nofailover(self): + return self.tags.get('nofailover') + @staticmethod def get_dcs(name, config): if 'etcd' in config: diff --git a/patroni/dcs.py b/patroni/dcs.py index 25e44cd1..b1ed5169 100644 --- a/patroni/dcs.py +++ b/patroni/dcs.py @@ -63,6 +63,10 @@ class Member(namedtuple('Member', 'index,name,session,data')): def api_url(self): return self.data.get('api_url', None) + @property + def nofailover(self): + return self.data.get('tags', {}).get('nofailover') + class Leader(namedtuple('Leader', 'index,session,member')): diff --git a/patroni/ha.py b/patroni/ha.py index 7a632673..cb2d8a5d 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -169,15 +169,14 @@ class Ha: if self.state_handler.is_leader(): return True - if self.patroni.tags.get('nofailover') is True: + if self.patroni.nofailover is True: return False if check_replication_lag and not self.state_handler.check_replication_lag(self.cluster.last_leader_operation): return False # Too far behind last reported xlog location on master # Prepare list of nodes to run check against - members = [m for m in members if m.name != self.state_handler.name - and not m.data.get('tags', {}).get('nofailover', None) and m.api_url] + members = [m for m in members if m.name != self.state_handler.name and not m.nofailover and m.api_url] if members: my_xlog_location = self.state_handler.xlog_position() @@ -192,7 +191,7 @@ class Ha: def is_failover_possible(self, members): ret = False - members = [m for m in members if m.name != self.state_handler.name and m.api_url] + members = [m for m in members if m.name != self.state_handler.name and not m.nofailover and m.api_url] if members: for member, reachable, in_recovery, xlog_location, tags in self.fetch_nodes_statuses(members): if reachable and not tags.get('nofailover'): diff --git a/tests/test_ha.py b/tests/test_ha.py index 32248c61..8079fbd0 100644 --- a/tests/test_ha.py +++ b/tests/test_ha.py @@ -83,6 +83,7 @@ class MockPatroni: self.dcs = d self.api = Mock() self.tags = {} + self.nofailover = None self.api.connection_string = 'http://127.0.0.1:8008'