diff --git a/src/db/memory.rs b/src/db/memory.rs index 6050fbc1b49a..5419d06f2ff7 100644 --- a/src/db/memory.rs +++ b/src/db/memory.rs @@ -38,6 +38,8 @@ impl MemoryDB { blockchain_db .iter() .chain(blockchain_persistent_db.iter()) + // Sort to make the result CAR deterministic + .sorted_by_key(|&(&cid, _)| cid) .map(|(&cid, data)| { anyhow::Ok(CarBlock { cid, diff --git a/src/state_manager/utils.rs b/src/state_manager/utils.rs index 1d6ca35f1a28..432ae6a09679 100644 --- a/src/state_manager/utils.rs +++ b/src/state_manager/utils.rs @@ -241,7 +241,7 @@ pub mod state_compute { }); let url = Url::parse(&format!("{DO_SPACE_ROOT}{file}"))?; - Ok(crate::utils::retry( + let path = crate::utils::retry( crate::utils::RetryArgs { timeout: Some(Duration::from_secs(30)), max_retries: Some(5), @@ -256,7 +256,17 @@ pub mod state_compute { }, ) .await? - .path) + .path; + #[cfg(test)] + { + // To determine whether a test failure is caused by data corruption + use digest::Digest as _; + println!( + "snapshot: {file}, sha256sum: {}", + hex::encode(sha2::Sha256::digest(std::fs::read(&path)?)) + ); + } + Ok(path) } pub async fn prepare_state_compute(