Skip to content

Commit 963a6ec

Browse files
committed
Unify connection_acquisition_timeout behavior
The config option `connection_acquisition_timeout` now spans anything that's required to acquire a working connection from the pool. This includes * Potentially fetching a routing table This entails acquiring a connection in itself. * Bolt, TLS, TCP handshaking * Authentication * Any other required IO (e.g., DNS lookups) * Waiting for room in the pool * possibly more Previously, the timeout wold be restarted for auxiliary connection acquisitions like those for fetching a routing table.
1 parent 1316fde commit 963a6ec

File tree

8 files changed

+62
-21
lines changed

8 files changed

+62
-21
lines changed

docs/source/api.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,11 @@ it should be chosen larger than :ref:`connection-timeout-ref`.
430430
:Type: ``float``
431431
:Default: ``60.0``
432432

433+
.. versionadded:: 6.0
434+
The setting now entails *anything* required to acquire a connection.
435+
This includes potential fetching of routing tables which in itself requires acquiring a connection.
436+
Previously, the timeout wold be restarted for such auxiliary connection acquisitions.
437+
433438

434439
.. _connection-timeout-ref:
435440

src/neo4j/_async/io/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"AsyncBoltPool",
2929
"AsyncNeo4jPool",
3030
"ConnectionErrorHandler",
31+
"acquisition_timeout_to_deadline",
3132
]
3233

3334

