Skip to content

Commit dcfbe2f

Browse files
committed
wip
1 parent 3c3b663 commit dcfbe2f

4 files changed

Lines changed: 39 additions & 28 deletions

File tree

src/ai/backend/manager/data/deployment/types.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -380,24 +380,12 @@ class DeploymentInfo:
380380
deploying_revision_id: UUID | None = None
381381
sub_step: DeploymentSubStep | None = None
382382

383-
def resolve_revision_spec(self, revision_id: UUID | None = None) -> ModelRevisionSpec | None:
384-
"""Resolve a revision spec with fallback: revision_id → deploying → current."""
385-
for candidate_id in (revision_id, self.deploying_revision_id, self.current_revision_id):
386-
if candidate_id is None:
387-
continue
388-
found = next(
389-
(r for r in self.model_revisions if r.revision_id == candidate_id),
390-
None,
391-
)
392-
if found is not None:
393-
return found
394-
return None
395-
396-
def current_revision_spec(self) -> ModelRevisionSpec | None:
397-
return self.resolve_revision_spec(self.current_revision_id)
398-
399-
def deploying_revision_spec(self) -> ModelRevisionSpec | None:
400-
return self.resolve_revision_spec(self.deploying_revision_id)
383+
def resolve_revision_spec(self, revision_id: UUID) -> ModelRevisionSpec | None:
384+
"""Find a ModelRevisionSpec by revision_id from model_revisions."""
385+
return next(
386+
(r for r in self.model_revisions if r.revision_id == revision_id),
387+
None,
388+
)
401389

402390

403391
@dataclass

src/ai/backend/manager/repositories/scheduler/types/session_creation.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,18 @@ def from_deployment_info(
117117
) -> Self:
118118
session_creation_id = secrets.token_urlsafe(16)
119119
# Use the specified revision, falling back to deploying then current.
120-
target_revision = deployment_info.resolve_revision_spec(revision_id)
121-
if target_revision is None:
120+
target_revision_id = (
121+
revision_id
122+
or deployment_info.deploying_revision_id
123+
or deployment_info.current_revision_id
124+
)
125+
if target_revision_id is None:
122126
raise DeploymentHasNoTargetRevision("Deployment has no revision for session creation")
127+
target_revision = deployment_info.resolve_revision_spec(target_revision_id)
128+
if target_revision is None:
129+
raise DeploymentHasNoTargetRevision(
130+
f"Revision {target_revision_id} not found in model_revisions"
131+
)
123132

124133
# Prepare mount spec
125134
mount_spec = target_revision.mounts.to_mount_spec()

src/ai/backend/manager/sokovan/deployment/deployment_controller.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,14 @@ async def update_deployment(
147147
modified_endpoint = await self._deployment_repository.get_modified_endpoint(
148148
endpoint_id=endpoint_id, updater=updater
149149
)
150-
current_revision = modified_endpoint.current_revision_spec()
151-
if current_revision:
152-
await self._scheduling_controller.validate_session_spec(
153-
SessionValidationSpec.from_revision(model_revision=current_revision)
150+
if modified_endpoint.current_revision_id is not None:
151+
current_revision = modified_endpoint.resolve_revision_spec(
152+
modified_endpoint.current_revision_id
154153
)
154+
if current_revision:
155+
await self._scheduling_controller.validate_session_spec(
156+
SessionValidationSpec.from_revision(model_revision=current_revision)
157+
)
155158
res = await self._deployment_repository.update_endpoint_with_spec(updater)
156159
try:
157160
await self.mark_lifecycle_needed(DeploymentLifecycleType.CHECK_REPLICA)

src/ai/backend/manager/sokovan/deployment/executor.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,20 @@ async def check_pending_deployments(
127127
valid_deployments: list[DeploymentWithHistory] = []
128128
for deployment in deployments:
129129
info = deployment.deployment_info
130-
current_revision = info.current_revision_spec()
131-
if not current_revision:
130+
if info.current_revision_id is None:
132131
log.warning(
133132
"Deployment {} has no current revision, skipping",
134133
info.id,
135134
)
136135
continue
136+
current_revision = info.resolve_revision_spec(info.current_revision_id)
137+
if not current_revision:
138+
log.warning(
139+
"Deployment {} current revision {} not found in model_revisions, skipping",
140+
info.id,
141+
info.current_revision_id,
142+
)
143+
continue
137144
targets = scaling_group_targets[info.metadata.resource_group]
138145
if not targets:
139146
log.warning(
@@ -443,11 +450,15 @@ async def _register_endpoint(
443450

444451
with recorder.phase("register_endpoint"):
445452
with recorder.step("check_target_revision"):
446-
current_revision = deployment.current_revision_spec()
447-
if not current_revision:
453+
if deployment.current_revision_id is None:
448454
raise ModelDefinitionNotFound(
449455
f"No current revision for deployment {deployment.id}"
450456
)
457+
current_revision = deployment.resolve_revision_spec(deployment.current_revision_id)
458+
if not current_revision:
459+
raise ModelDefinitionNotFound(
460+
f"Current revision {deployment.current_revision_id} not found for deployment {deployment.id}"
461+
)
451462

452463
with recorder.step("generate_model_definition"):
453464
model_definition = (

0 commit comments

Comments
 (0)