Skip to content

Commit baf6661

Browse files
committed
Avoid AssertionError on first write attempt during replica set failover, PYTHON-601.
1 parent 47ec939 commit baf6661

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

pymongo/pool.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,8 @@ def discard_socket(self, sock_info):
393393
def maybe_return_socket(self, sock_info):
394394
"""Return the socket to the pool unless it's the request socket.
395395
"""
396-
# These sentinel values should only be used internally.
397-
assert sock_info not in (NO_REQUEST, NO_SOCKET_YET)
396+
if sock_info in (NO_REQUEST, NO_SOCKET_YET):
397+
return
398398

399399
if self.pid != os.getpid():
400400
if not sock_info.forced:

test/high_availability/test_ha.py

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,9 @@ def setUp(self):
388388
res = ha_tools.start_replica_set([{}, {}, {}])
389389
self.seed, self.name = res
390390

391+
# Disable periodic refresh.
392+
Monitor._refresh_interval = 1e6
393+
391394
def test_writes_with_failover(self):
392395
c = MongoReplicaSetClient(
393396
self.seed, replicaSet=self.name, use_greenlets=use_greenlets)
@@ -398,21 +401,35 @@ def test_writes_with_failover(self):
398401
db.test.insert({'foo': 'bar'}, w=w)
399402
self.assertEqual('bar', db.test.find_one()['foo'])
400403

401-
def try_write():
402-
for _ in xrange(30):
403-
try:
404-
db.test.insert({'bar': 'baz'})
405-
return True
406-
except AutoReconnect:
407-
sleep(1)
408-
return False
409-
410404
killed = ha_tools.kill_primary(9)
411405
self.assertTrue(bool(len(killed)))
412-
self.assertTrue(try_write())
406+
407+
# Wait past pool's check interval, so it throws an error from
408+
# get_socket().
409+
sleep(1)
410+
411+
# Verify that we only raise AutoReconnect, not some other error,
412+
# while we wait for new primary.
413+
for _ in xrange(10000):
414+
try:
415+
db.test.insert({'bar': 'baz'})
416+
417+
# No error, found primary.
418+
break
419+
except AutoReconnect:
420+
sleep(.01)
421+
else:
422+
self.fail("Couldn't connect to new primary")
423+
424+
# Found new primary.
425+
self.assertTrue(c.primary)
413426
self.assertTrue(primary != c.primary)
414427
self.assertEqual('baz', db.test.find_one({'bar': 'baz'})['bar'])
415428

429+
def tearDown(self):
430+
Monitor._refresh_interval = MONITOR_INTERVAL
431+
super(TestWritesWithFailover, self).tearDown()
432+
416433

417434
class TestReadWithFailover(HATestCase):
418435

0 commit comments

Comments
 (0)