Skip to content

Commit 793f360

Browse files
committed
Merge branch '4.4' into impersonation
2 parents b12fdb2 + 755b30d commit 793f360

File tree

3 files changed

+47
-20
lines changed

3 files changed

+47
-20
lines changed

neo4j/io/__init__.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,23 +1156,25 @@ def _select_address(self, *, access_mode, database, imp_user, bookmarks):
11561156
from neo4j.api import READ_ACCESS
11571157
""" Selects the address with the fewest in-use connections.
11581158
"""
1159-
self.ensure_routing_table_is_fresh(
1160-
access_mode=access_mode, database=database, imp_user=imp_user,
1161-
bookmarks=bookmarks
1162-
)
1163-
log.debug("[#0000] C: <ROUTING TABLE ENSURE FRESH> %r", self.routing_tables)
1164-
if access_mode == READ_ACCESS:
1165-
addresses = self.get_or_create_routing_table(database).readers
1166-
else:
1167-
addresses = self.get_or_create_routing_table(database).writers
1168-
addresses_by_usage = {}
1169-
for address in addresses:
1170-
addresses_by_usage.setdefault(self.in_use_connection_count(address), []).append(address)
1159+
with self.refresh_lock:
1160+
if access_mode == READ_ACCESS:
1161+
addresses = self.routing_tables[database].readers
1162+
else:
1163+
addresses = self.routing_tables[database].writers
1164+
addresses_by_usage = {}
1165+
for address in addresses:
1166+
addresses_by_usage.setdefault(
1167+
self.in_use_connection_count(address), []
1168+
).append(address)
11711169
if not addresses_by_usage:
11721170
if access_mode == READ_ACCESS:
1173-
raise ReadServiceUnavailable("No read service currently available")
1171+
raise ReadServiceUnavailable(
1172+
"No read service currently available"
1173+
)
11741174
else:
1175-
raise WriteServiceUnavailable("No write service currently available")
1175+
raise WriteServiceUnavailable(
1176+
"No write service currently available"
1177+
)
11761178
return choice(addresses_by_usage[min(addresses_by_usage)])
11771179

11781180
def acquire(self, access_mode=None, timeout=None, database=None,
@@ -1184,17 +1186,25 @@ def acquire(self, access_mode=None, timeout=None, database=None,
11841186

11851187
from neo4j.api import check_access_mode
11861188
access_mode = check_access_mode(access_mode)
1189+
with self.refresh_lock:
1190+
log.debug("[#0000] C: <ROUTING TABLE ENSURE FRESH> %r",
1191+
self.routing_tables)
1192+
self.ensure_routing_table_is_fresh(
1193+
access_mode=access_mode, database=database, imp_user=imp_user,
1194+
bookmarks=bookmarks
1195+
)
1196+
11871197
while True:
11881198
try:
11891199
# Get an address for a connection that have the fewest in-use connections.
11901200
address = self._select_address(
11911201
access_mode=access_mode, database=database,
11921202
imp_user=imp_user, bookmarks=bookmarks
11931203
)
1194-
log.debug("[#0000] C: <ACQUIRE ADDRESS> database=%r address=%r", database, address)
11951204
except (ReadServiceUnavailable, WriteServiceUnavailable) as err:
11961205
raise SessionExpired("Failed to obtain connection towards '%s' server." % access_mode) from err
11971206
try:
1207+
log.debug("[#0000] C: <ACQUIRE ADDRESS> database=%r address=%r", database, address)
11981208
connection = self._acquire(address, timeout=timeout) # should always be a resolved address
11991209
except ServiceUnavailable:
12001210
self.deactivate(address=address)

testkitbackend/requests.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,18 @@ def NewDriver(backend, data):
7575
if data["resolverRegistered"] or data["domainNameResolverRegistered"]:
7676
resolver = resolution_func(backend, data["resolverRegistered"],
7777
data["domainNameResolverRegistered"])
78-
connection_timeout = data.get("connectionTimeoutMs", None)
78+
connection_timeout = data.get("connectionTimeoutMs")
7979
if connection_timeout is not None:
8080
connection_timeout /= 1000
81+
max_transaction_retry_time = data.get("maxTxRetryTimeMs")
82+
if max_transaction_retry_time is not None:
83+
max_transaction_retry_time /= 1000
8184
data.mark_item_as_read("domainNameResolverRegistered")
8285
driver = neo4j.GraphDatabase.driver(
8386
data["uri"], auth=auth, user_agent=data["userAgent"],
84-
resolver=resolver, connection_timeout=connection_timeout
87+
resolver=resolver, connection_timeout=connection_timeout,
88+
fetch_size=data.get("fetchSize"),
89+
max_transaction_retry_time=max_transaction_retry_time,
8590
)
8691
key = backend.next_key()
8792
backend.drivers[key] = driver
@@ -306,6 +311,13 @@ def TransactionRollback(backend, data):
306311
backend.send_response("Transaction", {"id": key})
307312

308313

314+
def TransactionClose(backend, data):
315+
key = data["txId"]
316+
tx = backend.transactions[key]
317+
tx.close()
318+
backend.send_response("Transaction", {"id": key})
319+
320+
309321
def ResultNext(backend, data):
310322
result = backend.results[data["resultId"]]
311323
try:

testkitbackend/test_config.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@
3636
"Feature:Bolt:4.4": true,
3737
"Feature:Impersonation": true,
3838
"AuthorizationExpiredTreatment": true,
39+
"Optimization:ConnectionReuse": true,
40+
"Optimization:EagerTransactionBegin": true,
3941
"Optimization:ImplicitDefaultArguments": true,
4042
"Optimization:MinimalResets": true,
41-
"Optimization:ConnectionReuse": true,
4243
"Optimization:PullPipelining": true,
4344
"ConfHint:connection.recv_timeout_seconds": true,
44-
"Temporary:ResultKeys": true,
45+
"Temporary:CypherPathAndRelationship": true,
46+
"Temporary:DriverFetchSize": true,
47+
"Temporary:DriverMaxTxRetryTime": true,
4548
"Temporary:FullSummary": true,
46-
"Temporary:CypherPathAndRelationship": true
49+
"Temporary:ResultKeys": true,
50+
"Temporary:ResultList": "requires further specification/discussion in the team",
51+
"Temporary:TransactionClose": true
4752
}
4853
}

0 commit comments

Comments
 (0)