Skip to content

Commit 5979886

Browse files
Only put the tag-parsing part of the parse_read_pref logic in Common/DB.py, move some specific stuff back to Backup/Mongodump/MongodumpThread.py. Added tag-awareness to Replication/Replset.py so we can score/find members properly
1 parent a5e7c4c commit 5979886

File tree

4 files changed

+44
-21
lines changed

4 files changed

+44
-21
lines changed

mongodb_consistent_backup/Backup/Mongodump/MongodumpThread.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from signal import signal, SIGINT, SIGTERM, SIG_IGN
1010
from subprocess import Popen, PIPE
1111

12-
from mongodb_consistent_backup.Common import is_datetime, parse_config_bool, parse_read_pref
12+
from mongodb_consistent_backup.Common import is_datetime, parse_config_bool, parse_read_pref_tags
1313
from mongodb_consistent_backup.Oplog import Oplog
1414

1515

@@ -69,6 +69,12 @@ def is_version_gte(self, compare):
6969
return True
7070
return False
7171

72+
def parse_read_pref(self, mode="secondary"):
73+
rp = {"mode": mode}
74+
if self.read_pref_tags:
75+
rp["tags"] = parse_read_pref_tags(self.read_pref_tags)
76+
return json.dumps(rp)
77+
7278
def parse_mongodump_line(self, line):
7379
try:
7480
line = line.rstrip()
@@ -149,7 +155,7 @@ def mongodump_cmd(self):
149155

150156
# --readPreference
151157
if self.is_version_gte("3.2.0"):
152-
read_pref = parse_read_pref("secondary", self.read_pref_tags)
158+
read_pref = self.parse_read_pref()
153159
if read_pref:
154160
mongodump_flags.append("--readPreference=%s" % json.dumps(read_pref))
155161
elif self.read_pref_tags:

mongodb_consistent_backup/Common/DB.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@
1111
from mongodb_consistent_backup.Errors import DBAuthenticationError, DBConnectionError, DBOperationError, Error
1212

1313

14-
def parse_read_pref(mode="secondary", tags_str=None):
15-
rp = {"mode": mode}
16-
if tags_str:
17-
rp["tags"] = {}
18-
for pair in tags_str.replace(" ", "").split(","):
19-
if ":" in pair:
20-
key, value = pair.split(":")
21-
rp["tags"][key] = str(value)
22-
return rp
14+
def parse_read_pref_tags(tags_str):
15+
tags = {}
16+
for pair in tags_str.replace(" ", "").split(","):
17+
if ":" in pair:
18+
key, value = pair.split(":")
19+
tags[key] = str(value)
20+
return tags
2321

2422

2523
class DB:

mongodb_consistent_backup/Common/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from Config import Config, parse_config_bool # NOQA
2-
from DB import DB, parse_read_pref # NOQA
2+
from DB import DB, parse_read_pref_tags # NOQA
33
from LocalCommand import LocalCommand # NOQA
44
from Lock import Lock # NOQA
55
from MongoUri import MongoUri # NOQA

mongodb_consistent_backup/Replication/Replset.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@
44
from math import ceil
55
from time import mktime
66

7-
from mongodb_consistent_backup.Common import DB, MongoUri
7+
from mongodb_consistent_backup.Common import DB, MongoUri, parse_read_pref_tags
88
from mongodb_consistent_backup.Errors import Error, OperationError
99

1010

1111
class Replset:
1212
def __init__(self, config, db):
13-
self.config = config
14-
self.db = db
15-
self.max_lag_secs = self.config.replication.max_lag_secs
16-
self.min_priority = self.config.replication.min_priority
17-
self.max_priority = self.config.replication.max_priority
18-
self.hidden_only = self.config.replication.hidden_only
13+
self.config = config
14+
self.db = db
15+
self.read_pref_tags = self.config.replication.read_pref_tags
16+
self.max_lag_secs = self.config.replication.max_lag_secs
17+
self.min_priority = self.config.replication.min_priority
18+
self.max_priority = self.config.replication.max_priority
19+
self.hidden_only = self.config.replication.hidden_only
1920

2021
self.hidden_weight = 0.20
2122
self.pri0_weight = 0.10
@@ -139,6 +140,18 @@ def is_member_electable(self, member):
139140
return True
140141
return False
141142

143+
def has_read_pref_tags(self, member_config):
144+
if "tags" not in member_config:
145+
raise OperationError("Member config has no 'tags' field!")
146+
tags = parse_read_pref_tags(self.read_pref_tags)
147+
member_tags = member_config["tags"]
148+
for key in tags:
149+
if key not in member_tags:
150+
return False
151+
if member_tags[key] != tags[key]:
152+
return False
153+
return True
154+
142155
def find_primary(self, force=False, quiet=False):
143156
if force or not self.primary:
144157
rs_status = self.get_rs_status(force, quiet)
@@ -170,8 +183,8 @@ def find_secondary(self, force=False, quiet=False):
170183
self.get_rs_config(force, quiet)
171184
self.get_mongo_config(force, quiet)
172185

173-
quorum = self.get_rs_quorum()
174-
rs_name = rs_status['set']
186+
quorum = self.get_rs_quorum()
187+
rs_name = rs_status['set']
175188

176189
if self.secondary and not force:
177190
return self.secondary
@@ -193,6 +206,12 @@ def find_secondary(self, force=False, quiet=False):
193206
score = self.max_lag_secs * 10
194207
score_scale = 100 / score
195208
priority = 0
209+
210+
if self.read_pref_tags:
211+
if not self.has_read_pref_tags(member_config):
212+
logging.info("Found SECONDARY %s without required read preference tags, skipping" % member_uri)
213+
continue
214+
196215
if 'hidden' in member_config and member_config['hidden']:
197216
score += (score * self.hidden_weight)
198217
log_data['hidden'] = True

0 commit comments

Comments
 (0)