def test_streaming_rtt(self): listener = ServerEventListener() hb_listener = HeartbeatEventListener() # On Windows, RTT can actually be 0.0 because time.time() only has # 1-15 millisecond resolution. We need to delay the initial isMaster # to ensure that RTT is never zero. name = 'streamingRttTest' delay_ismaster = { 'configureFailPoint': 'failCommand', 'mode': { 'times': 1000 }, 'data': { 'failCommands': ['isMaster'], 'blockConnection': True, 'blockTimeMS': 20, # This can be uncommented after SERVER-49220 is fixed. # 'appName': name, }, } with self.fail_point(delay_ismaster): client = rs_or_single_client( event_listeners=[listener, hb_listener], heartbeatFrequencyMS=500, appName=name) self.addCleanup(client.close) # Force a connection. client.admin.command('ping') address = client.address delay_ismaster['data']['blockTimeMS'] = 500 delay_ismaster['data']['appName'] = name with self.fail_point(delay_ismaster): def rtt_exceeds_250_ms(): # XXX: Add a public TopologyDescription getter to MongoClient? topology = client._topology sd = topology.description.server_descriptions()[address] return sd.round_trip_time > 0.250 wait_until(rtt_exceeds_250_ms, 'exceed 250ms RTT') # Server should be selectable. client.admin.command('ping') def changed_event(event): return (event.server_address == address and isinstance( event, monitoring.ServerDescriptionChangedEvent)) # There should only be one event published, for the initial discovery. events = listener.matching(changed_event) self.assertEqual(1, len(events)) self.assertGreater(events[0].new_description.round_trip_time, 0)
def test_failCommand_streaming(self): listener = ServerEventListener() hb_listener = HeartbeatEventListener() client = rs_or_single_client(event_listeners=[listener, hb_listener], heartbeatFrequencyMS=500, appName='failingIsMasterTest') self.addCleanup(client.close) # Force a connection. client.admin.command('ping') address = client.address listener.reset() fail_ismaster = { 'configureFailPoint': 'failCommand', 'mode': { 'times': 4 }, 'data': { 'failCommands': ['isMaster'], 'closeConnection': False, 'errorCode': 10107, 'appName': 'failingIsMasterTest', }, } with self.fail_point(fail_ismaster): def _marked_unknown(event): return (event.server_address == address and not event.new_description.is_server_type_known) def _discovered_node(event): return (event.server_address == address and not event.previous_description.is_server_type_known and event.new_description.is_server_type_known) def marked_unknown(): return len(listener.matching(_marked_unknown)) >= 1 def rediscovered(): return len(listener.matching(_discovered_node)) >= 1 # Topology events are published asynchronously wait_until(marked_unknown, 'mark node unknown') wait_until(rediscovered, 'rediscover node') # Server should be selectable. client.admin.command('ping')