fix: accept queued lifecycle assignments

This commit is contained in:
2026-08-22 23:58:55 +09:00
parent bc57ef38c1
commit 92d073ff36
+28 -2
View File
@@ -8444,6 +8444,7 @@ async fn scoped_restore_runtime_worker(
.into()); .into());
} }
assign_ticket_worker_from_lifecycle(&api, assignment, &runtime_id, &worker_id)?; assign_ticket_worker_from_lifecycle(&api, assignment, &runtime_id, &worker_id)?;
accept_queued_ticket_after_worker_spawn(&api, assignment)?;
let worker = project_workspace_worker(&api, worker)?; let worker = project_workspace_worker(&api, worker)?;
return Ok(Json(workspace_api::WorkerRestoreResponse { return Ok(Json(workspace_api::WorkerRestoreResponse {
workspace_id, workspace_id,
@@ -8464,6 +8465,7 @@ async fn scoped_restore_runtime_worker(
.await?; .await?;
if let Some(assignment) = assignment_request.as_ref() { if let Some(assignment) = assignment_request.as_ref() {
assign_ticket_worker_from_lifecycle(&api, assignment, &runtime_id, &worker_id)?; assign_ticket_worker_from_lifecycle(&api, assignment, &runtime_id, &worker_id)?;
accept_queued_ticket_after_worker_spawn(&api, assignment)?;
} }
Ok(response) Ok(response)
} }
@@ -10747,6 +10749,7 @@ async fn create_runtime_worker(
&runtime_id, &runtime_id,
&worker.worker.worker_id, &worker.worker.worker_id,
)?; )?;
accept_queued_ticket_after_worker_spawn(&api, assignment)?;
return Ok(Json(WorkerSpawnResult { return Ok(Json(WorkerSpawnResult {
state: WorkerOperationState::Accepted, state: WorkerOperationState::Accepted,
worker: Some(worker), worker: Some(worker),
@@ -10851,6 +10854,13 @@ async fn create_runtime_worker(
) )
.map_err(ApiError::from), .map_err(ApiError::from),
)?; )?;
finalize_worker_spawn_stage(
&api,
worker,
&compensation,
WorkerSpawnFinalizeStage::TicketStateAccept,
accept_queued_ticket_after_worker_spawn(&api, assignment).map_err(ApiError::from),
)?;
} }
if worker.working_directory.is_none() { if worker.working_directory.is_none() {
if let Some(workdir_id) = prepared_workdir_id.as_deref() { if let Some(workdir_id) = prepared_workdir_id.as_deref() {
@@ -16364,7 +16374,7 @@ mod tests {
let api = test_api(dir.path()).await; let api = test_api(dir.path()).await;
let backend = browser_ticket_backend(&api).unwrap(); let backend = browser_ticket_backend(&api).unwrap();
let mut first_ticket_input = ticket::NewTicket::new("Spawn assignment"); let mut first_ticket_input = ticket::NewTicket::new("Spawn assignment");
first_ticket_input.workflow_state = Some(TicketWorkflowState::InProgress); first_ticket_input.workflow_state = Some(TicketWorkflowState::Queued);
let first_ticket = backend.create(first_ticket_input).unwrap(); let first_ticket = backend.create(first_ticket_input).unwrap();
assign_test_orchestrator(&api, &first_ticket.id); assign_test_orchestrator(&api, &first_ticket.id);
let request = WorkerSpawnRequest { let request = WorkerSpawnRequest {
@@ -16421,6 +16431,14 @@ mod tests {
.map(|worker| worker.worker_id), .map(|worker| worker.worker_id),
Some(first_worker.worker.worker_id.clone()) Some(first_worker.worker.worker_id.clone())
); );
assert_eq!(
backend
.show(first_ticket.id.clone().into())
.unwrap()
.meta
.workflow_state,
TicketWorkflowState::InProgress
);
let Json(retried) = scoped_create_runtime_worker( let Json(retried) = scoped_create_runtime_worker(
State(api.clone()), State(api.clone()),
AxumPath(ScopedRuntimePath { AxumPath(ScopedRuntimePath {
@@ -16469,7 +16487,7 @@ mod tests {
) )
.unwrap(); .unwrap();
let mut second_ticket_input = ticket::NewTicket::new("Restore assignment"); let mut second_ticket_input = ticket::NewTicket::new("Restore assignment");
second_ticket_input.workflow_state = Some(TicketWorkflowState::InProgress); second_ticket_input.workflow_state = Some(TicketWorkflowState::Queued);
let second_ticket = backend.create(second_ticket_input).unwrap(); let second_ticket = backend.create(second_ticket_input).unwrap();
assign_test_orchestrator(&api, &second_ticket.id); assign_test_orchestrator(&api, &second_ticket.id);
let _ = scoped_restore_runtime_worker( let _ = scoped_restore_runtime_worker(
@@ -16518,6 +16536,14 @@ mod tests {
restored_assignment.worker.worker_id, restored_assignment.worker.worker_id,
first_worker.worker.worker_id first_worker.worker.worker_id
); );
assert_eq!(
backend
.show(second_ticket.id.clone().into())
.unwrap()
.meta
.workflow_state,
TicketWorkflowState::InProgress
);
api.store api.store
.clear_current_ticket_worker_assignment( .clear_current_ticket_worker_assignment(