Skip to content

Commit 2d47ad7

Browse files
committed
Introduce job_submissions_limit for /api/runs/list
1 parent faab7aa commit 2d47ad7

6 files changed

Lines changed: 33 additions & 6 deletions

File tree

src/dstack/_internal/core/models/runs.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,10 @@ def _get_error(termination_reason: Optional[RunTerminationReason]) -> Optional[s
556556

557557
@root_validator
558558
def _status_message(cls, values) -> Dict:
559+
# FIXME: status_message should not require all job submissions for status calculation
560+
# since it's very expensive and is not required for anything else.
561+
# May return a different status if not all job submissions requested.
562+
# TODO: Calculate status_message by looking at job models directly instead job submissions.
559563
try:
560564
status = values["status"]
561565
jobs: List[Job] = values["jobs"]

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ async def list_runs(
5454
repo_id=body.repo_id,
5555
username=body.username,
5656
only_active=body.only_active,
57+
job_submissions_limit=body.job_submissions_limit,
5758
prev_submitted_at=body.prev_submitted_at,
5859
prev_run_id=body.prev_run_id,
5960
limit=body.limit,

src/dstack/_internal/server/schemas/runs.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,20 @@
99

1010

1111
class ListRunsRequest(CoreModel):
12-
project_name: Optional[str]
13-
repo_id: Optional[str]
14-
username: Optional[str]
12+
project_name: Optional[str] = None
13+
repo_id: Optional[str] = None
14+
username: Optional[str] = None
1515
only_active: bool = False
16-
prev_submitted_at: Optional[datetime]
17-
prev_run_id: Optional[UUID]
16+
job_submissions_limit: Optional[int] = Field(
17+
None,
18+
ge=0,
19+
description=(
20+
"Limit number of job submissions returned per job to avoid large responses."
21+
"Drops old job submissions"
22+
),
23+
)
24+
prev_submitted_at: Optional[datetime] = None
25+
prev_run_id: Optional[UUID] = None
1826
limit: int = Field(100, ge=0, le=100)
1927
ascending: bool = False
2028

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ async def list_user_runs(
105105
repo_id: Optional[str],
106106
username: Optional[str],
107107
only_active: bool,
108+
job_submissions_limit: Optional[int],
108109
prev_submitted_at: Optional[datetime],
109110
prev_run_id: Optional[uuid.UUID],
110111
limit: int,
@@ -148,7 +149,11 @@ async def list_user_runs(
148149
runs = []
149150
for r in run_models:
150151
try:
151-
runs.append(run_model_to_run(r, return_in_api=True))
152+
runs.append(
153+
run_model_to_run(
154+
r, return_in_api=True, job_submissions_limit=job_submissions_limit
155+
)
156+
)
152157
except pydantic.ValidationError:
153158
pass
154159
if len(run_models) > len(runs):
@@ -653,6 +658,7 @@ async def delete_runs(
653658
def run_model_to_run(
654659
run_model: RunModel,
655660
include_job_submissions: bool = True,
661+
job_submissions_limit: Optional[int] = None,
656662
return_in_api: bool = False,
657663
include_sensitive: bool = False,
658664
) -> Run:
@@ -666,6 +672,11 @@ def run_model_to_run(
666672
):
667673
submissions = []
668674
job_model = None
675+
if job_submissions_limit is not None:
676+
if job_submissions_limit == 0:
677+
job_submissions = []
678+
else:
679+
job_submissions = list(job_submissions)[-job_submissions_limit:]
669680
for job_model in job_submissions:
670681
if include_job_submissions:
671682
job_submission = job_model_to_job_submission(job_model)

src/dstack/api/_public/runs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ def list(self, all: bool = False, limit: Optional[int] = None) -> List[Run]:
748748
repo_id=None,
749749
only_active=only_active,
750750
limit=limit or 100,
751+
job_submissions_limit=1, # no need to return more than 1 submission per job
751752
)
752753
if only_active and len(runs) == 0:
753754
runs = self._api_client.runs.list(

src/dstack/api/server/_runs.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ def list(
3333
prev_run_id: Optional[UUID] = None,
3434
limit: int = 100,
3535
ascending: bool = False,
36+
job_submissions_limit: Optional[int] = None,
3637
) -> List[Run]:
3738
body = ListRunsRequest(
3839
project_name=project_name,
3940
repo_id=repo_id,
4041
username=username,
4142
only_active=only_active,
43+
job_submissions_limit=job_submissions_limit,
4244
prev_submitted_at=prev_submitted_at,
4345
prev_run_id=prev_run_id,
4446
limit=limit,

0 commit comments

Comments
 (0)