Skip to content

Commit 9a98020

Browse files
authored
PYTHON-4348 PYTHON-4455 Fix missing changes from async beta merge (mongodb#1674)
1 parent 4ec79fb commit 9a98020

File tree

4 files changed

+26
-24
lines changed

4 files changed

+26
-24
lines changed

pymongo/asynchronous/mongo_client.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ def _should_pin_cursor(self, session: Optional[ClientSession]) -> Optional[bool]
902902

903903
def _after_fork(self) -> None:
904904
"""Resets topology in a child after successfully forking."""
905-
self._init_background()
905+
self._init_background(self._topology._pid)
906906
# Reset the session pool to avoid duplicate sessions in the child process.
907907
self._topology._session_pool.reset()
908908

@@ -1383,7 +1383,9 @@ async def _server_property(self, attr_name: str) -> Any:
13831383
the server may change. In such cases, store a local reference to a
13841384
ServerDescription first, then use its properties.
13851385
"""
1386-
server = await self._topology.select_server(writable_server_selector, _Op.TEST)
1386+
server = await (await self._get_topology()).select_server(
1387+
writable_server_selector, _Op.TEST
1388+
)
13871389

13881390
return getattr(server.description, attr_name)
13891391

@@ -1634,9 +1636,9 @@ async def _conn_from_server(
16341636
# always send primaryPreferred when directly connected to a repl set
16351637
# member.
16361638
# Thread safe: if the type is single it cannot change.
1637-
topology = await self._get_topology()
1638-
single = topology.description.topology_type == TOPOLOGY_TYPE.Single
1639-
1639+
# NOTE: We already opened the Topology when selecting a server so there's no need
1640+
# to call _get_topology() again.
1641+
single = self._topology.description.topology_type == TOPOLOGY_TYPE.Single
16401642
async with self._checkout(server, session) as conn:
16411643
if single:
16421644
if conn.is_repl and not (session and session.in_transaction):
@@ -1655,7 +1657,6 @@ async def _conn_for_reads(
16551657
operation: str,
16561658
) -> AsyncContextManager[tuple[Connection, _ServerMode]]:
16571659
assert read_preference is not None, "read_preference must not be None"
1658-
_ = await self._get_topology()
16591660
server = await self._select_server(read_preference, session, operation)
16601661
return self._conn_from_server(read_preference, server, session)
16611662

pymongo/asynchronous/pool.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,14 @@ def _set_keepalive_times(sock: socket.socket) -> None:
216216
"version": platform.mac_ver()[0],
217217
}
218218
elif sys.platform == "win32":
219+
_ver = sys.getwindowsversion()
219220
_METADATA["os"] = {
220-
"type": platform.system(),
221-
# "Windows XP", "Windows 7", "Windows 10", etc.
222-
"name": " ".join((platform.system(), platform.release())),
223-
"architecture": platform.machine(),
224-
# Windows patch level (e.g. 5.1.2600-SP3)
225-
"version": "-".join(platform.win32_ver()[1:3]),
221+
"type": "Windows",
222+
"name": "Windows",
223+
# Avoid using platform calls, see PYTHON-4455.
224+
"architecture": os.environ.get("PROCESSOR_ARCHITECTURE") or platform.machine(),
225+
# Windows patch level (e.g. 10.0.17763-SP0).
226+
"version": ".".join(map(str, _ver[:3])) + f"-SP{_ver[-1] or '0'}",
226227
}
227228
elif sys.platform.startswith("java"):
228229
_name, _ver, _arch = platform.java_ver()[-1]

pymongo/synchronous/mongo_client.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ def _should_pin_cursor(self, session: Optional[ClientSession]) -> Optional[bool]
901901

902902
def _after_fork(self) -> None:
903903
"""Resets topology in a child after successfully forking."""
904-
self._init_background()
904+
self._init_background(self._topology._pid)
905905
# Reset the session pool to avoid duplicate sessions in the child process.
906906
self._topology._session_pool.reset()
907907

@@ -1382,7 +1382,7 @@ def _server_property(self, attr_name: str) -> Any:
13821382
the server may change. In such cases, store a local reference to a
13831383
ServerDescription first, then use its properties.
13841384
"""
1385-
server = self._topology.select_server(writable_server_selector, _Op.TEST)
1385+
server = (self._get_topology()).select_server(writable_server_selector, _Op.TEST)
13861386

13871387
return getattr(server.description, attr_name)
13881388

@@ -1633,9 +1633,9 @@ def _conn_from_server(
16331633
# always send primaryPreferred when directly connected to a repl set
16341634
# member.
16351635
# Thread safe: if the type is single it cannot change.
1636-
topology = self._get_topology()
1637-
single = topology.description.topology_type == TOPOLOGY_TYPE.Single
1638-
1636+
# NOTE: We already opened the Topology when selecting a server so there's no need
1637+
# to call _get_topology() again.
1638+
single = self._topology.description.topology_type == TOPOLOGY_TYPE.Single
16391639
with self._checkout(server, session) as conn:
16401640
if single:
16411641
if conn.is_repl and not (session and session.in_transaction):
@@ -1654,7 +1654,6 @@ def _conn_for_reads(
16541654
operation: str,
16551655
) -> ContextManager[tuple[Connection, _ServerMode]]:
16561656
assert read_preference is not None, "read_preference must not be None"
1657-
_ = self._get_topology()
16581657
server = self._select_server(read_preference, session, operation)
16591658
return self._conn_from_server(read_preference, server, session)
16601659

pymongo/synchronous/pool.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,14 @@ def _set_keepalive_times(sock: socket.socket) -> None:
216216
"version": platform.mac_ver()[0],
217217
}
218218
elif sys.platform == "win32":
219+
_ver = sys.getwindowsversion()
219220
_METADATA["os"] = {
220-
"type": platform.system(),
221-
# "Windows XP", "Windows 7", "Windows 10", etc.
222-
"name": " ".join((platform.system(), platform.release())),
223-
"architecture": platform.machine(),
224-
# Windows patch level (e.g. 5.1.2600-SP3)
225-
"version": "-".join(platform.win32_ver()[1:3]),
221+
"type": "Windows",
222+
"name": "Windows",
223+
# Avoid using platform calls, see PYTHON-4455.
224+
"architecture": os.environ.get("PROCESSOR_ARCHITECTURE") or platform.machine(),
225+
# Windows patch level (e.g. 10.0.17763-SP0).
226+
"version": ".".join(map(str, _ver[:3])) + f"-SP{_ver[-1] or '0'}",
226227
}
227228
elif sys.platform.startswith("java"):
228229
_name, _ver, _arch = platform.java_ver()[-1]

0 commit comments

Comments
 (0)