quill_sql/recovery/
redo.rs1use std::sync::Arc;
2
3use crate::buffer::BufferManager;
4use crate::error::QuillSQLResult;
5use crate::recovery::resource_manager::{
6 ensure_default_resource_managers_registered, get_resource_manager, RedoContext,
7};
8use crate::recovery::wal::codec::WalFrame;
9use crate::storage::disk_scheduler::DiskScheduler;
10
11pub struct RedoExecutor {
12 disk_scheduler: Arc<DiskScheduler>,
13 buffer_pool: Option<Arc<BufferManager>>,
14}
15
16impl RedoExecutor {
17 pub fn new(
18 disk_scheduler: Arc<DiskScheduler>,
19 buffer_pool: Option<Arc<BufferManager>>,
20 ) -> Self {
21 ensure_default_resource_managers_registered();
22 Self {
23 disk_scheduler,
24 buffer_pool,
25 }
26 }
27
28 pub fn apply(&self, frame: &WalFrame) -> QuillSQLResult<usize> {
29 if let Some(manager) = get_resource_manager(frame.rmid) {
30 let ctx = RedoContext {
31 disk_scheduler: self.disk_scheduler.clone(),
32 buffer_pool: self.buffer_pool.clone(),
33 };
34 manager.redo(frame, &ctx)
35 } else {
36 Ok(0)
37 }
38 }
39}