|
77 | 77 | } |
78 | 78 |
|
79 | 79 | /// Clears the map while reusing history record allocations. |
80 | | - pub fn reset_for_new_tx(&mut self) { |
| 80 | + pub fn clear(&mut self) { |
81 | 81 | for (_, element) in self.btree.iter_mut() { |
82 | 82 | self.records_memory_pool |
83 | 83 | .reuse_memory(element.head, element.initial); |
@@ -623,4 +623,74 @@ mod tests { |
623 | 623 | }) |
624 | 624 | .unwrap(); |
625 | 625 | } |
| 626 | + |
| 627 | + #[test] |
| 628 | + fn clear_removes_elements_and_pending_changes() { |
| 629 | + let mut map = HistoryMap::<usize, usize, Global>::new(Global); |
| 630 | + |
| 631 | + map.snapshot(); |
| 632 | + |
| 633 | + // Create one modified entry. |
| 634 | + let mut v = map.get_or_insert::<()>(&1, || Ok((1, ()))).unwrap(); |
| 635 | + v.update::<_, ()>(|x| { |
| 636 | + *x = 2; |
| 637 | + Ok(()) |
| 638 | + }) |
| 639 | + .unwrap(); |
| 640 | + |
| 641 | + assert_eq!(map.iter().len(), 1); |
| 642 | + assert_eq!(map.iter_altered_since_commit().count(), 1); |
| 643 | + |
| 644 | + // Drop all state. |
| 645 | + map.clear(); |
| 646 | + |
| 647 | + assert!(map.get(&1).is_none()); |
| 648 | + assert_eq!(map.iter().len(), 0); |
| 649 | + assert_eq!(map.iter_altered_since_commit().count(), 0); |
| 650 | + map.apply_to_all_updated_elements::<_, ()>(|_, _, _| { |
| 651 | + panic!("Map is expected to be empty after clear") |
| 652 | + }) |
| 653 | + .unwrap(); |
| 654 | + } |
| 655 | + |
| 656 | + #[test] |
| 657 | + fn clear_resets_snapshots() { |
| 658 | + let mut map = HistoryMap::<usize, usize, Global>::new(Global); |
| 659 | + |
| 660 | + // Keep a pre-clear snapshot handle. |
| 661 | + let pre_clear_snapshot = map.snapshot(); |
| 662 | + |
| 663 | + let mut v = map.get_or_insert::<()>(&1, || Ok((1, ()))).unwrap(); |
| 664 | + v.update::<_, ()>(|x| { |
| 665 | + *x = 2; |
| 666 | + Ok(()) |
| 667 | + }) |
| 668 | + .unwrap(); |
| 669 | + |
| 670 | + map.clear(); |
| 671 | + |
| 672 | + // Old snapshot ids are no longer valid. |
| 673 | + assert!(map.rollback(pre_clear_snapshot).is_err()); |
| 674 | + |
| 675 | + // Materialize key after clear with initial value. |
| 676 | + map.get_or_insert::<()>(&1, || Ok((3, ()))).unwrap(); |
| 677 | + |
| 678 | + // Take snapshot after clear. |
| 679 | + let post_clear_snapshot = map.snapshot(); |
| 680 | + assert_eq!(post_clear_snapshot, super::CacheSnapshotId(1)); |
| 681 | + |
| 682 | + let mut v = map.get_or_insert::<()>(&1, || Ok((5, ()))).unwrap(); |
| 683 | + v.update::<_, ()>(|x| { |
| 684 | + *x = 4; |
| 685 | + Ok(()) |
| 686 | + }) |
| 687 | + .unwrap(); |
| 688 | + |
| 689 | + // Rollback restores the post-clear initial value for this key. |
| 690 | + map.rollback(post_clear_snapshot).expect("Valid snapshot"); |
| 691 | + let restored = map.get(&1).expect("Element must remain after rollback"); |
| 692 | + |
| 693 | + assert_eq!(*restored.initial(), 3); |
| 694 | + assert_eq!(*restored.current(), 3); |
| 695 | + } |
626 | 696 | } |
0 commit comments