diff --git a/crates/index-scheduler/src/scheduler/process_upgrade/mod.rs b/crates/index-scheduler/src/scheduler/process_upgrade/mod.rs index e270ad2a8..a44d9f277 100644 --- a/crates/index-scheduler/src/scheduler/process_upgrade/mod.rs +++ b/crates/index-scheduler/src/scheduler/process_upgrade/mod.rs @@ -12,7 +12,6 @@ impl IndexScheduler { #[cfg(test)] self.maybe_fail(crate::test_utils::FailureLocation::ProcessUpgrade)?; - enum UpgradeIndex {} let indexes = self.index_names()?; for (i, uid) in indexes.iter().enumerate() { @@ -52,4 +51,41 @@ impl IndexScheduler { Ok(()) } + + pub fn process_rollback(&self, db_version: (u32, u32, u32), progress: &Progress) -> Result<()> { + let indexes = self.index_names()?; + + tracing::info!("roll backing all indexes"); + for (i, uid) in indexes.iter().enumerate() { + progress.update_progress(VariableNameStep::::new( + format!("Rollbacking index `{uid}`"), + i as u32, + indexes.len() as u32, + )); + let index_schd_rtxn = self.env.read_txn()?; + + let rollback_outcome = + self.index_mapper.rollback_index(&index_schd_rtxn, uid, db_version)?; + if !rollback_outcome.succeeded() { + return Err(crate::Error::RollbackFailed { index: uid.clone(), rollback_outcome }); + } + } + + let mut wtxn = self.env.write_txn()?; + tracing::info!(?db_version, "roll back index scheduler version"); + self.version.set_version(&mut wtxn, db_version)?; + let db_path = self.scheduler.version_file_path.parent().unwrap(); + wtxn.commit()?; + tracing::info!(?db_path, ?db_version, "roll back version file"); + meilisearch_types::versioning::create_version_file( + db_path, + db_version.0, + db_version.1, + db_version.2, + )?; + + Ok(()) + } } + +enum UpgradeIndex {}