Skip to content

Commit dd45992

Browse files
authored
Merge pull request #570 from ydb-platform/fix_async_query_pool_race_condition
Fix async query pool acquire race condition
2 parents 47ce490 + 5fa4983 commit dd45992

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: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,20 @@ 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+
171+
async def acquire_session():
172+
session = await pool.acquire()
173+
ids.add(session._state.session_id)
174+
await pool.release(session)
175+
176+
tasks = [acquire_session() for _ in range(10)]
177+
178+
await asyncio.gather(*tasks)
179+
180+
assert len(ids) == 1
181+
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: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,15 @@ async def acquire(self) -> QuerySession:
9090
logger.debug(f"Acquired dead session from queue: {session._state.session_id}")
9191

9292
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()
93+
9494
self._current_size += 1
95+
try:
96+
session = await self._create_new_session()
97+
except Exception as e:
98+
logger.error("Failed to create new session")
99+
self._current_size -= 1
100+
raise e
101+
95102
return session
96103

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

0 commit comments

Comments
 (0)