44from datetime import timedelta
55from typing import Sequence
66
7- from sqlalchemy import delete , or_ , select , update
8- from sqlalchemy .orm import load_only , selectinload
7+ from sqlalchemy import delete , or_ , select , true , update
8+ from sqlalchemy .orm import joinedload , load_only , selectinload
99
10- from dstack ._internal .core .models .runs import RunStatus
10+ from dstack ._internal .core .models .runs import JobStatus , RunStatus
1111from dstack ._internal .server .background .pipeline_tasks .base import (
1212 Fetcher ,
1313 Heartbeater ,
2525from dstack ._internal .server .models import (
2626 InstanceModel ,
2727 JobModel ,
28+ ProjectModel ,
2829 RunModel ,
2930 ServiceRouterWorkerSyncModel ,
3031)
@@ -105,7 +106,7 @@ def _workers(self) -> Sequence["ServiceRouterWorkerSyncWorker"]:
105106
106107
107108class ServiceRouterWorkerSyncFetcher (Fetcher [ServiceRouterWorkerSyncPipelineItem ]):
108- @sentry_utils .instrument_named_task ( "pipeline_tasks. ServiceRouterWorkerSyncFetcher.fetch" )
109+ @sentry_utils .instrument_pipeline_task ( " ServiceRouterWorkerSyncFetcher.fetch" )
109110 async def fetch (self , limit : int ) -> list [ServiceRouterWorkerSyncPipelineItem ]:
110111 sync_lock , _ = get_locker (get_db ().dialect_name ).get_lockset (
111112 ServiceRouterWorkerSyncModel .__tablename__
@@ -183,7 +184,7 @@ def __init__(
183184 pipeline_hinter = pipeline_hinter ,
184185 )
185186
186- @sentry_utils .instrument_named_task ( "pipeline_tasks. ServiceRouterWorkerSyncWorker.process" )
187+ @sentry_utils .instrument_pipeline_task ( " ServiceRouterWorkerSyncWorker.process" )
187188 async def process (self , item : ServiceRouterWorkerSyncPipelineItem ) -> None :
188189 async with get_session_ctx () as session :
189190 res = await session .execute (
@@ -199,10 +200,6 @@ async def process(self, item: ServiceRouterWorkerSyncPipelineItem) -> None:
199200 log_lock_token_mismatch (logger , item )
200201 return
201202 run_model = sync_row .run
202- if run_model is None :
203- await session .delete (sync_row )
204- await session .commit ()
205- return
206203 if (
207204 run_model .deleted
208205 or run_model .status .is_finished ()
@@ -218,11 +215,30 @@ async def process(self, item: ServiceRouterWorkerSyncPipelineItem) -> None:
218215 select (RunModel )
219216 .where (RunModel .id == item .run_id )
220217 .options (
221- selectinload (RunModel .project ),
222- selectinload (RunModel .jobs ).selectinload (JobModel .project ),
223- selectinload (RunModel .jobs )
224- .selectinload (JobModel .instance )
225- .selectinload (InstanceModel .project ),
218+ load_only (RunModel .id , RunModel .run_spec ),
219+ selectinload (
220+ RunModel .jobs .and_ (
221+ JobModel .status == JobStatus .RUNNING ,
222+ JobModel .registered == true (),
223+ )
224+ )
225+ .load_only (
226+ JobModel .id ,
227+ JobModel .status ,
228+ JobModel .registered ,
229+ JobModel .job_spec_data ,
230+ JobModel .job_provisioning_data ,
231+ JobModel .job_runtime_data ,
232+ )
233+ .options (
234+ joinedload (JobModel .project ).load_only (
235+ ProjectModel .id , ProjectModel .ssh_private_key
236+ ),
237+ joinedload (JobModel .instance )
238+ .load_only (InstanceModel .id , InstanceModel .remote_connection_info )
239+ .joinedload (InstanceModel .project )
240+ .load_only (ProjectModel .id , ProjectModel .ssh_private_key ),
241+ ),
226242 )
227243 )
228244 run_for_sync = res .unique ().scalar_one_or_none ()
0 commit comments