Skip to content

Commit d78c7a2

Browse files
author
Tim Vaillancourt
committed
broke get_configserver into 2 x defs and resolved some bugs
1 parent 61a5639 commit d78c7a2

File tree

5 files changed

+46
-42
lines changed

5 files changed

+46
-42
lines changed

MongoBackup/Backup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ def run(self):
282282
self.user,
283283
self.password,
284284
self.authdb,
285-
self.sharding.get_configserver(),
285+
self.sharding.get_config_server(),
286286
self.verbose
287287
)
288288
self.mongodumper_summary = self.mongodumper.run()

MongoBackup/Methods/Dumper.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ def __init__(self, secondaries, base_dir, binary, dump_gzip=False, user=None, pa
2020
self.config_server = config_server
2121
self.verbose = verbose
2222

23+
self.config_replset = False
2324
self.response_queue = Queue()
2425
self.threads = []
2526
self._summary = {}
2627

28+
if not isinstance(self.config_server, dict) and self.config_server in self.secondaries:
29+
self.config_replset = True
30+
2731
if not isinstance(self.secondaries, dict):
2832
raise Exception, "Field 'secondaries' must be a dictionary of secondary info (by shard)!", None
2933

@@ -77,22 +81,6 @@ def run(self):
7781
)
7882
self.threads.append(thread)
7983

80-
# backup a single replica-set config server alongside the shards, if exists:
81-
if self.config_server and self.config_server['replSet']:
82-
thread = Dump(
83-
self.response_queue,
84-
'config',
85-
self.config_server['host'],
86-
self.user,
87-
self.password,
88-
self.authdb,
89-
self.base_dir,
90-
self.binary,
91-
self.dump_gzip,
92-
self.verbose
93-
)
94-
self.threads.append(thread)
95-
9684
if not len(self.threads) > 0:
9785
raise Exception, 'No backup threads started!', None
9886

@@ -104,11 +92,11 @@ def run(self):
10492
self.wait()
10593

10694
# backup a single non-replset config server, if exists:
107-
if self.config_server and not self.config_server['replSet']:
108-
logging.debug("Using non-replset backup method for config server")
95+
if not self.config_replset and isinstance(self.config_server, dict):
96+
logging.info("Using non-replset backup method for config server")
10997
thread = Dump(
11098
self.response_queue,
111-
'config',
99+
'configsvr',
112100
self.config_server['host'],
113101
self.user,
114102
self.password,

MongoBackup/Replset.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ def get_rs_config(self, force=False, quiet=False):
4949
raise Exception, "Error getting replica set config! Error: %s" % e, None
5050
return self.rs_config
5151

52-
def rs_name(self):
53-
return self.get_rs_status['set']
52+
def get_rs_name(self):
53+
return self.get_rs_status()['set']
5454

5555
def find_primary(self, force=False, quiet=False):
5656
rs_status = self.get_rs_status(force, quiet)
@@ -70,7 +70,7 @@ def find_primary(self, force=False, quiet=False):
7070
str(optime_ts)
7171
))
7272
if self.primary is None:
73-
logging.fatal("Unable to locate a PRIMARY member for replset %s, giving up" % rs_name)
73+
logging.error("Unable to locate a PRIMARY member for replset %s, giving up" % rs_name)
7474
raise Exception, "Unable to locate a PRIMARY member for replset %s, giving up" % rs_name, None
7575
return self.primary
7676

