Skip to content

Commit a07ef35

Browse files
authored
Optimize list and get fleets (#3472)
* Do not include deleted instances when listing fleets * Do not include deleted instances when getting fleet * Optimize select in generate_volume_name
1 parent 628bb8b commit a07ef35

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ async def list_fleets(
4747
"""
4848
Returns all fleets and instances within them visible to user sorted by descending `created_at`.
4949
`project_name` and `only_active` can be specified as filters.
50+
Includes only active fleet instances. To list all fleet instances, use `/api/instances/list`.
5051
5152
The results are paginated. To get the next page, pass `created_at` and `id` of
5253
the last fleet from the previous page as `prev_created_at` and `prev_id`.
@@ -72,6 +73,7 @@ async def list_project_fleets(
7273
):
7374
"""
7475
Returns all fleets in the project.
76+
Includes only active fleet instances. To list all fleet instances, use `/api/instances/list`.
7577
"""
7678
_, project = user_project
7779
return CustomORJSONResponse(

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,7 @@ async def list_fleets(
180180
limit=limit,
181181
ascending=ascending,
182182
)
183-
return [
184-
fleet_model_to_fleet(v, include_deleted_instances=not only_active) for v in fleet_models
185-
]
183+
return [fleet_model_to_fleet(v) for v in fleet_models]
186184

187185

188186
async def list_projects_fleet_models(
@@ -227,7 +225,7 @@ async def list_projects_fleet_models(
227225
.where(*filters)
228226
.order_by(*order_by)
229227
.limit(limit)
230-
.options(joinedload(FleetModel.instances))
228+
.options(joinedload(FleetModel.instances.and_(InstanceModel.deleted == False)))
231229
)
232230
fleet_models = list(res.unique().scalars().all())
233231
return fleet_models
@@ -256,7 +254,9 @@ async def list_project_fleet_models(
256254
if not include_deleted:
257255
filters.append(FleetModel.deleted == False)
258256
res = await session.execute(
259-
select(FleetModel).where(*filters).options(joinedload(FleetModel.instances))
257+
select(FleetModel)
258+
.where(*filters)
259+
.options(joinedload(FleetModel.instances.and_(InstanceModel.deleted == False)))
260260
)
261261
return list(res.unique().scalars().all())
262262

@@ -293,7 +293,9 @@ async def get_project_fleet_model_by_id(
293293
FleetModel.project_id == project.id,
294294
]
295295
res = await session.execute(
296-
select(FleetModel).where(*filters).options(joinedload(FleetModel.instances))
296+
select(FleetModel)
297+
.where(*filters)
298+
.options(joinedload(FleetModel.instances.and_(InstanceModel.deleted == False)))
297299
)
298300
return res.unique().scalar_one_or_none()
299301

@@ -311,7 +313,9 @@ async def get_project_fleet_model_by_name(
311313
if not include_deleted:
312314
filters.append(FleetModel.deleted == False)
313315
res = await session.execute(
314-
select(FleetModel).where(*filters).options(joinedload(FleetModel.instances))
316+
select(FleetModel)
317+
.where(*filters)
318+
.options(joinedload(FleetModel.instances.and_(InstanceModel.deleted == False)))
315319
)
316320
return res.unique().scalar_one_or_none()
317321

@@ -717,8 +721,13 @@ def get_fleet_spec(fleet_model: FleetModel) -> FleetSpec:
717721

718722

719723
async def generate_fleet_name(session: AsyncSession, project: ProjectModel) -> str:
720-
fleet_models = await list_project_fleet_models(session=session, project=project)
721-
names = {v.name for v in fleet_models}
724+
res = await session.execute(
725+
select(FleetModel.name).where(
726+
FleetModel.project_id == project.id,
727+
FleetModel.deleted == False,
728+
)
729+
)
730+
names = set(res.scalars().all())
722731
while True:
723732
name = random_names.generate_name()
724733
if name not in names:

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,13 @@ def instance_model_to_volume_instance(instance_model: InstanceModel) -> VolumeIn
380380

381381

382382
async def generate_volume_name(session: AsyncSession, project: ProjectModel) -> str:
383-
volume_models = await list_project_volume_models(session=session, project=project)
384-
names = {v.name for v in volume_models}
383+
res = await session.execute(
384+
select(VolumeModel.name).where(
385+
VolumeModel.project_id == project.id,
386+
VolumeModel.deleted == False,
387+
)
388+
)
389+
names = set(res.scalars().all())
385390
while True:
386391
name = random_names.generate_name()
387392
if name not in names:

0 commit comments

Comments
 (0)