From d0244fb079d1630b3915d212d14ddc65a9d03e7d Mon Sep 17 00:00:00 2001 From: karezche <64801825+karenc-bq@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:41:10 -0700 Subject: [PATCH 1/2] chore: move PoolKey to utils/pool_key so the async provider can share it --- .../aio/pooled_connection_provider.py | 3 +-- .../sql_alchemy_connection_provider.py | 27 +------------------ .../test_aio_pooled_connection_provider.py | 4 +-- tests/unit/test_pool_key.py | 2 +- ..._sql_alchemy_pooled_connection_provider.py | 5 ++-- 5 files changed, 8 insertions(+), 33 deletions(-) diff --git a/aws_advanced_python_wrapper/aio/pooled_connection_provider.py b/aws_advanced_python_wrapper/aio/pooled_connection_provider.py index f01cc49e8..e49d75992 100644 --- a/aws_advanced_python_wrapper/aio/pooled_connection_provider.py +++ b/aws_advanced_python_wrapper/aio/pooled_connection_provider.py @@ -36,9 +36,9 @@ from aws_advanced_python_wrapper.host_selector import ( HighestWeightHostSelector, HostSelector, RandomHostSelector, RoundRobinHostSelector, WeightedRandomHostSelector) -from aws_advanced_python_wrapper.sql_alchemy_connection_provider import PoolKey from aws_advanced_python_wrapper.utils.log import Logger from aws_advanced_python_wrapper.utils.messages import Messages +from aws_advanced_python_wrapper.utils.pool_key import PoolKey from aws_advanced_python_wrapper.utils.properties import (Properties, WrapperProperties) from aws_advanced_python_wrapper.utils.rds_url_type import RdsUrlType @@ -425,7 +425,6 @@ async def release_resources(self) -> None: __all__ = [ "AsyncPooledConnectionProvider", - "PoolKey", # Private but re-exported for tests: "_AsyncPool", "_PooledAsyncConnectionProxy", diff --git a/aws_advanced_python_wrapper/sql_alchemy_connection_provider.py b/aws_advanced_python_wrapper/sql_alchemy_connection_provider.py index 99116f503..b7ce17529 100644 --- a/aws_advanced_python_wrapper/sql_alchemy_connection_provider.py +++ b/aws_advanced_python_wrapper/sql_alchemy_connection_provider.py @@ -30,6 +30,7 @@ RoundRobinHostSelector, WeightedRandomHostSelector) from aws_advanced_python_wrapper.plugin import CanReleaseResources from aws_advanced_python_wrapper.utils.messages import Messages +from aws_advanced_python_wrapper.utils.pool_key import PoolKey from aws_advanced_python_wrapper.utils.properties import (Properties, WrapperProperties) from aws_advanced_python_wrapper.utils.rds_url_type import RdsUrlType @@ -188,29 +189,3 @@ def release_resources(self): # Swallow exception, connections may already be dead pass SqlAlchemyPooledConnectionProvider._database_pools.clear() - - -class PoolKey: - def __init__(self, url: str, extra_key: Optional[str] = None): - self._url = url - self._extra_key = extra_key - - def __eq__(self, other): - if isinstance(other, type(self)): - return self.__members() == other.__members() - else: - return False - - def __hash__(self): - return hash(self.__members()) - - def __members(self) -> Tuple[str, Optional[str]]: - return self._url, self._extra_key - - @property - def url(self): - return self._url - - @property - def extra_key(self): - return self._extra_key diff --git a/tests/unit/test_aio_pooled_connection_provider.py b/tests/unit/test_aio_pooled_connection_provider.py index 21a89c2d2..087bfb61e 100644 --- a/tests/unit/test_aio_pooled_connection_provider.py +++ b/tests/unit/test_aio_pooled_connection_provider.py @@ -20,12 +20,12 @@ import pytest from aws_advanced_python_wrapper.aio.pooled_connection_provider import ( - AsyncPooledConnectionProvider, PoolKey, _AsyncPool, - _PooledAsyncConnectionProxy) + AsyncPooledConnectionProvider, _AsyncPool, _PooledAsyncConnectionProxy) from aws_advanced_python_wrapper.aio.storage.sliding_expiration_cache_async import \ AsyncSlidingExpirationCache from aws_advanced_python_wrapper.errors import AwsWrapperError from aws_advanced_python_wrapper.hostinfo import HostInfo, HostRole +from aws_advanced_python_wrapper.utils.pool_key import PoolKey from aws_advanced_python_wrapper.utils.properties import (Properties, WrapperProperties) diff --git a/tests/unit/test_pool_key.py b/tests/unit/test_pool_key.py index 98baaeee2..68b1b530a 100644 --- a/tests/unit/test_pool_key.py +++ b/tests/unit/test_pool_key.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from aws_advanced_python_wrapper.sql_alchemy_connection_provider import PoolKey +from aws_advanced_python_wrapper.utils.pool_key import PoolKey def test_eq(): diff --git a/tests/unit/test_sql_alchemy_pooled_connection_provider.py b/tests/unit/test_sql_alchemy_pooled_connection_provider.py index 5b87ef0d7..9454a9a5f 100644 --- a/tests/unit/test_sql_alchemy_pooled_connection_provider.py +++ b/tests/unit/test_sql_alchemy_pooled_connection_provider.py @@ -17,8 +17,9 @@ from aws_advanced_python_wrapper.errors import AwsWrapperError from aws_advanced_python_wrapper.hostinfo import HostInfo, HostRole -from aws_advanced_python_wrapper.sql_alchemy_connection_provider import ( - PoolKey, SqlAlchemyPooledConnectionProvider) +from aws_advanced_python_wrapper.sql_alchemy_connection_provider import \ + SqlAlchemyPooledConnectionProvider +from aws_advanced_python_wrapper.utils.pool_key import PoolKey from aws_advanced_python_wrapper.utils.properties import (Properties, WrapperProperties) from aws_advanced_python_wrapper.utils.storage.sliding_expiration_cache import \ From 3b25de0632f04a87e2450d966fbf51aca2f647af Mon Sep 17 00:00:00 2001 From: karezche <64801825+karenc-bq@users.noreply.github.com> Date: Fri, 21 Aug 2026 15:37:57 -0700 Subject: [PATCH 2/2] chore: add pool_key.py --- aws_advanced_python_wrapper/utils/pool_key.py | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 aws_advanced_python_wrapper/utils/pool_key.py diff --git a/aws_advanced_python_wrapper/utils/pool_key.py b/aws_advanced_python_wrapper/utils/pool_key.py new file mode 100644 index 000000000..12f4a2166 --- /dev/null +++ b/aws_advanced_python_wrapper/utils/pool_key.py @@ -0,0 +1,50 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Cache key shared by the sync and async internal connection pool providers. + +This lives in its own module, free of any pool implementation imports, so that +the async provider can key its pools identically without taking a dependency on +SQLAlchemy (which the sync provider requires but the async provider does not). +""" + +from __future__ import annotations + +from typing import Optional, Tuple + + +class PoolKey: + def __init__(self, url: str, extra_key: Optional[str] = None): + self._url = url + self._extra_key = extra_key + + def __eq__(self, other): + if isinstance(other, type(self)): + return self.__members() == other.__members() + else: + return False + + def __hash__(self): + return hash(self.__members()) + + def __members(self) -> Tuple[str, Optional[str]]: + return self._url, self._extra_key + + @property + def url(self): + return self._url + + @property + def extra_key(self): + return self._extra_key