コード例 #1
0
    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)
コード例 #2
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')