Skip to content

Commit c480410

Browse files
committed
fix(snapshot): replay redo checkpoints in order
1 parent 7954d02 commit c480410

1 file changed

Lines changed: 53 additions & 1 deletion

File tree

src/cortex-snapshot/src/revert.rs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ impl RevertManager {
189189

190190
if let Some(ref p) = point {
191191
// Save everything after this point to redo stack
192-
for i in (pos + 1)..self.history.len() {
192+
for i in ((pos + 1)..self.history.len()).rev() {
193193
if let Some(rp) = self.history.get(i).cloned() {
194194
self.redo_stack.push(rp);
195195
}
@@ -322,4 +322,56 @@ mod tests {
322322
// Verify can undo
323323
assert!(revert_manager.can_undo());
324324
}
325+
326+
#[tokio::test]
327+
async fn test_redo_after_revert_to_replays_checkpoints_in_order() {
328+
let temp_dir = TempDir::new().unwrap();
329+
let data_dir = TempDir::new().unwrap();
330+
331+
let snapshot_manager = SnapshotManager::new(temp_dir.path(), data_dir.path());
332+
let mut revert_manager = RevertManager::new(snapshot_manager);
333+
let test_file = temp_dir.path().join("test.txt");
334+
335+
tokio::fs::write(&test_file, "Version 1").await.unwrap();
336+
let cp1 = revert_manager.checkpoint(Some("Version 1")).await.unwrap();
337+
338+
tokio::fs::write(&test_file, "Version 2").await.unwrap();
339+
let cp2 = revert_manager.checkpoint(Some("Version 2")).await.unwrap();
340+
341+
tokio::fs::write(&test_file, "Version 3").await.unwrap();
342+
let cp3 = revert_manager.checkpoint(Some("Version 3")).await.unwrap();
343+
344+
tokio::fs::write(&test_file, "Version 4").await.unwrap();
345+
let cp4 = revert_manager.checkpoint(Some("Version 4")).await.unwrap();
346+
347+
let reverted = revert_manager.revert_to(&cp1.snapshot.id).await.unwrap();
348+
assert_eq!(reverted.unwrap().snapshot.id, cp1.snapshot.id);
349+
assert_eq!(
350+
tokio::fs::read_to_string(&test_file).await.unwrap(),
351+
"Version 1"
352+
);
353+
354+
let redone = revert_manager.redo().await.unwrap();
355+
assert_eq!(redone.unwrap().snapshot.id, cp2.snapshot.id);
356+
assert_eq!(
357+
tokio::fs::read_to_string(&test_file).await.unwrap(),
358+
"Version 2"
359+
);
360+
361+
let redone = revert_manager.redo().await.unwrap();
362+
assert_eq!(redone.unwrap().snapshot.id, cp3.snapshot.id);
363+
assert_eq!(
364+
tokio::fs::read_to_string(&test_file).await.unwrap(),
365+
"Version 3"
366+
);
367+
368+
let redone = revert_manager.redo().await.unwrap();
369+
assert_eq!(redone.unwrap().snapshot.id, cp4.snapshot.id);
370+
assert_eq!(
371+
tokio::fs::read_to_string(&test_file).await.unwrap(),
372+
"Version 4"
373+
);
374+
375+
assert!(revert_manager.redo().await.unwrap().is_none());
376+
}
325377
}

0 commit comments

Comments
 (0)