@@ -123,7 +123,7 @@ def find_secondary(self, force=False, quiet=False):
123123
logging.info("%s: %s" % (log_msg, str(log_data)))
124124
if self.secondary is None or (self.secondary['count'] + 1) < quorum_count:
125125
secondary_count = self.secondary['count'] + 1 if self.secondary else 0
126-
logging.fatal("Not enough secondaries in replset %s to take backup! Num replset members: %i, required quorum: %i" % (
126+
logging.error("Not enough secondaries in replset %s to take backup! Num replset members: %i, required quorum: %i" % (
127127
rs_name,
128128
secondary_count,
129129
quorum_count

MongoBackup/ReplsetSharded.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ def get_replsets(self, force=False):
5555
except Exception, e:
5656
logging.fatal("Could not get Replset class object for replset %s! Error: %s" % (shard_name, e))
5757
raise e
58+
59+
configsvr = self.sharding.get_config_server()
60+
if configsvr and isinstance(configsvr, Replset):
61+
config_rs_name = configsvr.get_rs_name()
62+
self.replsets[config_rs_name] = configsvr
63+
5864
return self.replsets
5965

6066
def find_secondaries(self):

MongoBackup/Sharding.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def __init__(self, db, user=None, password=None, authdb='admin', balancer_wait_s
1616
self.balancer_sleep = balancer_sleep
1717

1818
self.config_server = None
19+
self.config_db = None
1920
self._balancer_state_start = None
2021

2122
# Get a DB connection
@@ -31,6 +32,8 @@ def __init__(self, db, user=None, password=None, authdb='admin', balancer_wait_s
3132
raise e
3233

3334
def close(self):
35+
if self.config_db:
36+
self.config_db.close()
3437
return self.restore_balancer_state()
3538

3639
def get_start_state(self):
@@ -98,8 +101,8 @@ def stop_balancer(self):
98101
logging.fatal("Could not stop balancer: %s:%i!" % (self.host, self.port))
99102
raise Exception, "Could not stop balancer: %s:%i" % (self.host, self.port), None
100103

101-
def get_configserver(self, force=False):
102-
if force or not self.config_server:
104+
def get_configdb_hosts(self):
105+
try:
103106
cmdlineopts = self.db.admin_command("getCmdLineOpts")
104107
config_string = None
105108
if cmdlineopts.get('parsed').get('configdb'):
@@ -109,26 +112,33 @@ def get_configserver(self, force=False):
109112
if config_string:
110113
# noinspection PyBroadException
111114
try:
112-
config_list = config_string.split(",")
115+
return config_string.split(',')
113116
except Exception:
114-
config_list = [config_string]
117+
return [config_string]
118+
else:
119+
logging.fatal("Unable to locate config servers for %s:%i!" % (self.host, self.port))
120+
raise Exception, "Unable to locate config servers for %s:%i!" % (self.host, self.port), None
121+
except Exception, e:
122+
raise e
115123

116-
db = None
124+
def get_config_server(self, force=False):
125+
if force or not self.config_server:
126+
configdb_hosts = self.get_configdb_hosts()
127+
try:
128+
config_host, config_port = configdb_hosts[0].split(":")
129+
logging.info("Found sharding config server: %s" % (config_host))
130+
131+
self.config_db = DB(config_host, config_port, self.user, self.password, self.authdb)
132+
rs = Replset(self.config_db, self.user, self.password, self.authdb)
117133
try:
118-
config_host, config_port = config_list[0].split(":")
119-
db = DB(config_host, config_port, self.user, self.password, self.authdb)
120-
rs = Replset(db, self.user, self.password, self.authdb)
121-
try:
122-
self.config_server = rs.find_secondary(True, True)
123-
except Exception:
124-
self.config_server = {'host': config_list[0], 'replSet': None}
125-
except Exception, e:
126-
raise e
134+
rs_status = rs.get_rs_status(False, True)
135+
self.config_server = rs
136+
except Exception:
137+
self.config_server = {'host': configdb_hosts[0]}
127138
finally:
128-
if db:
129-
db.close()
130-
131-
logging.debug("Found sharding config server: %s" % (self.config_server['host']))
139+
return self.config_server
140+
except Exception, e:
141+
raise e
132142
else:
133143
logging.fatal("Unable to locate config servers for %s:%i!" % (self.host, self.port))
134144
raise Exception, "Unable to locate config servers for %s:%i!" % (self.host, self.port), None

0 commit comments

Comments
 (0)