Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 3 additions & 44 deletions pymongo/asynchronous/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
NetworkTimeout,
NotPrimaryError,
OperationFailure,
PyMongoError,
WaitQueueTimeoutError,
_CertificateError,
)
Expand All @@ -70,10 +69,13 @@
from pymongo.network_layer import AsyncNetworkingInterface, async_receive_message, async_sendall
from pymongo.pool_options import PoolOptions
from pymongo.pool_shared import (
PoolState,
SSLErrors,
_CancellationContext,
_configured_protocol_interface,
_ConnectionTelemetryInfo,
_PoolClosedError,
_PoolGeneration,
_raise_connection_failure,
)
from pymongo.read_preferences import ReadPreference
Expand Down Expand Up @@ -583,49 +585,6 @@ def __repr__(self) -> str:
)


class _PoolClosedError(PyMongoError):
"""Internal error raised when a thread tries to get a connection from a
closed pool.
"""


class _PoolGeneration:
def __init__(self) -> None:
# Maps service_id to generation.
self._generations: dict[ObjectId, int] = collections.defaultdict(int)
# Overall pool generation.
self._generation = 0

def get(self, service_id: Optional[ObjectId]) -> int:
"""Get the generation for the given service_id."""
if service_id is None:
return self._generation
return self._generations[service_id]

def get_overall(self) -> int:
"""Get the Pool's overall generation."""
return self._generation

def inc(self, service_id: Optional[ObjectId]) -> None:
"""Increment the generation for the given service_id."""
self._generation += 1
if service_id is None:
for service_id in self._generations:
self._generations[service_id] += 1
else:
self._generations[service_id] += 1

def stale(self, gen: int, service_id: Optional[ObjectId]) -> bool:
"""Return if the given generation for a given service_id is stale."""
return gen != self.get(service_id)


class PoolState:
PAUSED = 1
READY = 2
CLOSED = 3


class Pool:
def __init__(
self,
Expand Down
45 changes: 45 additions & 0 deletions pymongo/pool_shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from __future__ import annotations

import asyncio
import collections
import functools
import socket
import ssl
Expand All @@ -36,6 +37,7 @@
AutoReconnect,
ConnectionFailure,
NetworkTimeout,
PyMongoError,
_CertificateError,
)
from pymongo.helpers_shared import _get_timeout_details, format_timeout_details
Expand Down Expand Up @@ -180,6 +182,49 @@ def cancelled(self) -> bool:
return self._cancelled


class _PoolClosedError(PyMongoError):
"""Internal error raised when a thread tries to get a connection from a
closed pool.
"""


class _PoolGeneration:
def __init__(self) -> None:
# Maps service_id to generation.
self._generations: dict[ObjectId, int] = collections.defaultdict(int)
# Overall pool generation.
self._generation = 0

def get(self, service_id: Optional[ObjectId]) -> int:
"""Get the generation for the given service_id."""
if service_id is None:
return self._generation
return self._generations[service_id]

def get_overall(self) -> int:
"""Get the Pool's overall generation."""
return self._generation

def inc(self, service_id: Optional[ObjectId]) -> None:
"""Increment the generation for the given service_id."""
self._generation += 1
if service_id is None:
for service_id in self._generations:
self._generations[service_id] += 1
else:
self._generations[service_id] += 1

def stale(self, gen: int, service_id: Optional[ObjectId]) -> bool:
"""Return if the given generation for a given service_id is stale."""
return gen != self.get(service_id)


class PoolState:
PAUSED = 1
READY = 2
CLOSED = 3


async def _async_create_connection(address: _Address, options: PoolOptions) -> socket.socket:
"""Given (host, port) and PoolOptions, connect and return a raw socket object.

Expand Down
47 changes: 3 additions & 44 deletions pymongo/synchronous/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
NetworkTimeout,
NotPrimaryError,
OperationFailure,
PyMongoError,
WaitQueueTimeoutError,
_CertificateError,
)
Expand All @@ -67,10 +66,13 @@
from pymongo.network_layer import NetworkingInterface, receive_message, sendall
from pymongo.pool_options import PoolOptions
from pymongo.pool_shared import (
PoolState,
SSLErrors,
_CancellationContext,
_configured_socket_interface,
_ConnectionTelemetryInfo,
_PoolClosedError,
_PoolGeneration,
_raise_connection_failure,
)
from pymongo.read_preferences import ReadPreference
Expand Down Expand Up @@ -581,49 +583,6 @@ def __repr__(self) -> str:
)


class _PoolClosedError(PyMongoError):
"""Internal error raised when a thread tries to get a connection from a
closed pool.
"""


class _PoolGeneration:
def __init__(self) -> None:
# Maps service_id to generation.
self._generations: dict[ObjectId, int] = collections.defaultdict(int)
# Overall pool generation.
self._generation = 0

def get(self, service_id: Optional[ObjectId]) -> int:
"""Get the generation for the given service_id."""
if service_id is None:
return self._generation
return self._generations[service_id]

def get_overall(self) -> int:
"""Get the Pool's overall generation."""
return self._generation

