From 92d073ff3611ffe336291cc81ef052e0c39c9cd9 Mon Sep 17 00:00:00 2001 From: Hare Date: Sat, 22 Aug 2026 23:58:55 +0900 Subject: [PATCH] fix: accept queued lifecycle assignments --- crates/workspace-server/src/server.rs | 30 +++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/crates/workspace-server/src/server.rs b/crates/workspace-server/src/server.rs index 0b3ff5da..949c4f7b 100644 --- a/crates/workspace-server/src/server.rs +++ b/crates/workspace-server/src/server.rs @@ -8444,6 +8444,7 @@ async fn scoped_restore_runtime_worker( .into()); } 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)?; return Ok(Json(workspace_api::WorkerRestoreResponse { workspace_id, @@ -8464,6 +8465,7 @@ async fn scoped_restore_runtime_worker( .await?; if let Some(assignment) = assignment_request.as_ref() { assign_ticket_worker_from_lifecycle(&api, assignment, &runtime_id, &worker_id)?; + accept_queued_ticket_after_worker_spawn(&api, assignment)?; } Ok(response) } @@ -10747,6 +10749,7 @@ async fn create_runtime_worker( &runtime_id, &worker.worker.worker_id, )?; + accept_queued_ticket_after_worker_spawn(&api, assignment)?; return Ok(Json(WorkerSpawnResult { state: WorkerOperationState::Accepted, worker: Some(worker), @@ -10851,6 +10854,13 @@ async fn create_runtime_worker( ) .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 let Some(workdir_id) = prepared_workdir_id.as_deref() { @@ -16364,7 +16374,7 @@ mod tests { let api = test_api(dir.path()).await; let backend = browser_ticket_backend(&api).unwrap(); 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(); assign_test_orchestrator(&api, &first_ticket.id); let request = WorkerSpawnRequest { @@ -16421,6 +16431,14 @@ mod tests { .map(|worker| worker.worker_id), 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( State(api.clone()), AxumPath(ScopedRuntimePath { @@ -16469,7 +16487,7 @@ mod tests { ) .unwrap(); 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(); assign_test_orchestrator(&api, &second_ticket.id); let _ = scoped_restore_runtime_worker( @@ -16518,6 +16536,14 @@ mod tests { restored_assignment.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 .clear_current_ticket_worker_assignment(