fix: retry retained workdir removal
This commit is contained in:
@@ -11352,7 +11352,9 @@ fn execute_reserved_workdir_removal_with_provider(
|
|||||||
recovery: bool,
|
recovery: bool,
|
||||||
provider: &dyn WorkdirRemovalRuntimeProvider,
|
provider: &dyn WorkdirRemovalRuntimeProvider,
|
||||||
) -> Result<WorkdirRemovalOperation> {
|
) -> Result<WorkdirRemovalOperation> {
|
||||||
if operation.state == WorkdirRemovalOperationState::Completed {
|
if operation.state == WorkdirRemovalOperationState::Completed
|
||||||
|
&& operation.disposition == Some(WorkdirRemovalDisposition::Removed)
|
||||||
|
{
|
||||||
return Ok(operation);
|
return Ok(operation);
|
||||||
}
|
}
|
||||||
let operation = if recovery && operation.state == WorkdirRemovalOperationState::Pending {
|
let operation = if recovery && operation.state == WorkdirRemovalOperationState::Pending {
|
||||||
@@ -26667,6 +26669,7 @@ mod tests {
|
|||||||
assert_eq!(unknown_provider.cleanup_calls(), 0);
|
assert_eq!(unknown_provider.cleanup_calls(), 0);
|
||||||
|
|
||||||
let (dirty_operation, mut dirty_summary) = reserve_removal_fixture(&api, "provider-dirty");
|
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());
|
dirty_summary.cleanliness = Some("dirty".to_string());
|
||||||
let dirty_provider = FakeWorkdirRemovalProvider::new(
|
let dirty_provider = FakeWorkdirRemovalProvider::new(
|
||||||
workdir_removal_result(
|
workdir_removal_result(
|
||||||
@@ -26686,6 +26689,28 @@ mod tests {
|
|||||||
assert_eq!(dirty.disposition, Some(WorkdirRemovalDisposition::Retained));
|
assert_eq!(dirty.disposition, Some(WorkdirRemovalDisposition::Retained));
|
||||||
assert_eq!(dirty_provider.cleanup_calls(), 0);
|
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) =
|
let (corrupted_operation, mut corrupted_summary) =
|
||||||
reserve_removal_fixture(&api, "provider-corrupted");
|
reserve_removal_fixture(&api, "provider-corrupted");
|
||||||
corrupted_summary.status = WorkingDirectoryStatusKind::Corrupted;
|
corrupted_summary.status = WorkingDirectoryStatusKind::Corrupted;
|
||||||
|
|||||||
@@ -264,7 +264,9 @@ impl SqliteWorkspaceStore {
|
|||||||
let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?;
|
let tx = conn.transaction_with_behavior(TransactionBehavior::Immediate)?;
|
||||||
let operation =
|
let operation =
|
||||||
require_operation(&tx, workspace_id, operation_id, request_fingerprint)?;
|
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()?;
|
tx.commit()?;
|
||||||
return Ok(operation);
|
return Ok(operation);
|
||||||
}
|
}
|
||||||
@@ -1197,5 +1199,19 @@ mod tests {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.is_some()
|
.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user