You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(crdt): stop silent loss from pending and colliding CRDT writes
Loro can accept an import whose causal predecessors are missing and
buffer its operations as pending, leaving the applied state untouched
while reporting success; every apply path along the sync pipeline
(Raft-committed apply, peer validate-and-apply, snapshot restore,
rollback) now treats that as an explicit refusal instead of a no-op, so
callers never advance a high-water-mark past a write that was never
applied. The sync session and dispatch layers propagate this as a
retryable Gap/Accepted status so the client re-pushes rather than
losing the row.
Separately, every collection previously shared the tenant's raw peer
id, so Loro minted identical operation ids for unrelated writes in
different collections; merging two of a tenant's collections into one
document (as an embedded peer does) silently dropped one side of the
collision. Collection state now derives its Loro peer id from
`(base_peer_id, collection)`.
Also splits `tenant_state::core` into `apply`, `constraints`, `rows`,
and `snapshot_io` modules along these behavioural seams.
0 commit comments