loro icon indicating copy to clipboard operation
loro copied to clipboard

Panic when importing concurrent versions after `fork()`

Open osmano807 opened this issue 4 months ago • 1 comments

Describe the bug When trying to import an LoroDoc into a forked doc, it panics with:

thread 'test_loro_raw_concurrent_import' panicked at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/oplog/change_store.rs:696:17:
assertion failed: vv.get(&change.id.peer).copied().unwrap_or(0) <= change.id.counter

Loro Dependencies Using Loro from git revision de93d34a9c07c5e67d20b9c5c72b4fa67b2ddb1f

loro = { git = "https://github.com/loro-dev/loro.git", branch = "dev" }

To Reproduce

 let fx_loro = loro::LoroDoc::new();
    fx_loro
        .get_map("paciente")
        .insert("nome", "DUMMY NAME V0")?;
    fx_loro.commit();

    let loro_c1 = fx_loro.fork();
    loro_c1
        .get_map("paciente")
        .insert("nome", "DUMMY NAME V1")?;
    loro_c1.commit();

    // If I use `fork()` it panics
    let final_loro = fx_loro.fork();

    // If I create a new loro doc and import the snapshot it works
    //let final_loro = loro::LoroDoc::new();
    //final_loro.import(&fx_loro.export(loro::ExportMode::snapshot())?)?;

    final_loro.import(&loro_c1.export(loro::ExportMode::snapshot())?)?;

Expected behavior The LoroDoc would sucessfully import all changes and merge them.

Additional context

Backtrace
thread 'test_loro_raw_concurrent_import' panicked at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/oplog/change_store.rs:696:17:
assertion failed: vv.get(&change.id.peer).copied().unwrap_or(0) <= change.id.counter
stack backtrace:
   0: rust_begin_unwind
             at /rustc/0d634185dfddefe09047881175f35c65d68dcff1/library/std/src/panicking.rs:662:5
   1: core::panicking::panic_fmt
             at /rustc/0d634185dfddefe09047881175f35c65d68dcff1/library/core/src/panicking.rs:74:14
   2: core::panicking::panic
             at /rustc/0d634185dfddefe09047881175f35c65d68dcff1/library/core/src/panicking.rs:148:5
   3: loro_internal::oplog::change_store::mut_inner_kv::<impl loro_internal::oplog::change_store::ChangeStore>::insert_change
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/oplog/change_store.rs:696:17
   4: loro_internal::oplog::OpLog::insert_new_change
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/oplog.rs:169:9
   5: loro_internal::encoding::outdated_encode_reordered::import_changes_to_oplog
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/encoding/outdated_encode_reordered.rs:276:9
   6: loro_internal::encoding::fast_snapshot::decode_oplog
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/encoding/fast_snapshot.rs:224:9
   7: loro_internal::encoding::decode_oplog
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/encoding.rs:252:37
   8: loro_internal::oplog::OpLog::decode
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/oplog.rs:399:9
   9: loro_internal::loro::<impl loro_internal::LoroDoc>::_import_with::{{closure}}
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/loro.rs:481:33
  10: loro_internal::loro::<impl loro_internal::LoroDoc>::update_oplog_and_apply_delta_to_state_if_needed
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/loro.rs:513:22
  11: loro_internal::loro::<impl loro_internal::LoroDoc>::_import_with
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/loro.rs:480:21
  12: loro_internal::loro::<impl loro_internal::LoroDoc>::import_with
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro-internal/src/loro.rs:436:19
  13: loro::LoroDoc::import
             at /home/opc/.cargo/git/checkouts/loro-efef1422f3eefd12/de93d34a9c07/crates/loro/src/lib.rs:391:9
  14: tests_paciente::test_loro_raw_concurrent_import
             at ./tests/tests_paciente.rs:250:5
  15: tests_paciente::test_loro_raw_concurrent_import::{{closure}}
             at ./tests/tests_paciente.rs:228:41
  16: core::ops::function::FnOnce::call_once
             at /rustc/0d634185dfddefe09047881175f35c65d68dcff1/library/core/src/ops/function.rs:250:5
  17: core::ops::function::FnOnce::call_once
             at /rustc/0d634185dfddefe09047881175f35c65d68dcff1/library/core/src/ops/function.rs:250:5

osmano807 avatar Oct 03 '24 03:10 osmano807