diff --git a/core/storage/wal.rs b/core/storage/wal.rs index e8b87a49d..f434e651e 100644 --- a/core/storage/wal.rs +++ b/core/storage/wal.rs @@ -808,17 +808,24 @@ impl Wal for WalFile { fn find_frame(&self, page_id: u64) -> Result> { let shared = self.get_shared(); let frames = shared.frame_cache.lock(); + // if we have read_lock 0, we are reading straight from the db file + if self.max_frame_read_lock_index.get() == 0 { + return Ok(None); + } let frames = frames.get(&page_id); if frames.is_none() { return Ok(None); } let frames = frames.unwrap(); - for frame in frames.iter().rev() { - if *frame <= self.max_frame { - return Ok(Some(*frame)); - } + if let Some(&f) = frames + .iter() + .rev() + .find(|&&f| f <= self.max_frame && f >= self.min_frame) + { + Ok(Some(f)) + } else { + Ok(None) } - Ok(None) } /// Read a frame from the WAL. @@ -1917,17 +1924,9 @@ pub mod test { let readmark = { let pager = conn2.pager.borrow_mut(); let mut wal2 = pager.wal.borrow_mut(); -<<<<<<< HEAD assert!(matches!(wal2.begin_read_tx().unwrap().0, LimboResult::Ok)); - } -||||||| parent of 27000501 (Apply suggestions/fixes and add extensive comments to wal chkpt) - assert!(matches!(wal2.begin_read_tx().unwrap(), LimboResult::Ok)); - } -======= - assert!(matches!(wal2.begin_read_tx().unwrap(), LimboResult::Ok)); wal2.get_max_frame() }; ->>>>>>> 27000501 (Apply suggestions/fixes and add extensive comments to wal chkpt) // generate more frames that the reader will not see. bulk_inserts(&conn1.clone(), 15, 2); @@ -2096,7 +2095,7 @@ pub mod test { let r1_max_frame = { let pager = conn_r1.pager.borrow_mut(); let mut wal = pager.wal.borrow_mut(); - assert!(matches!(wal.begin_read_tx().unwrap(), LimboResult::Ok)); + assert!(matches!(wal.begin_read_tx().unwrap().0, LimboResult::Ok)); wal.get_max_frame() }; bulk_inserts(&conn_writer, 5, 10); @@ -2105,7 +2104,7 @@ pub mod test { let r2_max_frame = { let pager = conn_r2.pager.borrow_mut(); let mut wal = pager.wal.borrow_mut(); - assert!(matches!(wal.begin_read_tx().unwrap(), LimboResult::Ok)); + assert!(matches!(wal.begin_read_tx().unwrap().0, LimboResult::Ok)); wal.get_max_frame() }; @@ -2197,7 +2196,7 @@ pub mod test { ); // release write lock - conn2.pager.borrow().wal.borrow().end_write_tx().unwrap(); + conn2.pager.borrow().wal.borrow().end_write_tx(); // now restart should succeed let result = {