def test_stepdown_triggers_refresh(self): c_find_one = MongoClient( self.seed, replicaSet=self.name, serverSelectionTimeoutMS=self.server_selection_timeout) c_count = MongoClient( self.seed, replicaSet=self.name, serverSelectionTimeoutMS=self.server_selection_timeout) # We've started the primary and one secondary wait_until(lambda: len(c_find_one.secondaries), "discover secondary") wait_until(lambda: len(c_count.secondaries), "discover secondary") ha_tools.stepdown_primary() # Trigger a refresh, both with a cursor and a command. self.assertRaises(AutoReconnect, c_find_one.test.test.find_one) self.assertRaises(AutoReconnect, c_count.test.command, 'count') # Both clients detect the stepdown *AND* re-check the server # immediately, they don't just mark it Unknown. Wait for the # immediate refresh to complete - we're not waiting for the # periodic refresh, which has been disabled wait_until(lambda: len(c_find_one.secondaries) == 2, "detect two secondaries") wait_until(lambda: len(c_count.secondaries) == 2, "detect two secondaries")
def test_stepdown_triggers_refresh(self): c_find_one = yield motor.MotorReplicaSetClient( self.seed, replicaSet=self.name).open() # We've started the primary and one secondary primary = ha_tools.get_primary() secondary = ha_tools.get_secondaries()[0] self.assertEqual(one(c_find_one.secondaries), _partition_node(secondary)) ha_tools.stepdown_primary() # Make sure the stepdown completes yield self.pause(1) # Trigger a refresh with assert_raises(AutoReconnect): yield c_find_one.test.test.find_one() # Wait for the immediate refresh to complete - we're not waiting for # the periodic refresh, which has been disabled yield self.pause(1) # We've detected the stepdown self.assertTrue(not c_find_one.primary or primary != _partition_node(c_find_one.primary))
def test_stepdown_triggers_refresh(self): c_find_one = MongoReplicaSetClient( self.seed, replicaSet=self.name, use_greenlets=use_greenlets) # We've started the primary and one secondary primary = ha_tools.get_primary() secondary = ha_tools.get_secondaries()[0] self.assertEqual( one(c_find_one.secondaries), _partition_node(secondary)) ha_tools.stepdown_primary() # Make sure the stepdown completes sleep(1) # Trigger a refresh self.assertRaises(AutoReconnect, c_find_one.test.test.find_one) # Wait for the immediate refresh to complete - we're not waiting for # the periodic refresh, which has been disabled sleep(1) # We've detected the stepdown self.assertTrue( not c_find_one.primary or _partition_node(primary) != c_find_one.primary)
def test_primary_stepdown(self): c = MongoReplicaSetClient(self.seed, replicaSet=self.name, use_greenlets=use_greenlets) self.assertTrue(bool(len(c.secondaries))) primary = c.primary ha_tools.stepdown_primary() # Wait for new primary patience_seconds = 30 for _ in xrange(patience_seconds): sleep(1) rs_state = c._MongoReplicaSetClient__rs_state if rs_state.writer and rs_state.writer != primary: if ha_tools.get_primary(): # New primary stepped up new_primary = _partition_node(ha_tools.get_primary()) self.assertEqual(new_primary, rs_state.writer) new_secondaries = partition_nodes( ha_tools.get_secondaries()) self.assertEqual(set(new_secondaries), rs_state.secondaries) break else: self.fail( "No new primary after %s seconds. Old primary was %s, current" " is %s" % (patience_seconds, primary, ha_tools.get_primary()))
def test_stepdown_triggers_refresh(self): c_find_one = yield motor.MotorReplicaSetClient( self.seed, replicaSet=self.name).open() # We've started the primary and one secondary primary = ha_tools.get_primary() secondary = ha_tools.get_secondaries()[0] self.assertEqual( one(c_find_one.secondaries), _partition_node(secondary)) ha_tools.stepdown_primary() # Make sure the stepdown completes yield self.pause(1) # Trigger a refresh with assert_raises(AutoReconnect): yield c_find_one.test.test.find_one() # Wait for the immediate refresh to complete - we're not waiting for # the periodic refresh, which has been disabled yield self.pause(1) # We've detected the stepdown self.assertTrue( not c_find_one.primary or primary != _partition_node(c_find_one.primary))
def test_stepdown_triggers_refresh(self): c_find_one = MongoReplicaSetClient(self.seed, replicaSet=self.name, use_greenlets=use_greenlets) # We've started the primary and one secondary primary = ha_tools.get_primary() secondary = ha_tools.get_secondaries()[0] self.assertEqual(one(c_find_one.secondaries), _partition_node(secondary)) ha_tools.stepdown_primary() # Make sure the stepdown completes sleep(1) # Trigger a refresh self.assertRaises(AutoReconnect, c_find_one.test.test.find_one) # Wait for the immediate refresh to complete - we're not waiting for # the periodic refresh, which has been disabled sleep(1) # We've detected the stepdown self.assertTrue(not c_find_one.primary or primary != _partition_node(c_find_one.primary))
def test_stepdown_triggers_refresh(self, done): c_find_one = motor.MotorReplicaSetClient( self.seed, replicaSet=self.name).open_sync() # We've started the primary and one secondary primary = ha_tools.get_primary() secondary = ha_tools.get_secondaries()[0] self.assertEqual( one(c_find_one.secondaries), _partition_node(secondary)) ha_tools.stepdown_primary() # Make sure the stepdown completes yield gen.Task(IOLoop.instance().add_timeout, time.time() + 1) # Trigger a refresh yield AssertRaises(AutoReconnect, c_find_one.test.test.find_one) # Wait for the immediate refresh to complete - we're not waiting for # the periodic refresh, which has been disabled yield gen.Task(IOLoop.instance().add_timeout, time.time() + 1) # We've detected the stepdown self.assertTrue( not c_find_one.primary or primary != _partition_node(c_find_one.primary)) done()
def test_last_error(self): c = MongoClient(self.seed, replicaSet=self.name, serverSelectionTimeoutMS=self.server_selection_timeout) wait_until(lambda: c.primary, "discover primary") wait_until(lambda: c.secondaries, "discover secondary") ha_tools.stepdown_primary() db = c.get_database("pymongo_test", write_concern=WriteConcern(w=0)) db.test.insert_one({}) response = db.error() self.assertTrue('err' in response and 'not master' in response['err']) wait_until(lambda: len(c.secondaries) == 2, "discover two secondaries")
def test_last_error(self): c = MongoClient( self.seed, replicaSet=self.name, serverSelectionTimeoutMS=self.server_selection_timeout) wait_until(lambda: c.primary, "discover primary") wait_until(lambda: c.secondaries, "discover secondary") ha_tools.stepdown_primary() db = c.get_database( "pymongo_test", write_concern=WriteConcern(w=0)) db.test.insert_one({}) response = db.error() self.assertTrue('err' in response and 'not master' in response['err']) wait_until(lambda: len(c.secondaries) == 2, "discover two secondaries")
def test_primary_stepdown(self): c = motor.MotorReplicaSetClient(self.seed, replicaSet=self.name) yield c.open() self.assertTrue(bool(len(c.secondaries))) primary = c.primary secondaries = c.secondaries.copy() ha_tools.stepdown_primary() # Wait for primary to step down, and for MotorReplicaSetClient # to detect it. for _ in xrange(30): if c.primary != primary and secondaries != c.secondaries: break yield self.pause(1) else: self.fail("New primary not detected")
def test_primary_stepdown(self): loop = IOLoop.instance() c = motor.MotorReplicaSetClient(self.seed, replicaSet=self.name) c self.assertTrue(bool(len(c.secondaries))) primary = c.primary secondaries = c.secondaries.copy() ha_tools.stepdown_primary() # Wait for primary to step down, and for MotorReplicaSetClient # to detect it. for _ in xrange(30): if c.primary != primary and secondaries != c.secondaries: break yield gen.Task(loop.add_timeout, time.time() + 1) else: self.fail("New primary not detected")
def test_primary_stepdown(self): c = MongoClient(self.seed, replicaSet=self.name, serverSelectionTimeoutMS=self.server_selection_timeout) wait_until(lambda: c.primary, "discover primary") wait_until(lambda: len(c.secondaries) == 2, "discover secondaries") ha_tools.stepdown_primary() # Wait for new primary. wait_until(lambda: (ha_tools.get_primary() and c.primary == partition_node(ha_tools.get_primary())), "discover new primary", timeout=30) wait_until(lambda: len(c.secondaries) == 2, "discover new secondaries", timeout=30)
def test_primary_stepdown(self): c = MongoClient( self.seed, replicaSet=self.name, serverSelectionTimeoutMS=self.server_selection_timeout) wait_until(lambda: c.primary, "discover primary") wait_until(lambda: len(c.secondaries) == 2, "discover secondaries") ha_tools.stepdown_primary() # Wait for new primary. wait_until(lambda: (ha_tools.get_primary() and c.primary == partition_node(ha_tools.get_primary())), "discover new primary", timeout=30) wait_until(lambda: len(c.secondaries) == 2, "discover new secondaries", timeout=30)
def test_primary_stepdown(self): c = ReplicaSetConnection(self.seed, replicaSet=self.name, use_greenlets=use_greenlets) self.assertTrue(bool(len(c.secondaries))) primary = c.primary secondaries = c.secondaries.copy() def primary_changed(): for _ in xrange(30): if c.primary != primary: return True sleep(1) return False ha_tools.stepdown_primary() self.assertTrue(primary_changed()) # There can be a delay between finding the primary and updating # secondaries sleep(5) self.assertNotEqual(secondaries, c.secondaries)
def test_primary_stepdown(self): c = ReplicaSetConnection( self.seed, replicaSet=self.name, use_greenlets=use_greenlets) self.assertTrue(bool(len(c.secondaries))) primary = c.primary secondaries = c.secondaries.copy() def primary_changed(): for _ in xrange(30): if c.primary != primary: return True sleep(1) return False ha_tools.stepdown_primary() self.assertTrue(primary_changed()) # There can be a delay between finding the primary and updating # secondaries sleep(5) self.assertNotEqual(secondaries, c.secondaries)
def test_primary_stepdown(self): c = MongoReplicaSetClient( self.seed, replicaSet=self.name, use_greenlets=use_greenlets) self.assertTrue(bool(len(c.secondaries))) primary = c.primary ha_tools.stepdown_primary() # Wait for new primary patience_seconds = 30 for _ in xrange(patience_seconds): sleep(1) rs_state = c._MongoReplicaSetClient__rs_state if rs_state.writer and rs_state.writer != primary: # New primary stepped up new_primary = _partition_node(ha_tools.get_primary()) self.assertEqual(new_primary, rs_state.writer) new_secondaries = partition_nodes(ha_tools.get_secondaries()) self.assertEqual(set(new_secondaries), rs_state.secondaries) break else: self.fail( "No new primary after %s seconds. Old primary was %s, current" " is %s" % (patience_seconds, primary, ha_tools.get_primary()))