From 277ebba847912e113657bcef4ed53e4e4e708161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 6 Oct 2026 10:46:04 +0500 Subject: [PATCH] Restore the original realm before disposable SQUID recovery --- .../examples/coordinated_squid_e2e.rs | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/crates/coa-core/examples/coordinated_squid_e2e.rs b/crates/coa-core/examples/coordinated_squid_e2e.rs index 04e90f8..814a752 100644 --- a/crates/coa-core/examples/coordinated_squid_e2e.rs +++ b/crates/coa-core/examples/coordinated_squid_e2e.rs @@ -37,20 +37,33 @@ fn exercise(root: &Path) -> Result<()> { Ok(()) })); assert!(driver::run(root, driver::Verb::StopAll)?.ok); - for component in point.components.iter().filter(|component| component.name != "configs") { - backup::restore_database(root, &meta, &point.id, &component.name)?; - } - backup::restore_configs(root, &meta, &point.id)?; - assert!(driver::run(root, driver::Verb::StopAll)?.ok); + restore(root, &meta, &point)?; result.map_err(|_| coa_core::Error::Invalid("SQUID acceptance failed; disposable databases and configurations restored".into()))? } +fn restore(root: &Path, meta: &Path, point: &backup::RecoveryPoint) -> Result<()> { + assert!(backup::verify(meta, &point.id)?.ok); + assert!(driver::run(root, driver::Verb::StopAll)?.ok); + coa_core::realms::select(root, point.realm)?; + for component in point.components.iter().filter(|component| component.name != "configs") { + backup::restore_database(root, meta, &point.id, &component.name)?; + } + backup::restore_configs(root, meta, &point.id)?; + assert!(driver::run(root, driver::Verb::StopAll)?.ok); + println!("PASS: disposable SQUID acceptance databases and original realm configurations restored"); + Ok(()) +} + fn main() -> Result<()> { let root = PathBuf::from(std::env::args().nth(1).unwrap()); assert!(root.file_name().unwrap().to_string_lossy().starts_with("coa-schema-fixture-chaos-064-transition-")); assert_eq!(std::fs::read(root.join(".transition-fixture"))?, b"disposable published-064 transition fixture"); assert!(!root.join("Data").symlink_metadata()?.file_type().is_symlink()); assert!(driver::run(&root, driver::Verb::StopAll)?.ok); + if let Some(id) = std::env::args().nth(2) { + let meta = coa_core::registry::metadata_dir_for(&root)?; + return restore(&root, &meta, &backup::get(&meta, &id)?); + } let result = exercise(&root); assert!(driver::run(&root, driver::Verb::StopAll)?.ok); result