Skip to content

Commit 222b735

Browse files
committed
Fix async query pool acquire race condition
1 parent 47ce490 commit 222b735

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

tests/aio/query/test_query_session_pool.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,19 @@ async def test_no_session_leak(self, driver, docker_project):
162162

163163
docker_project.start()
164164
await pool.stop()
165+
166+
@pytest.mark.asyncio
167+
async def test_acquire_no_race_condition(self, driver):
168+
ids = set()
169+
async with ydb.aio.QuerySessionPool(driver, 1) as pool:
170+
async def acquire_session():
171+
session = await pool.acquire()
172+
ids.add(session._state.session_id)
173+
await pool.release(session)
174+
175+
tasks = [acquire_session() for _ in range(10)]
176+
177+
await asyncio.gather(*tasks)
178+
179+
assert len(ids) == 1
180+
assert pool._current_size == 1

tox.ini

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ deps =
3232

3333
[testenv:py-proto5]
3434
commands =
35-
pytest -v -m "not tls" --docker-compose-remove-volumes --docker-compose=docker-compose.yml {posargs} --ignore=tests/topics
35+
pytest -v -m "not tls" --docker-compose-remove-volumes --docker-compose=docker-compose.yml {posargs}
3636
deps =
3737
-r{toxinidir}/test-requirements.txt
3838
protobuf<6.0.0
3939

4040
[testenv:py-proto4]
4141
commands =
42-
pytest -v -m "not tls" --docker-compose-remove-volumes --docker-compose=docker-compose.yml {posargs} --ignore=tests/topics
42+
pytest -v -m "not tls" --docker-compose-remove-volumes --docker-compose=docker-compose.yml {posargs}
4343
deps =
4444
-r{toxinidir}/test-requirements.txt
4545
protobuf<5.0.0
@@ -55,7 +55,7 @@ deps =
5555

5656
[testenv:py-proto3]
5757
commands =
58-
pytest -v -m "not tls" --docker-compose-remove-volumes --docker-compose=docker-compose.yml {posargs} --ignore=tests/topics
58+
pytest -v -m "not tls" --docker-compose-remove-volumes --docker-compose=docker-compose.yml {posargs}
5959
deps =
6060
-r{toxinidir}/test-requirements.txt
6161
protobuf<4.0.0

ydb/aio/query/pool.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from .session import (
1010
QuerySession,
1111
)
12+
from ...issues import Error as YDBError
1213
from ...retries import (
1314
RetrySettings,
1415
retry_operation_async,
@@ -90,8 +91,15 @@ async def acquire(self) -> QuerySession:
9091
logger.debug(f"Acquired dead session from queue: {session._state.session_id}")
9192

9293
logger.debug(f"Session pool is not large enough: {self._current_size} < {self._size}, will create new one.")
93-
session = await self._create_new_session()
94+
9495
self._current_size += 1
96+
try:
97+
session = await self._create_new_session()
98+
except YDBError as e:
99+
logger.error("Failed to create new session")
100+
self._current_size -= 1
101+
raise e
102+
95103
return session
96104

97105
async def release(self, session: QuerySession) -> None:

0 commit comments

Comments
 (0)