From e84f96051680bde1c33f3045fa26e0c097a6174f Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Wed, 1 Oct 2025 15:46:53 +0200 Subject: [PATCH 1/3] core/wal: check index header on begin_write_tx --- core/storage/wal.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/storage/wal.rs b/core/storage/wal.rs index 899da558a..c8f7fcf00 100644 --- a/core/storage/wal.rs +++ b/core/storage/wal.rs @@ -983,12 +983,17 @@ impl Wal for WalFile { if !shared.write_lock.write() { return Err(LimboError::Busy); } - let (shared_max, nbackfills, last_checksum) = ( - shared.max_frame.load(Ordering::Acquire), - shared.nbackfills.load(Ordering::Acquire), - shared.last_checksum, - ); - if self.max_frame.load(Ordering::Acquire) == shared_max { + let (shared_max, nbackfills, last_checksum, checkpoint_seq) = { + let mx = shared.max_frame.load(Ordering::Acquire); + let nb = shared.nbackfills.load(Ordering::Acquire); + let ck = shared.last_checksum; + let checkpoint_seq = shared.wal_header.lock().checkpoint_seq; + (mx, nb, ck, checkpoint_seq) + }; + let db_changed = shared_max != self.max_frame.load(Ordering::Acquire) + || last_checksum != self.last_checksum + || checkpoint_seq != self.checkpoint_seq.load(Ordering::Acquire); + if !db_changed { // Snapshot still valid; adopt counters drop(shared); self.last_checksum = last_checksum; From fe29fcbb09ef8bc20743f54cb9afd8637555e3fe Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Wed, 1 Oct 2025 16:17:40 +0200 Subject: [PATCH 2/3] core/wal: update checkpoint_seq and last_checkpoint on begin_read_tx --- core/storage/wal.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/storage/wal.rs b/core/storage/wal.rs index c8f7fcf00..6b42603c8 100644 --- a/core/storage/wal.rs +++ b/core/storage/wal.rs @@ -849,6 +849,7 @@ impl Wal for WalFile { .store(lock_0_idx, Ordering::Release); self.min_frame.store(nbackfills + 1, Ordering::Release); self.last_checksum = last_checksum; + self.checkpoint_seq.store(checkpoint_seq, Ordering::Release); return Ok(db_changed); } @@ -942,6 +943,8 @@ impl Wal for WalFile { self.max_frame.store(best_mark as u64, Ordering::Release); self.max_frame_read_lock_index .store(best_idx as usize, Ordering::Release); + self.last_checksum = last_checksum; + self.checkpoint_seq.store(checkpoint_seq, Ordering::Release); tracing::debug!( "begin_read_tx(min={}, max={}, slot={}, max_frame_in_wal={})", self.min_frame.load(Ordering::Acquire), @@ -990,6 +993,9 @@ impl Wal for WalFile { let checkpoint_seq = shared.wal_header.lock().checkpoint_seq; (mx, nb, ck, checkpoint_seq) }; + // dbg!(shared_max != self.max_frame.load(Ordering::Acquire)); + // dbg!(last_checksum != self.last_checksum); + // dbg!(checkpoint_seq != self.checkpoint_seq.load(Ordering::Acquire)); let db_changed = shared_max != self.max_frame.load(Ordering::Acquire) || last_checksum != self.last_checksum || checkpoint_seq != self.checkpoint_seq.load(Ordering::Acquire); From b5a969933c76c90e27ab487ff48503619d62196b Mon Sep 17 00:00:00 2001 From: Pere Diaz Bou Date: Fri, 3 Oct 2025 12:17:35 +0200 Subject: [PATCH 3/3] core/wal: remove dbg! --- core/storage/wal.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/storage/wal.rs b/core/storage/wal.rs index 6b42603c8..bbba04f92 100644 --- a/core/storage/wal.rs +++ b/core/storage/wal.rs @@ -993,9 +993,6 @@ impl Wal for WalFile { let checkpoint_seq = shared.wal_header.lock().checkpoint_seq; (mx, nb, ck, checkpoint_seq) }; - // dbg!(shared_max != self.max_frame.load(Ordering::Acquire)); - // dbg!(last_checksum != self.last_checksum); - // dbg!(checkpoint_seq != self.checkpoint_seq.load(Ordering::Acquire)); let db_changed = shared_max != self.max_frame.load(Ordering::Acquire) || last_checksum != self.last_checksum || checkpoint_seq != self.checkpoint_seq.load(Ordering::Acquire);