From f164d8b3f8eb143d6ebcb405ac658214d51d5dc4 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Tue, 12 Sep 2017 20:41:16 +0200 Subject: [PATCH 1/3] Raise exception if score is zero --- .../Replication/Replset.py | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/mongodb_consistent_backup/Replication/Replset.py b/mongodb_consistent_backup/Replication/Replset.py index 72e1689b..7bf081ea 100644 --- a/mongodb_consistent_backup/Replication/Replset.py +++ b/mongodb_consistent_backup/Replication/Replset.py @@ -12,13 +12,16 @@ class Replset: def __init__(self, config, db): self.config = config self.db = db - self.max_lag_secs = self.config.replication.max_lag_secs - self.min_priority = self.config.replication.min_priority - self.max_priority = self.config.replication.max_priority + self.max_lag_secs = int(self.config.replication.max_lag_secs) + self.min_priority = int(self.config.replication.min_priority) + self.max_priority = int(self.config.replication.max_priority) self.hidden_only = self.config.replication.hidden_only - self.hidden_weight = 0.20 - self.pri0_weight = 0.10 + self.state_primary = 1 + self.state_secondary = 2 + self.state_arbiter = 7 + self.hidden_weight = 0.20 + self.pri0_weight = 0.10 self.replset = True self.rs_config = None @@ -144,7 +147,7 @@ def find_primary(self, force=False, quiet=False): rs_status = self.get_rs_status(force, quiet) rs_name = rs_status['set'] for member in rs_status['members']: - if member['stateStr'] == 'PRIMARY' and member['health'] > 0: + if member['state'] == self.state_primary and member['health'] > 0: member_uri = MongoUri(member['name'], 27017, rs_name) optime_ts = member['optime'] if isinstance(member['optime'], dict) and 'ts' in member['optime']: @@ -184,11 +187,11 @@ def find_secondary(self, force=False, quiet=False): if self.is_member_electable(member_config): electable_count += 1 - if member['state'] == 7: + if member['state'] == self.state_arbiter: logging.info("Found ARBITER %s, skipping" % member_uri) - elif member['state'] > 2: + elif member['state'] > self.state_secondary: logging.warning("Found down or unhealthy SECONDARY %s with state: %s" % (member_uri, member['stateStr'])) - elif member['state'] == 2 and member['health'] > 0: + elif member['state'] == self.state_secondary and member['health'] > 0: log_data = {} score = self.max_lag_secs * 10 score_scale = 100 / score @@ -224,6 +227,10 @@ def find_secondary(self, force=False, quiet=False): else: log_msg = "Found SECONDARY %s with too high replication lag! Skipping" % member_uri + if self.secondary['score'] == 0: + logging.error("Chosen SECONDARY %s has a score of zero/0! This is unexpected, exiting" % member_uri) + raise OperationError("Chosen SECONDARY %s has a score of zero/0!" % member_uri) + if 'configsvr' in rs_status and rs_status['configsvr']: log_data['configsvr'] = True From 8c228ed87d83e50e49da7edb373e53ab851806b1 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Tue, 12 Sep 2017 22:05:21 +0200 Subject: [PATCH 2/3] 'score_scale' multiplier needs to be a float or odd-numbers will break it --- mongodb_consistent_backup/Replication/Replset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongodb_consistent_backup/Replication/Replset.py b/mongodb_consistent_backup/Replication/Replset.py index 7bf081ea..95ffdf2e 100644 --- a/mongodb_consistent_backup/Replication/Replset.py +++ b/mongodb_consistent_backup/Replication/Replset.py @@ -194,7 +194,7 @@ def find_secondary(self, force=False, quiet=False): elif member['state'] == self.state_secondary and member['health'] > 0: log_data = {} score = self.max_lag_secs * 10 - score_scale = 100 / score + score_scale = 100.00 / float(score) priority = 0 if 'hidden' in member_config and member_config['hidden']: score += (score * self.hidden_weight) From 72d6263e247057c1d266a4e60ad2f970cbceb424 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Tue, 12 Sep 2017 22:06:27 +0200 Subject: [PATCH 3/3] don't need to force int --- mongodb_consistent_backup/Replication/Replset.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mongodb_consistent_backup/Replication/Replset.py b/mongodb_consistent_backup/Replication/Replset.py index 95ffdf2e..408053af 100644 --- a/mongodb_consistent_backup/Replication/Replset.py +++ b/mongodb_consistent_backup/Replication/Replset.py @@ -12,9 +12,9 @@ class Replset: def __init__(self, config, db): self.config = config self.db = db - self.max_lag_secs = int(self.config.replication.max_lag_secs) - self.min_priority = int(self.config.replication.min_priority) - self.max_priority = int(self.config.replication.max_priority) + self.max_lag_secs = self.config.replication.max_lag_secs + self.min_priority = self.config.replication.min_priority + self.max_priority = self.config.replication.max_priority self.hidden_only = self.config.replication.hidden_only self.state_primary = 1