PYTHON-3174 Remove noisy running Topology check for main test client (#898)

This commit is contained in:
Shane Harvey 2022-03-15 14:52:47 -07:00 committed by GitHub
parent 087950d869
commit 9ada6543d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 16 deletions

View File

@ -286,13 +286,8 @@ class ClientContext(object):
return self._hello
def _connect(self, host, port, **kwargs):
# Jython takes a long time to connect.
if sys.platform.startswith("java"):
timeout_ms = 10000
else:
timeout_ms = 5000
kwargs.update(self.default_client_options)
client = pymongo.MongoClient(host, port, serverSelectionTimeoutMS=timeout_ms, **kwargs)
client = pymongo.MongoClient(host, port, serverSelectionTimeoutMS=5000, **kwargs)
try:
try:
client.admin.command(HelloCompat.LEGACY_CMD) # Can we connect?
@ -1037,21 +1032,26 @@ def _get_executors(topology):
return [e for e in executors if e is not None]
def all_executors_stopped(topology):
def print_running_topology(topology):
running = [e for e in _get_executors(topology) if not e._stopped]
if running:
print(
" Topology %s has THREADS RUNNING: %s, created at: %s"
% (topology, running, topology._settings._stack)
"WARNING: found Topology with running threads:\n"
" Threads: %s\n"
" Topology: %s\n"
" Creation traceback:\n%s" % (running, topology, topology._settings._stack)
)
return False
return True
def print_unclosed_clients():
def print_running_clients():
from pymongo.topology import Topology
processed = set()
# Avoid false positives on the main test client.
# XXX: Can be removed after PYTHON-1634 or PYTHON-1896.
c = client_context.client
if c:
processed.add(c._topology._topology_id)
# Call collect to manually cleanup any would-be gc'd clients to avoid
# false positives.
gc.collect()
@ -1061,7 +1061,7 @@ def print_unclosed_clients():
# Avoid printing the same Topology multiple times.
if obj._topology_id in processed:
continue
all_executors_stopped(obj)
print_running_topology(obj)
processed.add(obj._topology_id)
except ReferenceError:
pass
@ -1086,9 +1086,7 @@ def teardown():
c.drop_database("pymongo_test_bernie")
c.close()
# Jython does not support gc.get_objects.
if not sys.platform.startswith("java"):
print_unclosed_clients()
print_running_clients()
class PymongoTestRunner(unittest.TextTestRunner):

View File

@ -759,6 +759,7 @@ class TestClient(IntegrationTest):
for doc in helper_docs:
self.assertIs(type(doc), dict)
client = rs_or_single_client(document_class=SON)
self.addCleanup(client.close)
for doc in client.list_databases():
self.assertIs(type(doc), dict)
@ -979,6 +980,7 @@ class TestClient(IntegrationTest):
uri = "mongodb://%s" % encoded_socket
# Confirm we can do operations via the socket.
client = rs_or_single_client(uri)
self.addCleanup(client.close)
client.pymongo_test.test.insert_one({"dummy": "object"})
dbs = client.list_database_names()
self.assertTrue("pymongo_test" in dbs)
@ -1002,6 +1004,7 @@ class TestClient(IntegrationTest):
self.assertFalse(isinstance(db.test.find_one(), SON))
c = rs_or_single_client(document_class=SON)
self.addCleanup(c.close)
db = c.pymongo_test
self.assertEqual(SON, c.codec_options.document_class)
@ -1040,6 +1043,7 @@ class TestClient(IntegrationTest):
no_timeout = self.client
timeout_sec = 1
timeout = rs_or_single_client(socketTimeoutMS=1000 * timeout_sec)
self.addCleanup(timeout.close)
no_timeout.pymongo_test.drop_collection("test")
no_timeout.pymongo_test.test.insert_one({"x": 1})
@ -1095,6 +1099,7 @@ class TestClient(IntegrationTest):
self.assertRaises(ValueError, MongoClient, tz_aware="foo")
aware = rs_or_single_client(tz_aware=True)
self.addCleanup(aware.close)
naive = self.client
aware.pymongo_test.drop_collection("test")
@ -1124,6 +1129,7 @@ class TestClient(IntegrationTest):
uri += "/?replicaSet=" + (client_context.replica_set_name or "")
client = rs_or_single_client_noauth(uri)
self.addCleanup(client.close)
client.pymongo_test.test.insert_one({"dummy": "object"})
client.pymongo_test_bernie.test.insert_one({"dummy": "object"})
@ -1222,6 +1228,7 @@ class TestClient(IntegrationTest):
# to avoid race conditions caused by replica set failover or idle
# socket reaping.
client = single_client()
self.addCleanup(client.close)
client.pymongo_test.test.find_one()
pool = get_pool(client)
socket_count = len(pool.sockets)
@ -1245,18 +1252,21 @@ class TestClient(IntegrationTest):
self.addCleanup(client_context.client.drop_database, "test_lazy_connect_w0")
client = rs_or_single_client(connect=False, w=0)
self.addCleanup(client.close)
client.test_lazy_connect_w0.test.insert_one({})
wait_until(
lambda: client.test_lazy_connect_w0.test.count_documents({}) == 1, "find one document"
)
client = rs_or_single_client(connect=False, w=0)
self.addCleanup(client.close)
client.test_lazy_connect_w0.test.update_one({}, {"$set": {"x": 1}})
wait_until(
lambda: client.test_lazy_connect_w0.test.find_one().get("x") == 1, "update one document"
)
client = rs_or_single_client(connect=False, w=0)
self.addCleanup(client.close)
client.test_lazy_connect_w0.test.delete_one({})
wait_until(
lambda: client.test_lazy_connect_w0.test.count_documents({}) == 0, "delete one document"
@ -1267,6 +1277,7 @@ class TestClient(IntegrationTest):
# When doing an exhaust query, the socket stays checked out on success
# but must be checked in on error to avoid semaphore leaks.
client = rs_or_single_client(maxPoolSize=1, retryReads=False)
self.addCleanup(client.close)
collection = client.pymongo_test.test
pool = get_pool(client)
pool._check_interval_seconds = None # Never check.