Skip to content

Commit 7b5d28d

Browse files
committed
[DOP-23620] Fix scheduler not closing DB connections
1 parent 79785c2 commit 7b5d28d

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

syncmaster/scheduler/transfer_job_manager.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from syncmaster.exceptions.transfer import TransferNotFoundError
1313
from syncmaster.scheduler.celery import app as celery
1414
from syncmaster.scheduler.settings import SchedulerAppSettings as Settings
15-
from syncmaster.scheduler.utils import get_async_session
15+
from syncmaster.scheduler.utils import get_async_engine, get_async_session
1616
from syncmaster.schemas.v1.connections.connection_base import ReadAuthDataSchema
1717
from syncmaster.server.services.unit_of_work import UnitOfWork
1818

@@ -54,7 +54,7 @@ async def remove_orphan_jobs(self) -> None:
5454
settings = self.settings
5555
job_transfer_ids = [int(job.id) for job in all_jobs]
5656

57-
async with get_async_session(settings) as session:
57+
async with get_async_engine(settings) as engine, get_async_session(engine) as session:
5858
result = await session.execute(
5959
select(Transfer).where(Transfer.id == any_(job_transfer_ids)), # type: ignore[arg-type]
6060
)
@@ -76,7 +76,7 @@ async def send_job_to_celery(transfer_id: int) -> None: # noqa: WPS602, WPS217
7676
"""
7777
settings = Settings()
7878

79-
async with get_async_session(settings) as session:
79+
async with get_async_engine(settings) as engine, get_async_session(engine) as session:
8080
unit_of_work = UnitOfWork(session=session, settings=settings)
8181

8282
try:

syncmaster/scheduler/utils.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,27 @@
11
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
22
# SPDX-License-Identifier: Apache-2.0
3-
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
3+
import contextlib
4+
from collections.abc import AsyncGenerator
5+
6+
from sqlalchemy.ext.asyncio import (
7+
AsyncEngine,
8+
AsyncSession,
9+
async_sessionmaker,
10+
create_async_engine,
11+
)
412

513
from syncmaster.scheduler.settings import SchedulerAppSettings as Settings
614

715

8-
def get_async_session(settings: Settings) -> AsyncSession:
16+
@contextlib.asynccontextmanager
17+
async def get_async_engine(settings: Settings) -> AsyncGenerator[AsyncEngine, None]:
918
engine = create_async_engine(url=settings.database.sync_url)
19+
try:
20+
yield engine
21+
finally:
22+
await engine.dispose()
23+
24+
25+
def get_async_session(engine: AsyncEngine) -> AsyncSession:
1026
session_factory = async_sessionmaker(bind=engine, class_=AsyncSession, expire_on_commit=False)
1127
return session_factory()

0 commit comments

Comments
 (0)