fix: retry retained workdir removal

This commit is contained in:
2026-09-12 13:30:25 +09:00
parent 4a89c04732
commit 5564425488
2 changed files with 43 additions and 2 deletions
+26 -1
View File
@@ -11352,7 +11352,9 @@ fn execute_reserved_workdir_removal_with_provider(
recovery: bool,
provider: &dyn WorkdirRemovalRuntimeProvider,
) -> Result<WorkdirRemovalOperation> {
if operation.state == WorkdirRemovalOperationState::Completed {
if operation.state == WorkdirRemovalOperationState::Completed
&& operation.disposition == Some(WorkdirRemovalDisposition::Removed)
{
return Ok(operation);
}
let operation = if recovery && operation.state == WorkdirRemovalOperationState::Pending {
@@ -26667,6 +26669,7 @@ mod tests {
assert_eq!(unknown_provider.cleanup_calls(), 0);
let (dirty_operation, mut dirty_summary) = reserve_removal_fixture(&api, "provider-dirty");
let clean_retry_summary = dirty_summary.clone();
dirty_summary.cleanliness = Some("dirty".to_string());
let dirty_provider = FakeWorkdirRemovalProvider::new(
workdir_removal_result(
@@ -26686,6 +26689,28 @@ mod tests {
assert_eq!(dirty.disposition, Some(WorkdirRemovalDisposition::Retained));
assert_eq!(dirty_provider.cleanup_calls(), 0);
let clean_retry_provider = FakeWorkdirRemovalProvider::new(
workdir_removal_result(
WorkerOperationState::Accepted,
Some(clean_retry_summary),
Vec::new(),
),
workdir_removal_result(WorkerOperationState::Accepted, None, Vec::new()),
);
let removed_after_retry = execute_reserved_workdir_removal_with_provider(
&api,
dirty,
false,
&clean_retry_provider,
)
.unwrap();
assert_eq!(
removed_after_retry.disposition,
Some(WorkdirRemovalDisposition::Removed)
);
assert_eq!(removed_after_retry.attempt_count, 2);
assert_eq!(clean_retry_provider.cleanup_calls(), 1);
let (corrupted_operation, mut corrupted_summary) =
reserve_removal_fixture(&api, "provider-corrupted");
corrupted_summary.status = WorkingDirectoryStatusKind::Corrupted;
+17 -1
View File
@@ -264,7 +264,9 @@ impl SqliteWorkspaceStore {
let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?;
let operation =
require_operation(&tx, workspace_id, operation_id, request_fingerprint)?;
if operation.state == WorkdirRemovalOperationState::Completed {
if operation.state == WorkdirRemovalOperationState::Completed
&& operation.disposition == Some(WorkdirRemovalDisposition::Removed)
{
tx.commit()?;
return Ok(operation);
}
@@ -1197,5 +1199,19 @@ mod tests {
.unwrap()
.is_some()
);
let retry = store
.begin_workdir_removal_attempt(
&retained.workspace_id,
&retained.operation_id,
&retained.request_fingerprint,
attempt_owner(),
)
.unwrap();
assert_eq!(retry.state, WorkdirRemovalOperationState::Pending);
assert_eq!(retry.attempt_count, 1);
assert_eq!(retry.disposition, None);
assert_eq!(retry.failure_category, None);
assert!(retry.retryable);
}
}