def test_pinned_member(self): conn = self._get_connection( auto_start_request=False, secondary_acceptable_latency_ms=1000*1000) host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) # No pinning since we're not in a request assertReadFromAll( self, conn, conn.secondaries, ReadPreference.SECONDARY) assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST) conn.start_request() host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Repin primary = read_from_which_host(conn, ReadPreference.PRIMARY) self.assertEqual(conn.primary, primary) assertReadFrom(self, conn, primary, ReadPreference.NEAREST) # Repin again host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Unpin conn.end_request() assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST)
def test_pinned_member(self): latency = 1000 * 1000 conn = self._get_connection( auto_start_request=False, secondary_acceptable_latency_ms=latency) host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) # No pinning since we're not in a request assertReadFromAll( self, conn, conn.secondaries, ReadPreference.SECONDARY, None, latency) assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency) conn.start_request() host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Oddly, we expect PRIMARY_PREFERRED to keep reading from secondary, # since the secondary is pinned and "matches" the preference. assertReadFrom(self, conn, host, ReadPreference.PRIMARY_PREFERRED) # Repin primary = read_from_which_host(conn, ReadPreference.PRIMARY) self.assertEqual(conn.primary, primary) assertReadFrom(self, conn, primary, ReadPreference.NEAREST) assertReadFrom(self, conn, primary, ReadPreference.PRIMARY_PREFERRED) # Since the we're pinned to primary we still use it assertReadFrom(self, conn, primary, ReadPreference.SECONDARY_PREFERRED) # Repin again host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Unpin conn.end_request() assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency)
def test_pinned_member(self): latency = 1000 * 1000 conn = self._get_connection(auto_start_request=False, secondary_acceptable_latency_ms=latency) host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) # No pinning since we're not in a request assertReadFromAll(self, conn, conn.secondaries, ReadPreference.SECONDARY, None, latency) assertReadFromAll(self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency) conn.start_request() host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Oddly, we expect PRIMARY_PREFERRED to keep reading from secondary, # since the secondary is pinned and "matches" the preference. assertReadFrom(self, conn, host, ReadPreference.PRIMARY_PREFERRED) # Repin primary = read_from_which_host(conn, ReadPreference.PRIMARY) self.assertEqual(conn.primary, primary) assertReadFrom(self, conn, primary, ReadPreference.NEAREST) assertReadFrom(self, conn, primary, ReadPreference.PRIMARY_PREFERRED) # Since the we're pinned to primary we still use it assertReadFrom(self, conn, primary, ReadPreference.SECONDARY_PREFERRED) # Repin again host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Unpin conn.end_request() assertReadFromAll(self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency)
def test_pinning(self): # To make the code terser, copy modes into local scope PRIMARY = ReadPreference.PRIMARY PRIMARY_PREFERRED = ReadPreference.PRIMARY_PREFERRED SECONDARY = ReadPreference.SECONDARY SECONDARY_PREFERRED = ReadPreference.SECONDARY_PREFERRED NEAREST = ReadPreference.NEAREST c = MongoReplicaSetClient( self.seed, replicaSet=self.name, use_greenlets=use_greenlets, auto_start_request=True) # Verify that changing the mode unpins the member. We'll try it for # every relevant change of mode. for mode0, mode1 in permutations( (PRIMARY, SECONDARY, SECONDARY_PREFERRED, NEAREST), 2 ): # Try reading and then changing modes and reading again, see if we # read from a different host for _ in range(1000): # pin to this host host = utils.read_from_which_host(c, mode0) # unpin? new_host = utils.read_from_which_host(c, mode1) if host != new_host: # Reading with a different mode unpinned, hooray! break else: self.fail("Changing from mode %r to mode " "%r never unpinned" % (mode0, mode1)) # Now verify changing the tag_sets unpins the member. tags0 = [{'a': 'a'}, {}] tags1 = [{'a': 'x'}, {}] for _ in range(1000): host = utils.read_from_which_host(c, NEAREST, tags0) new_host = utils.read_from_which_host(c, NEAREST, tags1) if host != new_host: break else: self.fail( "Changing from tags %s to tags %s never unpinned" % ( tags0, tags1))
def test_pinned_member(self): latency = 1000 * 1000 conn = self._get_connection( auto_start_request=False, secondary_acceptable_latency_ms=latency) host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) # No pinning since we're not in a request assertReadFromAll( self, conn, conn.secondaries, ReadPreference.SECONDARY, None, latency) assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency) conn.start_request() host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Changing any part of read preference (mode, tag_sets, latency) # unpins the current host and pins to a new one primary = conn.primary assertReadFrom(self, conn, primary, ReadPreference.PRIMARY_PREFERRED) host = read_from_which_host(conn, ReadPreference.NEAREST) assertReadFrom(self, conn, host, ReadPreference.NEAREST) assertReadFrom(self, conn, primary, ReadPreference.PRIMARY_PREFERRED) host = read_from_which_host(conn, ReadPreference.SECONDARY_PREFERRED) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY_PREFERRED) # Unpin conn.end_request() assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency)
def test_pinned_member(self): raise SkipTest("skipping due to Tokutek/mongo#77") latency = 1000 * 1000 client = self._get_client(secondary_acceptable_latency_ms=latency) host = read_from_which_host(client, ReadPreference.SECONDARY) self.assertTrue(host in client.secondaries) # No pinning since we're not in a request assertReadFromAll( self, client, client.secondaries, ReadPreference.SECONDARY, None, latency) assertReadFromAll( self, client, list(client.secondaries) + [client.primary], ReadPreference.NEAREST, None, latency) client.start_request() host = read_from_which_host(client, ReadPreference.SECONDARY) self.assertTrue(host in client.secondaries) assertReadFrom(self, client, host, ReadPreference.SECONDARY) # Changing any part of read preference (mode, tag_sets, latency) # unpins the current host and pins to a new one primary = client.primary assertReadFrom(self, client, primary, ReadPreference.PRIMARY_PREFERRED) host = read_from_which_host(client, ReadPreference.NEAREST) assertReadFrom(self, client, host, ReadPreference.NEAREST) assertReadFrom(self, client, primary, ReadPreference.PRIMARY_PREFERRED) host = read_from_which_host(client, ReadPreference.SECONDARY_PREFERRED) self.assertTrue(host in client.secondaries) assertReadFrom(self, client, host, ReadPreference.SECONDARY_PREFERRED) # Unpin client.end_request() assertReadFromAll( self, client, list(client.secondaries) + [client.primary], ReadPreference.NEAREST, None, latency)
def test_zero_latency(self): orig_interval = Monitor._refresh_interval Monitor._refresh_interval = 1e9 ping_times = set() # Generate unique ping times. while len(ping_times) < len(self.hosts): ping_times.add(random.random()) for ping_time, host in zip(ping_times, self.hosts): Member._host_to_ping_time[host] = ping_time try: client = self._get_client() host = read_from_which_host( client, ReadPreference.NEAREST, None, 0) for _ in range(5): self.assertEqual( host, read_from_which_host( client, ReadPreference.NEAREST, None, 0)) finally: Monitor._refresh_interval = orig_interval Member._host_to_ping_time.clear()
def test_pinned_member(self): latency = 1000 * 1000 client = self._get_client(secondary_acceptable_latency_ms=latency) host = read_from_which_host(client, ReadPreference.SECONDARY) self.assertTrue(host in client.secondaries) # No pinning since we're not in a request assertReadFromAll( self, client, client.secondaries, ReadPreference.SECONDARY, None, latency) assertReadFromAll( self, client, list(client.secondaries) + [client.primary], ReadPreference.NEAREST, None, latency) client.start_request() host = read_from_which_host(client, ReadPreference.SECONDARY) self.assertTrue(host in client.secondaries) assertReadFrom(self, client, host, ReadPreference.SECONDARY) # Changing any part of read preference (mode, tag_sets, latency) # unpins the current host and pins to a new one primary = client.primary assertReadFrom(self, client, primary, ReadPreference.PRIMARY_PREFERRED) host = read_from_which_host(client, ReadPreference.NEAREST) assertReadFrom(self, client, host, ReadPreference.NEAREST) assertReadFrom(self, client, primary, ReadPreference.PRIMARY_PREFERRED) host = read_from_which_host(client, ReadPreference.SECONDARY_PREFERRED) self.assertTrue(host in client.secondaries) assertReadFrom(self, client, host, ReadPreference.SECONDARY_PREFERRED) # Unpin client.end_request() assertReadFromAll( self, client, list(client.secondaries) + [client.primary], ReadPreference.NEAREST, None, latency)
def test_pinned_member(self): latency = 1000 * 1000 conn = self._get_connection( auto_start_request=False, secondary_acceptable_latency_ms=latency) host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) # No pinning since we're not in a request assertReadFromAll( self, conn, conn.secondaries, ReadPreference.SECONDARY, None, latency) assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency) conn.start_request() host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Repin primary = read_from_which_host(conn, ReadPreference.PRIMARY) self.assertEqual(conn.primary, primary) assertReadFrom(self, conn, primary, ReadPreference.NEAREST) # Repin again host = read_from_which_host(conn, ReadPreference.SECONDARY) self.assertTrue(host in conn.secondaries) assertReadFrom(self, conn, host, ReadPreference.SECONDARY) # Unpin conn.end_request() assertReadFromAll( self, conn, list(conn.secondaries) + [conn.primary], ReadPreference.NEAREST, None, latency)
def test_pinning(self): # To make the code terser, copy modes into local scope PRIMARY = ReadPreference.PRIMARY PRIMARY_PREFERRED = ReadPreference.PRIMARY_PREFERRED SECONDARY = ReadPreference.SECONDARY SECONDARY_PREFERRED = ReadPreference.SECONDARY_PREFERRED NEAREST = ReadPreference.NEAREST c = MongoReplicaSetClient( self.seed, replicaSet=self.name, use_greenlets=use_greenlets, auto_start_request=True) # Verify that changing the mode unpins the member. We'll try it for # every relevant change of mode. for mode0, mode1 in permutations( (PRIMARY, SECONDARY, SECONDARY_PREFERRED, NEAREST), 2 ): # Try reading and then changing modes and reading again, see if we # read from a different host for _ in range(1000): # pin to this host host = utils.read_from_which_host(c, mode0) # unpin? new_host = utils.read_from_which_host(c, mode1) if host != new_host: # Reading with a different mode unpinned, hooray! break else: self.fail( "Changing from mode %s to mode %s never unpinned" % ( modes[mode0], modes[mode1])) # Now verify changing the tag_sets unpins the member. tags0 = [{'a': 'a'}, {}] tags1 = [{'a': 'x'}, {}] for _ in range(1000): host = utils.read_from_which_host(c, NEAREST, tags0) new_host = utils.read_from_which_host(c, NEAREST, tags1) if host != new_host: break else: self.fail( "Changing from tags %s to tags %s never unpinned" % ( tags0, tags1)) # Finally, verify changing the secondary_acceptable_latency_ms unpins # the member. for _ in range(1000): host = utils.read_from_which_host(c, SECONDARY, None, 15) new_host = utils.read_from_which_host(c, SECONDARY, None, 20) if host != new_host: break else: self.fail( "Changing secondary_acceptable_latency_ms from 15 to 20" " never unpinned")