@@ -40,6 +41,7 @@
4041
from ._bolt import AsyncBolt
4142
from ._common import ConnectionErrorHandler
4243
from ._pool import (
44+
acquisition_timeout_to_deadline,
4345
AcquisitionAuth,
4446
AcquisitionDatabase,
4547
AsyncBoltPool,

src/neo4j/_async/io/_pool.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,9 @@ async def update_routing_table(
969969
970970
:raise neo4j.exceptions.ServiceUnavailable:
971971
"""
972-
_check_acquisition_timeout(acquisition_timeout)
972+
acquisition_timeout = acquisition_timeout_to_deadline(
973+
acquisition_timeout
974+
)
973975
async with self.refresh_lock:
974976
routing_table = await self.get_routing_table(database)
975977
if routing_table is not None:
@@ -1147,7 +1149,7 @@ async def acquire(
11471149
database_callback=None,
11481150
):
11491151
access_mode = check_access_mode(access_mode)
1150-
_check_acquisition_timeout(timeout)
1152+
timeout = acquisition_timeout_to_deadline(timeout)
11511153

11521154
target_database = database.name
11531155

@@ -1242,6 +1244,13 @@ async def on_write_failure(self, address, database):
12421244
log.debug("[#0000] _: <POOL> table=%r", self.routing_tables)
12431245

12441246

1247+
def acquisition_timeout_to_deadline(timeout: object) -> Deadline:
1248+
if isinstance(timeout, Deadline):
1249+
return timeout
1250+
_check_acquisition_timeout(timeout)
1251+
return Deadline(timeout)
1252+
1253+
12451254
def _check_acquisition_timeout(timeout: object) -> None:
12461255
if not isinstance(timeout, (int, float)):
12471256
raise TypeError(

src/neo4j/_async/work/workspace.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@
3030
)
3131
from .._debug import AsyncNonConcurrentMethodChecker
3232
from ..io import (
33+
acquisition_timeout_to_deadline,
3334
AcquisitionAuth,
3435
AcquisitionDatabase,
3536
)
3637

3738

3839
if t.TYPE_CHECKING:
40+
from ..._deadline import Deadline
3941
from ...api import _TAuth
4042
from ...auth_management import (
4143
AsyncAuthManager,
@@ -159,13 +161,19 @@ async def _connect(self, access_mode, auth=None, **acquire_kwargs) -> None:
159161
await self._connection.fetch_all()
160162
await self._disconnect()
161163

164+
acquisition_deadline = acquisition_timeout_to_deadline(
165+
acquisition_timeout
166+
)
167+
162168
ssr_enabled = self._pool.ssr_enabled
163169
target_db = await self._get_routing_target_database(
164-
acquire_auth, ssr_enabled=ssr_enabled
170+
acquire_auth,
171+
ssr_enabled=ssr_enabled,
172+
acquisition_deadline=acquisition_deadline,
165173
)
166174
acquire_kwargs_ = {
167175
"access_mode": access_mode,
168-
"timeout": acquisition_timeout,
176+
"timeout": acquisition_deadline,
169177
"database": target_db,
170178
"bookmarks": await self._get_bookmarks(),
171179
"auth": acquire_auth,
@@ -188,7 +196,9 @@ async def _connect(self, access_mode, auth=None, **acquire_kwargs) -> None:
188196
)
189197
await self._disconnect()
190198
target_db = await self._get_routing_target_database(
191-
acquire_auth, ssr_enabled=False
199+
acquire_auth,
200+
ssr_enabled=False,
201+
acquisition_deadline=acquisition_deadline,
192202
)
193203
acquire_kwargs_["database"] = target_db
194204
self._connection = await self._pool.acquire(**acquire_kwargs_)
@@ -198,6 +208,7 @@ async def _get_routing_target_database(
198208
self,
199209
acquire_auth: AcquisitionAuth,
200210
ssr_enabled: bool,
211+
acquisition_deadline: Deadline,
201212
) -> AcquisitionDatabase:
202213
if (
203214
self._pinned_database
@@ -232,14 +243,13 @@ async def _get_routing_target_database(
232243
)
233244
return AcquisitionDatabase(cached_db, guessed=True)
234245

235-
acquisition_timeout = self._config.connection_acquisition_timeout
236246
log.debug("[#0000] _: <WORKSPACE> resolve home database")
237247
await self._pool.update_routing_table(
238248
database=self._config.database,
239249
imp_user=self._config.impersonated_user,
240250
bookmarks=await self._get_bookmarks(),
241251
auth=acquire_auth,
242-
acquisition_timeout=acquisition_timeout,
252+
acquisition_timeout=acquisition_deadline,
243253
database_callback=self._make_db_resolution_callback(),
244254
)
245255
return AcquisitionDatabase(self._config.database)

src/neo4j/_sync/io/__init__.py

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/neo4j/_sync/io/_pool.py

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/neo4j/_sync/work/workspace.py

Lines changed: 15 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

testkitbackend/test_config.json

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,7 @@
1515
"'neo4j.datatypes.test_temporal_types.TestDataTypes.test_date_time_cypher_created_tz_id'":
1616
"test_subtest_skips.tz_id",
1717
"stub\\.routing\\.test_routing_v[0-9x]+\\.RoutingV[0-9x]+\\.test_should_drop_connections_failing_liveness_check":
18-
"Liveness check error handling is not (yet) unified: https://github.com/neo-technology/drivers-adr/pull/83",
19-
"'stub.homedb.test_homedb.TestHomeDbMixedCluster.test_connection_acquisition_timeout_during_fallback'":
20-
"TODO: 6.0 - pending unification: connection acquisition timeout should count towards the total time spent waiting for a connection (including routing, home db resolution, ...)",
21-
"'stub.driver_parameters.test_connection_acquisition_timeout_ms.TestConnectionAcquisitionTimeoutMs.test_does_encompass_router_route_response'":
22-
"TODO: 6.0 - pending unification: connection acquisition timeout should count towards the total time spent waiting for a connection (including routing, home db resolution, ...)",
23-
"'stub.driver_parameters.test_connection_acquisition_timeout_ms.TestConnectionAcquisitionTimeoutMs.test_router_handshake_shares_acquisition_timeout'":
24-
"TODO: 6.0 - pending unification: connection acquisition timeout should count towards the total time spent waiting for a connection (including routing, home db resolution, ...)"
18+
"Liveness check error handling is not (yet) unified: https://github.com/neo-technology/drivers-adr/pull/83"
2519
},
2620
"features": {
2721
"Feature:API:BookmarkManager": true,

0 commit comments

Comments
 (0)