From 3bb2d3490ddb86faa638f6b96e8ebb32fd758d16 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Thu, 24 Nov 2022 22:02:10 +0800 Subject: [PATCH] fix: encoding merge err --- crates/loro-core/src/log_store/encoding.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/loro-core/src/log_store/encoding.rs b/crates/loro-core/src/log_store/encoding.rs index 8919eea0..e7a06683 100644 --- a/crates/loro-core/src/log_store/encoding.rs +++ b/crates/loro-core/src/log_store/encoding.rs @@ -4,6 +4,7 @@ use fxhash::FxHashMap; use rle::{HasLength, RleVec, RleVecWithIndex}; use serde::{Deserialize, Serialize}; use serde_columnar::{columnar, compress, decompress, from_bytes, to_vec, CompressConfig}; +use smallvec::smallvec; use crate::{ change::{Change, ChangeMergeCfg, Lamport, Timestamp}, @@ -11,6 +12,7 @@ use crate::{ container::{ list::list_op::{DeleteSpan, ListOp}, map::MapSet, + registry::ContainerIdx, text::text_content::ListSlice, Container, ContainerID, }, @@ -22,6 +24,8 @@ use crate::{ ContainerType, InternalString, LogStore, LoroValue, VersionVector, }; +use super::ImportContext; + type ClientIdx = u32; type Clients = Vec; type Containers = Vec; @@ -337,9 +341,17 @@ fn decode_changes( // SAFETY: ignore lifetime issues here, because it's safe for us to store the mutex guard here .map(|(k, v)| (k, unsafe { std::mem::transmute(v.lock().unwrap()) })) .collect(); - store.apply(&frontiers, &vv, container_map); + let mut context = ImportContext { + old_frontiers: smallvec![], + new_frontiers: frontiers.get_frontiers(), + old_vv: Default::default(), + spans: vv.diff(&Default::default()).left, + new_vv: vv, + diff: Default::default(), + }; + store.apply(container_map, &mut context); - store.vv = vv; + store.vv = context.new_vv; store.frontiers = frontiers.get_frontiers(); drop(store); // FIXME: set all