1010import httpx
1111from sqlalchemy import func , select , update
1212from sqlalchemy .ext .asyncio import AsyncSession
13- from sqlalchemy .orm import selectinload
13+ from sqlalchemy .orm import joinedload , selectinload
1414
1515import dstack ._internal .utils .random_names as random_names
1616from dstack ._internal .core .backends .base .compute import (
4242from dstack ._internal .server import settings
4343from dstack ._internal .server .db import get_db , is_db_postgres , is_db_sqlite
4444from dstack ._internal .server .models import (
45+ BackendModel ,
4546 GatewayComputeModel ,
4647 GatewayModel ,
4748 ProjectModel ,
@@ -329,9 +330,10 @@ async def _delete_gateways_pipeline(
329330 GatewayModel .project_id == project .id ,
330331 GatewayModel .lock_expires_at .is_ (None ),
331332 )
332- .execution_options ( populate_existing = True )
333+ .options ( joinedload ( GatewayModel . backend ). load_only ( BackendModel . type ) )
333334 .order_by (GatewayModel .id ) # take locks in order
334- .with_for_update (key_share = True , nowait = True )
335+ .with_for_update (key_share = True , nowait = True , of = GatewayModel )
336+ .execution_options (populate_existing = True )
335337 )
336338 gateway_models = res .scalars ().all ()
337339 if len (gateway_models ) != len (gateways_ids ):
@@ -340,6 +342,9 @@ async def _delete_gateways_pipeline(
340342 raise ServerClientError (
341343 "Failed to delete gateways: gateways are being processed currently. Try again later."
342344 )
345+ for gateway_model in gateway_models :
346+ if gateway_model .backend .type == BackendType .DSTACK :
347+ raise ServerClientError ("Cannot delete dstack Sky gateway" )
343348 for gateway_model in gateway_models :
344349 if not gateway_model .to_be_deleted :
345350 gateway_model .to_be_deleted = True
0 commit comments