Skip to content

Commit a3b02b5

Browse files
mongodb+srv:// seed-list support (#289)
* add mongodb+srv:// support * Cleanup * Remove test logging * Move raise -> log+raise * Fix URI check + build.sh * Fix missing 'e' in except-line * revert 3.6 tools * 1.4.0 -> 1.4.1 version * Fix flake8 warn * Add --no-cache back
1 parent 6a11e79 commit a3b02b5

File tree

8 files changed

+64
-22
lines changed

8 files changed

+64
-22
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.4.0
1+
1.4.1

mongodb_consistent_backup/Backup/Mongodump/Mongodump.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,20 +126,24 @@ def run(self):
126126

127127
# backup a secondary from each shard:
128128
for shard in self.replsets:
129-
secondary = self.replsets[shard].find_secondary()
130-
mongo_uri = secondary['uri']
131-
self.states[shard] = OplogState(self.manager, mongo_uri)
132-
thread = MongodumpThread(
133-
self.states[shard],
134-
mongo_uri,
135-
self.timer,
136-
self.config,
137-
self.backup_dir,
138-
self.version,
139-
self.threads(),
140-
self.do_gzip()
141-
)
142-
self.dump_threads.append(thread)
129+
try:
130+
secondary = self.replsets[shard].find_secondary()
131+
mongo_uri = secondary['uri']
132+
self.states[shard] = OplogState(self.manager, mongo_uri)
133+
thread = MongodumpThread(
134+
self.states[shard],
135+
mongo_uri,
136+
self.timer,
137+
self.config,
138+
self.backup_dir,
139+
self.version,
140+
self.threads(),
141+
self.do_gzip()
142+
)
143+
self.dump_threads.append(thread)
144+
except Exception, e:
145+
logging.error("Failed to get secondary for shard %s: %s" % (shard, e))
146+
raise e
143147

144148
if not len(self.dump_threads) > 0:
145149
raise OperationError('No backup threads started!')

mongodb_consistent_backup/Backup/Mongodump/MongodumpThread.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,24 @@ def wait(self):
138138
def mongodump_cmd(self):
139139
mongodump_uri = self.uri.get()
140140
mongodump_cmd = [self.binary]
141-
mongodump_flags = [
142-
"--host=%s" % mongodump_uri.host,
143-
"--port=%s" % str(mongodump_uri.port),
141+
mongodump_flags = []
142+
143+
# --host/--port (suport mongodb+srv:// too)
144+
if self.uri.srv:
145+
if not self.is_version_gte("3.6.0"):
146+
logging.fatal("Mongodump must be >= 3.6.0 to use mongodb+srv:// URIs")
147+
sys.exit(1)
148+
mongodump_flags.append("--host=%s" % self.uri.url)
149+
else:
150+
mongodump_flags.extend([
151+
"--host=%s" % mongodump_uri.host,
152+
"--port=%s" % str(mongodump_uri.port)
153+
])
154+
155+
mongodump_flags.extend([
144156
"--oplog",
145157
"--out=%s/dump" % self.backup_dir
146-
]
158+
])
147159

148160
# --numParallelCollections
149161
if self.threads > 0:

mongodb_consistent_backup/Common/DB.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from bson.codec_options import CodecOptions
44
from inspect import currentframe, getframeinfo
55
from pymongo import DESCENDING, CursorType, MongoClient
6-
from pymongo.errors import ConnectionFailure, OperationFailure, ServerSelectionTimeoutError
6+
from pymongo.errors import ConfigurationError, ConnectionFailure, OperationFailure, ServerSelectionTimeoutError
77
from ssl import CERT_REQUIRED, CERT_NONE
88
from time import sleep
99

@@ -113,7 +113,7 @@ def connect(self):
113113
conn = MongoClient(**self.client_opts())
114114
if self.do_connect:
115115
conn['admin'].command({"ping": 1})
116-
except (ConnectionFailure, OperationFailure, ServerSelectionTimeoutError), e:
116+
except (ConfigurationError, ConnectionFailure, OperationFailure, ServerSelectionTimeoutError), e:
117117
logging.error("Unable to connect to %s! Error: %s" % (self.uri, e))
118118
raise DBConnectionError(e)
119119
if conn is not None:

mongodb_consistent_backup/Common/MongoUri.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import re
2+
13
from Util import validate_hostname
4+
from mongodb_consistent_backup.Errors import OperationError
25

36

47
class MongoAddr:
@@ -22,19 +25,24 @@ def __init__(self, url, default_port=27017, replset=None):
2225
self.default_port = default_port
2326
self.replset = replset
2427

28+
self.srv = False
2529
self.addrs = []
2630
self.addr_idx = 0
2731

2832
self.parse()
2933

3034
def hosts(self):
35+
if self.srv:
36+
return self.url
3137
if len(self.addrs) > 0:
3238
hosts = []
3339
for addr in self.addrs:
3440
hosts.append(str(addr))
3541
return ",".join(hosts)
3642

3743
def str(self):
44+
if self.srv:
45+
return self.url
3846
string = self.hosts()
3947
if self.replset:
4048
string = "%s/%s" % (self.replset, string)
@@ -44,6 +52,15 @@ def __str__(self):
4452
return self.str()
4553

4654
def parse(self):
55+
# allow mongodb+srv:// URI
56+
if self.url.startswith("mongodb+srv://"):
57+
rsSearch = re.search(r'replicaSet=(\S+)(&.+)?$', self.url)
58+
if not rsSearch:
59+
raise OperationError("replicaSet=X flag required when using mongodb+srv:// URI")
60+
self.replset = rsSearch.group(1)
61+
self.srv = True
62+
return True
63+
4764
if "/" in self.url:
4865
self.replset, self.url = self.url.split("/")
4966
for url in self.url.split(","):

mongodb_consistent_backup/Pipeline/Stage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ def run(self):
8484
data = self._task.run()
8585
self.stopped = True
8686
except Exception, e:
87+
logging.error("State %s returned error: %s" % (self.stage, e))
8788
raise OperationError(e)
8889
finally:
8990
self.running = False

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ yconf==0.3.4
1010
google_compute_engine==2.7.2
1111
progress==1.3
1212
py-zabbix==1.1.3
13+
dnspython==1.15

scripts/build.sh

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,14 @@ if [ -d ${srcdir} ]; then
103103
pip_flags="--download-cache=${pipdir}"
104104
${venvdir}/bin/python2.7 ${venvdir}/bin/pip --help | grep -q '\-\-cache\-dir'
105105
[ $? = 0 ] && pip_flags="--cache-dir=${pipdir}"
106-
${venvdir}/bin/python2.7 ${venvdir}/bin/pip install ${pip_flags} pex requests
106+
${venvdir}/bin/python2.7 ${venvdir}/bin/pip install ${pip_flags} "requests"
107+
if [ $? -gt 0 ]; then
108+
echo "Failed to install 'requests'!"
109+
exit 1
110+
fi
111+
112+
# build fails on Pex 1.5+
113+
${venvdir}/bin/python2.7 ${venvdir}/bin/pip install ${pip_flags} "pex<=1.4"
107114
if [ $? -gt 0 ]; then
108115
echo "Failed to install pex utility for building!"
109116
exit 1

0 commit comments

Comments
 (0)