mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-21 07:55:18 +01:00
remove page entries without frames in frame cache in WAL rollback method
This commit is contained in:
@@ -1308,28 +1308,21 @@ impl Wal for WalFile {
|
||||
|
||||
#[instrument(err, skip_all, level = Level::DEBUG)]
|
||||
fn rollback(&mut self) -> Result<()> {
|
||||
// TODO(pere): have to remove things from frame_cache because they are no longer valid.
|
||||
// TODO(pere): clear page cache in pager.
|
||||
{
|
||||
// TODO(pere): implement proper hashmap, this sucks :).
|
||||
let (max_frame, last_checksum) = {
|
||||
let shared = self.get_shared();
|
||||
let max_frame = shared.max_frame.load(Ordering::Acquire);
|
||||
tracing::debug!(to_max_frame = max_frame);
|
||||
{
|
||||
let mut frame_cache = shared.frame_cache.lock();
|
||||
for (_, frames) in frame_cache.iter_mut() {
|
||||
let mut last_valid_frame = frames.len();
|
||||
for frame in frames.iter().rev() {
|
||||
if *frame <= max_frame {
|
||||
break;
|
||||
}
|
||||
last_valid_frame -= 1;
|
||||
}
|
||||
frames.truncate(last_valid_frame);
|
||||
let mut frame_cache = shared.frame_cache.lock();
|
||||
frame_cache.retain(|_page_id, frames| {
|
||||
// keep frames <= max_frame
|
||||
while frames.last().is_some_and(|&f| f > max_frame) {
|
||||
frames.pop();
|
||||
}
|
||||
}
|
||||
self.last_checksum = shared.last_checksum;
|
||||
}
|
||||
!frames.is_empty()
|
||||
});
|
||||
(max_frame, shared.last_checksum)
|
||||
};
|
||||
self.last_checksum = last_checksum;
|
||||
self.max_frame = max_frame;
|
||||
self.reset_internal_states();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user