Skip to content

Commit 2a7cfad

Browse files
committed
Optimize process_fleets queries
1 parent 8d262c2 commit 2a7cfad

3 files changed

Lines changed: 34 additions & 6 deletions

File tree

src/dstack/_internal/server/background/tasks/process_fleets.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from dstack._internal.core.models.fleets import FleetStatus
99
from dstack._internal.server.db import get_db, get_session_ctx
10-
from dstack._internal.server.models import FleetModel
10+
from dstack._internal.server.models import FleetModel, InstanceModel, JobModel, RunModel
1111
from dstack._internal.server.services.fleets import (
1212
is_fleet_empty,
1313
is_fleet_in_use,
@@ -64,9 +64,11 @@ async def _process_fleet(session: AsyncSession, fleet_model: FleetModel):
6464
res = await session.execute(
6565
select(FleetModel)
6666
.where(FleetModel.id == fleet_model.id)
67-
.options(joinedload(FleetModel.project))
68-
.options(joinedload(FleetModel.instances))
69-
.options(joinedload(FleetModel.runs))
67+
.options(joinedload(FleetModel.instances).load_only(InstanceModel.deleted))
68+
.options(
69+
joinedload(FleetModel.instances).joinedload(InstanceModel.jobs).load_only(JobModel.id)
70+
)
71+
.options(joinedload(FleetModel.runs).load_only(RunModel.status))
7072
.execution_options(populate_existing=True)
7173
)
7274
fleet_model = res.unique().scalar_one()

src/dstack/_internal/server/background/tasks/process_idle_volumes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from dstack._internal.core.models.profiles import parse_duration
1111
from dstack._internal.core.models.volumes import VolumeStatus
1212
from dstack._internal.server.db import get_db, get_session_ctx
13-
from dstack._internal.server.models import ProjectModel, VolumeModel
13+
from dstack._internal.server.models import ProjectModel, UserModel, VolumeModel
1414
from dstack._internal.server.services import backends as backends_services
1515
from dstack._internal.server.services.locking import get_locker
1616
from dstack._internal.server.services.volumes import (
@@ -49,7 +49,7 @@ async def process_idle_volumes():
4949
select(VolumeModel)
5050
.where(VolumeModel.id.in_(volume_ids))
5151
.options(joinedload(VolumeModel.project).joinedload(ProjectModel.backends))
52-
.options(joinedload(VolumeModel.user))
52+
.options(joinedload(VolumeModel.user).load_only(UserModel.name))
5353
.options(joinedload(VolumeModel.attachments))
5454
.execution_options(populate_existing=True)
5555
)

src/tests/_internal/server/background/tasks/test_process_fleets.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
from sqlalchemy.ext.asyncio import AsyncSession
33

44
from dstack._internal.core.models.fleets import FleetStatus
5+
from dstack._internal.core.models.instances import InstanceStatus
56
from dstack._internal.core.models.runs import RunStatus
67
from dstack._internal.core.models.users import GlobalRole, ProjectRole
78
from dstack._internal.server.background.tasks.process_fleets import process_fleets
89
from dstack._internal.server.services.projects import add_project_member
910
from dstack._internal.server.testing.common import (
1011
create_fleet,
12+
create_instance,
1113
create_project,
1214
create_repo,
1315
create_run,
@@ -75,3 +77,27 @@ async def test_does_not_delete_fleet_with_active_run(self, test_db, session: Asy
7577
await process_fleets()
7678
await session.refresh(fleet)
7779
assert not fleet.deleted
80+
81+
@pytest.mark.asyncio
82+
@pytest.mark.parametrize("test_db", ["sqlite", "postgres"], indirect=True)
83+
async def test_does_not_delete_fleet_with_instance(self, test_db, session: AsyncSession):
84+
project = await create_project(session)
85+
fleet = await create_fleet(
86+
session=session,
87+
project=project,
88+
)
89+
user = await create_user(session=session, global_role=GlobalRole.USER)
90+
await add_project_member(
91+
session=session, project=project, user=user, project_role=ProjectRole.USER
92+
)
93+
instance = await create_instance(
94+
session=session,
95+
project=project,
96+
fleet=fleet,
97+
status=InstanceStatus.IDLE,
98+
)
99+
fleet.instances.append(instance)
100+
await session.commit()
101+
await process_fleets()
102+
await session.refresh(fleet)
103+
assert not fleet.deleted

0 commit comments

Comments
 (0)