Skip to content

Commit 4915a15

Browse files
committed
Fix test_ship_of_theseus.
1 parent d0fdb89 commit 4915a15

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

test/high_availability/ha_tools.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,18 @@ def create_sharded_cluster(num_routers=3):
269269

270270
# Connect to a random member
271271
def get_client():
272-
return pymongo.MongoClient(
273-
nodes.keys(),
274-
read_preference=ReadPreference.PRIMARY_PREFERRED,
275-
use_greenlets=use_greenlets)
272+
# Attempt a direct connection to each node until one succeeds. Using a
273+
# non-PRIMARY read preference allows us to use the node even if it's a
274+
# secondary.
275+
for i, node in enumerate(nodes.keys()):
276+
try:
277+
return pymongo.MongoClient(
278+
node,
279+
read_preference=ReadPreference.PRIMARY_PREFERRED,
280+
use_greenlets=use_greenlets)
281+
except pymongo.errors.ConnectionFailure:
282+
if i == len(nodes.keys()) - 1:
283+
raise
276284

277285

278286
def get_mongos_seed_list():
@@ -301,7 +309,7 @@ def get_primary():
301309
assert len(primaries) <= 1
302310
if primaries:
303311
return primaries[0]
304-
except pymongo.errors.ConnectionFailure:
312+
except (pymongo.errors.ConnectionFailure, pymongo.errors.OperationFailure):
305313
pass
306314

307315
return None
@@ -379,6 +387,7 @@ def add_member(auth=False):
379387
global cur_port
380388
host = '%s:%d' % (hostname, cur_port)
381389
primary = get_primary()
390+
assert primary
382391
c = pymongo.MongoClient(primary, use_greenlets=use_greenlets)
383392
config = c.local.system.replset.find_one()
384393
_id = max([member['_id'] for member in config['members']]) + 1

test/high_availability/test_ha.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,21 @@ def test_ship_of_theseus(self):
10821082
primary = ha_tools.get_primary()
10831083
secondary1 = ha_tools.get_random_secondary()
10841084

1085-
new_hosts = [ha_tools.add_member() for _ in range(3)]
1085+
new_hosts = []
1086+
for i in range(3):
1087+
new_hosts.append(ha_tools.add_member())
1088+
1089+
# RS closes all connections after reconfig.
1090+
for j in xrange(30):
1091+
try:
1092+
if ha_tools.get_primary():
1093+
break
1094+
except (ConnectionFailure, OperationFailure):
1095+
pass
1096+
1097+
sleep(1)
1098+
else:
1099+
self.fail("Couldn't recover from reconfig")
10861100

10871101
# Wait for new members to join.
10881102
for _ in xrange(120):
@@ -1094,6 +1108,7 @@ def test_ship_of_theseus(self):
10941108
self.fail("New secondaries didn't join")
10951109

10961110
ha_tools.kill_members([primary, secondary1], 9)
1111+
sleep(5)
10971112

10981113
# Wait for primary.
10991114
for _ in xrange(30):
@@ -1132,6 +1147,18 @@ def test_ship_of_theseus(self):
11321147

11331148
ha_tools.restart_members([primary, secondary1])
11341149

1150+
# Wait for members to figure out they're secondaries.
1151+
for _ in xrange(30):
1152+
try:
1153+
if len(ha_tools.get_secondaries()) == 2:
1154+
break
1155+
except ConnectionFailure:
1156+
pass
1157+
1158+
sleep(1)
1159+
else:
1160+
self.fail("Original members didn't become secondaries")
1161+
11351162
# Should be able to reconnect to set again.
11361163
sleep(2 * MONITOR_INTERVAL)
11371164
find_one(read_preference=SECONDARY)

0 commit comments

Comments
 (0)