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.
This commit is contained in:
Oleksii Kliukin
2015-10-26 10:40:34 +01:00
parent b7b47ffd79
commit a2736cd2b7
4 changed files with 12 additions and 4 deletions
+4
View File
@@ -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:
+4
View File
@@ -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')):
+3 -4
View File
@@ -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'):
+1
View File
@@ -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'