diff --git a/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs b/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs index 640c4779a..9ad869212 100644 --- a/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs +++ b/crates/ecstore/src/bucket/lifecycle/bucket_lifecycle_ops.rs @@ -4594,11 +4594,12 @@ mod tests { use crate::bucket::lifecycle::config_boundary; use crate::bucket::lifecycle::manual_transition_job::{ ManualTransitionJobRecord, ManualTransitionJobState, ManualTransitionScopeAdmission, ManualTransitionScopeAdmissionClaim, - claim_manual_transition_scope_admission, delete_manual_transition_scope_admission_if_current, - legacy_manual_transition_scope_key, load_manual_transition_job_record, load_manual_transition_scope_admission, - load_manual_transition_scope_admission_with_etag, manual_transition_scope_record_object_name, - renew_manual_transition_job_lease, request_manual_transition_job_cancel, save_manual_transition_job_record, - save_manual_transition_scope_admission_if_absent, save_manual_transition_scope_admission_if_current, + ManualTransitionWorkerResult, claim_manual_transition_scope_admission, legacy_manual_transition_scope_key, + delete_manual_transition_scope_admission_if_current, load_manual_transition_job_record, + load_manual_transition_scope_admission, load_manual_transition_scope_admission_with_etag, + manual_transition_scope_record_object_name, renew_manual_transition_job_lease, request_manual_transition_job_cancel, + save_manual_transition_job_record, save_manual_transition_scope_admission_if_absent, + save_manual_transition_scope_admission_if_current, }; use crate::bucket::lifecycle::replication_sink::{ ReplicateDecision, ReplicateTargetDecision, ReplicationStatusType, VersionPurgeStatusType, @@ -7351,6 +7352,36 @@ mod tests { assert!(!report.has_partial_enqueue()); } + #[test] + fn manual_transition_complete_preserves_worker_failure_summary() { + let options = ManualTransitionRunOptions::default(); + let mut record = ManualTransitionJobRecord::new(Uuid::new_v4(), "manual-worker-summary-bucket", &options, "owner-a"); + + record.record_worker_result(ManualTransitionWorkerResult::Completed, ManualTransitionQueueSnapshot::default()); + record.record_worker_result(ManualTransitionWorkerResult::TierFailure, ManualTransitionQueueSnapshot::default()); + record.complete( + ManualTransitionRunReport { + bucket: "manual-worker-summary-bucket".to_string(), + scanned: 3, + eligible: 2, + enqueued: 2, + tier_failure: 1, + ..Default::default() + }, + ManualTransitionQueueSnapshot::default(), + ); + + assert_eq!(record.state, ManualTransitionJobState::Partial); + assert!(record.scan_completed); + assert_eq!(record.report.scanned, 3); + assert_eq!(record.report.eligible, 2); + assert_eq!(record.report.enqueued, 2); + assert_eq!(record.report.transition_completed, 1); + assert_eq!(record.report.transition_failed, 1); + assert_eq!(record.report.tier_failure, 2); + assert!(record.completed_at_unix_nanos.is_some()); + } + #[tokio::test] async fn manual_transition_counts_already_transitioned_object() { let lc = latest_transition_lifecycle(); diff --git a/flake.lock b/flake.lock index c3a3d8ee1..577399e96 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1784364478, - "narHash": "sha256-CdItYNdYUlm7NxqMVyQKqT2IxTwvapiPuRLWOyHTrbY=", + "lastModified": 1784872115, + "narHash": "sha256-THPEF2po0fsoH8gNtp+Ae0XFDJH3N/ol7xO3v6VMTJU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "20535e48e12c86043b577b8518234ff5dbb26957", + "rev": "335f0738cb2fa9708f3f428e39d2eae975d1338d", "type": "github" }, "original": { @@ -29,11 +29,11 @@ ] }, "locked": { - "lastModified": 1784438913, - "narHash": "sha256-NYF7ZM5ip0u+w1pBFDpIGEbrbgN/wpnLFAmBkWkYMXw=", + "lastModified": 1785044261, + "narHash": "sha256-ehF/c4fLdgmNu7YXEClnmwhoBYddhYIVoSQpsZoorC4=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "afacd6819d3765a05814ee8e3de74c77d42ac799", + "rev": "fe2124391e739e7b3e8720cd8a73f06edd0aceba", "type": "github" }, "original": {