fix: tree snapshot encode decode err

This commit is contained in:
Zixuan Chen 2024-08-18 14:40:23 +08:00
parent 0c59bd2dcc
commit c97f1eec58
No known key found for this signature in database

View file

@ -743,13 +743,6 @@ impl TreeState {
fn bfs_all_nodes_for_fast_snapshot(&self) -> Vec<TreeNode> { fn bfs_all_nodes_for_fast_snapshot(&self) -> Vec<TreeNode> {
let mut ans = vec![]; let mut ans = vec![];
self._bfs_all_nodes(TreeParentId::Root, &mut ans); self._bfs_all_nodes(TreeParentId::Root, &mut ans);
// Add delete root here
ans.push(TreeNode {
id: TreeID::delete_root(),
parent: None,
position: FractionalIndex::default(),
index: 0,
});
self._bfs_all_nodes(TreeParentId::Deleted, &mut ans); self._bfs_all_nodes(TreeParentId::Deleted, &mut ans);
ans ans
} }
@ -1367,9 +1360,10 @@ mod snapshot {
#[columnar(vec, ser, de, iterable)] #[columnar(vec, ser, de, iterable)]
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct EncodedTreeNode { struct EncodedTreeNode {
/// If this field is 0, it means none /// If this field is 0, it means none, its parent is root
/// If this field is 1, its parent is the deleted root
#[columnar(strategy = "DeltaRle")] #[columnar(strategy = "DeltaRle")]
parent_idx_plus_one: usize, parent_idx_plus_two: usize,
#[columnar(strategy = "DeltaRle")] #[columnar(strategy = "DeltaRle")]
last_set_peer_idx: usize, last_set_peer_idx: usize,
#[columnar(strategy = "DeltaRle")] #[columnar(strategy = "DeltaRle")]
@ -1418,9 +1412,15 @@ mod snapshot {
let n = state.trees.get(&node.id).unwrap(); let n = state.trees.get(&node.id).unwrap();
let last_set_id = n.last_move_op; let last_set_id = n.last_move_op;
nodes.push(EncodedTreeNode { nodes.push(EncodedTreeNode {
parent_idx_plus_one: node parent_idx_plus_two: node
.parent .parent
.map(|p| id_to_idx.get(&p).unwrap() + 1) .map(|p| {
if p.is_deleted_root() {
1
} else {
id_to_idx.get(&p).unwrap() + 2
}
})
.unwrap_or(0), .unwrap_or(0),
last_set_peer_idx: peers.register(&last_set_id.peer), last_set_peer_idx: peers.register(&last_set_id.peer),
last_set_counter: last_set_id.counter, last_set_counter: last_set_id.counter,
@ -1490,11 +1490,13 @@ mod snapshot {
for (node_id, node) in node_ids.iter().zip(encoded.nodes.into_iter()) { for (node_id, node) in node_ids.iter().zip(encoded.nodes.into_iter()) {
tree.mov( tree.mov(
*node_id, *node_id,
if node.parent_idx_plus_one == 0 { match node.parent_idx_plus_two {
TreeParentId::Root 0 => TreeParentId::Root,
} else { 1 => TreeParentId::Deleted,
let id = node_ids[node.parent_idx_plus_one - 1]; n => {
let id = node_ids[n - 2];
TreeParentId::from(Some(id)) TreeParentId::from(Some(id))
}
}, },
IdFull::new( IdFull::new(
peers[node.last_set_peer_idx], peers[node.last_set_peer_idx],