def inc(self, service_id: Optional[ObjectId]) -> None:
"""Increment the generation for the given service_id."""
self._generation += 1
if service_id is None:
for service_id in self._generations:
self._generations[service_id] += 1
else:
self._generations[service_id] += 1

def stale(self, gen: int, service_id: Optional[ObjectId]) -> bool:
"""Return if the given generation for a given service_id is stale."""
return gen != self.get(service_id)


class PoolState:
PAUSED = 1
READY = 2
CLOSED = 3


class Pool:
def __init__(
self,
Expand Down
2 changes: 1 addition & 1 deletion test/asynchronous/test_connection_monitoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@

from bson.objectid import ObjectId
from bson.son import SON
from pymongo.asynchronous.pool import PoolState, _PoolClosedError
from pymongo.errors import (
ConnectionFailure,
OperationFailure,
Expand All @@ -51,6 +50,7 @@
PoolCreatedEvent,
PoolReadyEvent,
)
from pymongo.pool_shared import PoolState, _PoolClosedError
from pymongo.read_preferences import ReadPreference
from pymongo.topology_description import updated_topology_description
from test.asynchronous import AsyncIntegrationTest, async_client_context, client_knobs, unittest
Expand Down
2 changes: 1 addition & 1 deletion test/asynchronous/test_transactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

import pymongo
from gridfs.asynchronous.grid_file import AsyncGridFS, AsyncGridFSBucket
from pymongo.asynchronous.pool import PoolState
from pymongo.pool_shared import PoolState
from pymongo.server_selectors import writable_server_selector

sys.path[0:0] = [""]
Expand Down
3 changes: 2 additions & 1 deletion test/asynchronous/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,12 @@

from bson.son import SON
from pymongo import AsyncMongoClient
from pymongo.asynchronous.pool import Pool, _CancellationContext, _PoolGeneration
from pymongo.asynchronous.pool import Pool
from pymongo.errors import ConfigurationError
from pymongo.hello import HelloCompat
from pymongo.lock import _async_create_lock
from pymongo.operations import _Op
from pymongo.pool_shared import _CancellationContext, _PoolGeneration
from pymongo.read_preferences import ReadPreference
from pymongo.server_selectors import any_server_selector, writable_server_selector

Expand Down
2 changes: 1 addition & 1 deletion test/test_connection_monitoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@
PoolCreatedEvent,
PoolReadyEvent,
)
from pymongo.pool_shared import PoolState, _PoolClosedError
from pymongo.read_preferences import ReadPreference
from pymongo.synchronous.pool import PoolState, _PoolClosedError
from pymongo.topology_description import updated_topology_description
from test import IntegrationTest, client_context, client_knobs, unittest
from test.pymongo_mocks import DummyMonitor
Expand Down
2 changes: 1 addition & 1 deletion test/test_transactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@

import pymongo
from gridfs.synchronous.grid_file import GridFS, GridFSBucket
from pymongo.pool_shared import PoolState
from pymongo.server_selectors import writable_server_selector
from pymongo.synchronous.pool import PoolState

sys.path[0:0] = [""]

Expand Down
3 changes: 2 additions & 1 deletion test/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@
from pymongo.hello import HelloCompat
from pymongo.lock import _create_lock
from pymongo.operations import _Op
from pymongo.pool_shared import _CancellationContext, _PoolGeneration
from pymongo.read_preferences import ReadPreference
from pymongo.server_selectors import any_server_selector, writable_server_selector
from pymongo.synchronous.pool import Pool, _CancellationContext, _PoolGeneration
from pymongo.synchronous.pool import Pool

_IS_SYNC = True

Expand Down
2 changes: 1 addition & 1 deletion test/utils_shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,10 @@
PoolCreatedEvent,
PoolReadyEvent,
)
from pymongo.pool_shared import _CancellationContext, _PoolGeneration
from pymongo.read_concern import ReadConcern
from pymongo.server_type import SERVER_TYPE
from pymongo.synchronous.collection import ReturnDocument
from pymongo.synchronous.pool import _CancellationContext, _PoolGeneration
from pymongo.write_concern import WriteConcern
from test import client_context
from test.asynchronous.utils import async_wait_until
Expand Down
Loading