From 088a31fb9f445521364c4a780d78b33844368096 Mon Sep 17 00:00:00 2001 From: Dmitry Pershin Date: Sun, 7 Jun 2026 11:03:28 +0500 Subject: [PATCH 1/2] fix: socket leak fixed. --- examples/custom_manager.py | 10 +++++++--- generic_connection_pool/contrib/socket.py | 9 ++++++--- generic_connection_pool/contrib/socket_async.py | 9 ++++++--- generic_connection_pool/contrib/unix.py | 8 ++++++-- generic_connection_pool/contrib/unix_async.py | 9 ++++++--- pyproject.toml | 1 - 6 files changed, 31 insertions(+), 15 deletions(-) diff --git a/examples/custom_manager.py b/examples/custom_manager.py index ffab4f9..07b2c26 100644 --- a/examples/custom_manager.py +++ b/examples/custom_manager.py @@ -18,10 +18,14 @@ def create(self, endpoint: Endpoint, timeout: Optional[float] = None) -> socket. addr, port = endpoint sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) - sock.connect((str(addr), port)) + try: + sock.connect((str(addr), port)) - if (resp := self.cmd(sock, f'AUTH {self._username} {self._password}')) != '+OK': - raise RuntimeError(f"authentication failed: {resp}") + if (resp := self.cmd(sock, f'AUTH {self._username} {self._password}')) != '+OK': + raise RuntimeError(f"authentication failed: {resp}") + except BaseException: + sock.close() + raise return sock diff --git a/generic_connection_pool/contrib/socket.py b/generic_connection_pool/contrib/socket.py index 4082ed0..0708c1d 100644 --- a/generic_connection_pool/contrib/socket.py +++ b/generic_connection_pool/contrib/socket.py @@ -84,9 +84,12 @@ def create(self, endpoint: TcpEndpoint, timeout: Optional[float] = None) -> sock raise RuntimeError("unsupported address version type: %s", addr.version) sock = socket.socket(family=family, type=socket.SOCK_STREAM) - - with socket_timeout(sock, timeout): - sock.connect((str(addr), port)) + try: + with socket_timeout(sock, timeout): + sock.connect((str(addr), port)) + except BaseException: + sock.close() + raise return sock diff --git a/generic_connection_pool/contrib/socket_async.py b/generic_connection_pool/contrib/socket_async.py index 7118ae5..1378653 100644 --- a/generic_connection_pool/contrib/socket_async.py +++ b/generic_connection_pool/contrib/socket_async.py @@ -54,9 +54,12 @@ async def create(self, endpoint: TcpEndpoint) -> socket.socket: raise RuntimeError("unsupported address version type: %s", addr.version) sock = socket.socket(family=family, type=socket.SOCK_STREAM) - sock.setblocking(False) - - await loop.sock_connect(sock, address=(str(addr), port)) + try: + sock.setblocking(False) + await loop.sock_connect(sock, address=(str(addr), port)) + except BaseException: + sock.close() + raise return sock diff --git a/generic_connection_pool/contrib/unix.py b/generic_connection_pool/contrib/unix.py index 1cd9e5a..cc5d547 100644 --- a/generic_connection_pool/contrib/unix.py +++ b/generic_connection_pool/contrib/unix.py @@ -49,8 +49,12 @@ class UnixSocketConnectionManager( def create(self, endpoint: UnixSocketEndpoint, timeout: Optional[float] = None) -> socket.socket: sock = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM) - with socket_timeout(sock, timeout): - sock.connect(str(endpoint)) + try: + with socket_timeout(sock, timeout): + sock.connect(str(endpoint)) + except BaseException: + sock.close() + raise return sock diff --git a/generic_connection_pool/contrib/unix_async.py b/generic_connection_pool/contrib/unix_async.py index 62f3d74..8be1d35 100644 --- a/generic_connection_pool/contrib/unix_async.py +++ b/generic_connection_pool/contrib/unix_async.py @@ -29,9 +29,12 @@ async def create(self, endpoint: UnixSocketEndpoint) -> socket.socket: loop = asyncio.get_running_loop() sock = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM) - sock.setblocking(False) - - await loop.sock_connect(sock, address=(str(endpoint))) + try: + sock.setblocking(False) + await loop.sock_connect(sock, address=(str(endpoint))) + except BaseException: + sock.close() + raise return sock diff --git a/pyproject.toml b/pyproject.toml index a155c85..dbaec46 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,6 @@ classifiers = [ "Topic :: Software Development :: Libraries", "Topic :: System :: Networking", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", From b2e3aea46aaa13c2d273b43ddce76fdcb7cbcf24 Mon Sep 17 00:00:00 2001 From: Dmitry Pershin Date: Sun, 7 Jun 2026 11:04:04 +0500 Subject: [PATCH 2/2] fix: documentation build fixed. --- .readthedocs.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 550b0c0..b148ba6 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -12,7 +12,7 @@ sphinx: python: install: - - method: pip - path: . - extra_requirements: + - method: uv + command: sync + groups: - docs