From ccf48e700f5f40af34e811359005448269847699 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Fri, 9 Jun 2017 18:17:39 +0200 Subject: [PATCH 1/2] Only apply quorum checking to voting members --- mongodb_consistent_backup/Replication/Replset.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mongodb_consistent_backup/Replication/Replset.py b/mongodb_consistent_backup/Replication/Replset.py index 9f8fb1ac..68c7a3e2 100644 --- a/mongodb_consistent_backup/Replication/Replset.py +++ b/mongodb_consistent_backup/Replication/Replset.py @@ -116,6 +116,18 @@ def get_repl_lag(self, rs_member): rep_lag = 0 return rep_lag, member_optime_ts + def get_voting_members(self): + voting = [] + rs_status = self.get_rs_status(force, quiet) + for member in rs_status['members']: + if 'vote' in member and member['vote'] == 1: + voting.append(member) + return voting + + def get_rs_quorum(self): + voting_members = len(self.get_voting_members()) + return ceil(voting_members / 2.0) + def find_primary(self, force=False, quiet=False): if force or not self.primary: rs_status = self.get_rs_status(force, quiet) @@ -145,8 +157,8 @@ def find_secondary(self, force=False, quiet=False): rs_status = self.get_rs_status(force, quiet) rs_config = self.get_rs_config(force, quiet) db_config = self.get_mongo_config(force, quiet) + quorum = self.get_rs_quorum() rs_name = rs_status['set'] - quorum = ceil(len(rs_status['members']) / 2.0) if self.secondary and not force: return self.secondary From b3822be8b7d2698af122f88164a4a70ec22f1777 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Fri, 9 Jun 2017 18:32:30 +0200 Subject: [PATCH 2/2] Only apply quorum checking to electable members (not arbiter or priority=0) --- .../Replication/Replset.py | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/mongodb_consistent_backup/Replication/Replset.py b/mongodb_consistent_backup/Replication/Replset.py index 68c7a3e2..3351f88e 100644 --- a/mongodb_consistent_backup/Replication/Replset.py +++ b/mongodb_consistent_backup/Replication/Replset.py @@ -116,17 +116,20 @@ def get_repl_lag(self, rs_member): rep_lag = 0 return rep_lag, member_optime_ts - def get_voting_members(self): - voting = [] - rs_status = self.get_rs_status(force, quiet) - for member in rs_status['members']: - if 'vote' in member and member['vote'] == 1: - voting.append(member) - return voting + def get_electable_members(self, force=False): + electable = [] + rs_config = self.get_rs_config(force, True) + for member in rs_config['members']: + if 'arbiterOnly' in member and member['arbiterOnly'] == True: + continue + elif 'priority' in member and member['priority'] == 0: + continue + electable.append(member) + return electable def get_rs_quorum(self): - voting_members = len(self.get_voting_members()) - return ceil(voting_members / 2.0) + electable_members = len(self.get_electable_members()) + return ceil(electable_members / 2.0) def find_primary(self, force=False, quiet=False): if force or not self.primary: