Skip to content

Commit a2bdc6e

Browse files
committed
Do not load InstanceModel.jobs by default
1 parent 900b904 commit a2bdc6e

5 files changed

Lines changed: 19 additions & 9 deletions

File tree

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from sqlalchemy import select
77
from sqlalchemy.ext.asyncio import AsyncSession
8-
from sqlalchemy.orm import joinedload, lazyload, load_only, selectinload
8+
from sqlalchemy.orm import joinedload, load_only, selectinload
99

1010
from dstack._internal.core.backends.base.backend import Backend
1111
from dstack._internal.core.backends.base.compute import ComputeWithVolumeSupport
@@ -229,7 +229,6 @@ async def _process_submitted_job(session: AsyncSession, job_model: JobModel):
229229
InstanceModel.deleted == False,
230230
InstanceModel.total_blocks > InstanceModel.busy_blocks,
231231
)
232-
.options(lazyload(InstanceModel.jobs))
233232
.order_by(InstanceModel.id) # take locks in order
234233
.with_for_update(key_share=True)
235234
)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from sqlalchemy import or_, select
44
from sqlalchemy.ext.asyncio import AsyncSession
5-
from sqlalchemy.orm import joinedload, lazyload
5+
from sqlalchemy.orm import joinedload
66

77
from dstack._internal.core.models.runs import JobStatus
88
from dstack._internal.server.db import get_db, get_session_ctx
@@ -65,7 +65,6 @@ async def _process_next_terminating_job():
6565
InstanceModel.id == job_model.used_instance_id,
6666
InstanceModel.id.not_in(instance_lockset),
6767
)
68-
.options(lazyload(InstanceModel.jobs))
6968
.with_for_update(skip_locked=True, key_share=True)
7069
)
7170
instance_model = res.scalar()
@@ -94,6 +93,7 @@ async def _process_job(session: AsyncSession, job_model: JobModel):
9493
.options(
9594
joinedload(InstanceModel.project).joinedload(ProjectModel.backends),
9695
joinedload(InstanceModel.volume_attachments).joinedload(VolumeAttachmentModel.volume),
96+
joinedload(InstanceModel.jobs).load_only(JobModel.id),
9797
)
9898
)
9999
instance_model = res.unique().scalar()

src/dstack/_internal/server/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ class InstanceModel(BaseModel):
619619
total_blocks: Mapped[Optional[int]] = mapped_column(Integer)
620620
busy_blocks: Mapped[int] = mapped_column(Integer, default=0)
621621

622-
jobs: Mapped[list["JobModel"]] = relationship(back_populates="instance", lazy="joined")
622+
jobs: Mapped[list["JobModel"]] = relationship(back_populates="instance")
623623
last_job_processed_at: Mapped[Optional[datetime]] = mapped_column(NaiveDateTime)
624624

625625
volume_attachments: Mapped[List["VolumeAttachmentModel"]] = relationship(

src/dstack/_internal/server/services/fleets.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
from dstack._internal.server.models import (
5050
FleetModel,
5151
InstanceModel,
52+
JobModel,
5253
ProjectModel,
5354
UserModel,
5455
)
@@ -398,7 +399,11 @@ async def apply_plan(
398399
FleetModel.id == fleet_model.id,
399400
FleetModel.deleted == False,
400401
)
401-
.options(selectinload(FleetModel.instances))
402+
.options(
403+
selectinload(FleetModel.instances)
404+
.joinedload(InstanceModel.jobs)
405+
.load_only(JobModel.id)
406+
)
402407
.options(selectinload(FleetModel.runs))
403408
.execution_options(populate_existing=True)
404409
.order_by(FleetModel.id) # take locks in order
@@ -563,7 +568,11 @@ async def delete_fleets(
563568
FleetModel.name.in_(names),
564569
FleetModel.deleted == False,
565570
)
566-
.options(selectinload(FleetModel.instances))
571+
.options(
572+
selectinload(FleetModel.instances)
573+
.joinedload(InstanceModel.jobs)
574+
.load_only(JobModel.id)
575+
)
567576
.options(selectinload(FleetModel.runs))
568577
.execution_options(populate_existing=True)
569578
.order_by(FleetModel.id) # take locks in order

src/dstack/_internal/server/services/jobs/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import requests
88
from sqlalchemy import select
99
from sqlalchemy.ext.asyncio import AsyncSession
10-
from sqlalchemy.orm import joinedload
10+
from sqlalchemy.orm import joinedload, load_only
1111

1212
import dstack._internal.server.services.backends as backends_services
1313
from dstack._internal.core.backends.base.backend import Backend
@@ -559,11 +559,13 @@ def _should_force_detach_volume(job_model: JobModel, stop_duration: Optional[int
559559

560560
async def get_instances_ids_with_detaching_volumes(session: AsyncSession) -> List[UUID]:
561561
res = await session.execute(
562-
select(JobModel).where(
562+
select(JobModel)
563+
.where(
563564
JobModel.status == JobStatus.TERMINATING,
564565
JobModel.used_instance_id.is_not(None),
565566
JobModel.volumes_detached_at.is_not(None),
566567
)
568+
.options(load_only(JobModel.used_instance_id))
567569
)
568570
job_models = res.scalars().all()
569571
return [jm.used_instance_id for jm in job_models if jm.used_instance_id]

0 commit comments

Comments
 (0)