Skip to content

Fix March 2026 production panic regressions#943

Open
zxch3n wants to merge 7 commits intoloro-dev:mainfrom
zxch3n:codex/march-2026-panic-hardening
Open

Fix March 2026 production panic regressions#943
zxch3n wants to merge 7 commits intoloro-dev:mainfrom
zxch3n:codex/march-2026-panic-hardening

Conversation

@zxch3n
Copy link
Copy Markdown
Member

@zxch3n zxch3n commented Apr 2, 2026

Summary

  • fix stale DAG causal iteration after lazy node splits so export/import no longer drop same-peer ranges
  • fix richtext IdToCursor fragment-tail updates and zero-width update handling
  • add a list import_batch() regression that exercises the same split-tracking path seen in production
  • recover document-owned locks after poisoning instead of cascading PoisonError panics
  • add unpoisoned lock helpers across core internals so ordinary Mutex users follow the same recovery rule

Verification

  • cargo test -p loro-internal stale_iterator_state_repairs_missing_same_peer_continuation -- --nocapture
  • cargo test -p loro-internal larger_node_only_advances_consumed_slice -- --nocapture
  • cargo test -p loro-internal repeated_tail_splits_keep_id_to_cursor_consistent -- --nocapture
  • cargo test -p loro-internal zero_width_small_update_keeps_insert_set_non_empty -- --nocapture
  • cargo test -p loro-internal large_update_can_replace_the_tail_range -- --nocapture
  • cargo test -p loro-internal list_import_batch_stays_consistent_after_repeated_tail_splits -- --nocapture
  • cargo test -p loro-internal poison -- --nocapture
  • cargo check -p loro-internal

Notes

  • the active ImVersionVector export panic still was not reproducible in this checkout; no speculative fix was included for that path
  • the FFI-side unpoison work lives in /Users/zxch3n/Code/loro-ffi on branch codex/unpoison-locks and is not part of this PR

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a28c207df2

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

impl LoroDoc {
pub(crate) fn set_config(&self, config: &Configure) {
self.config_text_style(config.text_style_config.read().unwrap().clone());
self.config_text_style(config.text_style_config.read_unpoisoned().clone());
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use sync lock types before calling unpoison helpers

read_unpoisoned() here is being called on std::sync::RwLock, but RwLockExt is implemented only for crate::sync::RwLock in sync.rs (same pattern for MutexExt). That works in non-loom builds only because crate::sync aliases std there; under cfg(loom) the alias switches to loom::sync, so this method no longer exists on std::sync::RwLock and the loom configuration fails to compile. The same regression pattern appears in other files that still import std locks directly (e.g. awareness.rs, pre_commit.rs), so these lock fields/imports should be switched to crate::sync::{Mutex,RwLock} (or the trait impls broadened) before using the helper methods.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant