use noxu_util::Lsn;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Provisional {
No,
Yes,
BeforeCkptEnd,
}
impl Provisional {
pub fn is_provisional(self, log_entry_lsn: Lsn, ckpt_end_lsn: Lsn) -> bool {
debug_assert!(
!log_entry_lsn.is_null(),
"log_entry_lsn must not be NULL"
);
match self {
Provisional::No => false,
Provisional::Yes => true,
Provisional::BeforeCkptEnd => {
!ckpt_end_lsn.is_null() && log_entry_lsn < ckpt_end_lsn
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_no_never_provisional() {
let entry_lsn = Lsn::new(1, 100);
let ckpt_lsn = Lsn::new(1, 200);
assert!(!Provisional::No.is_provisional(entry_lsn, ckpt_lsn));
assert!(
!Provisional::No.is_provisional(entry_lsn, noxu_util::NULL_LSN)
);
}
#[test]
fn test_yes_always_provisional() {
let entry_lsn = Lsn::new(1, 100);
let ckpt_lsn = Lsn::new(1, 200);
assert!(Provisional::Yes.is_provisional(entry_lsn, ckpt_lsn));
assert!(
Provisional::Yes.is_provisional(entry_lsn, noxu_util::NULL_LSN)
);
}
#[test]
fn test_before_ckpt_end() {
let before_lsn = Lsn::new(1, 100);
let ckpt_lsn = Lsn::new(1, 200);
let after_lsn = Lsn::new(1, 300);
assert!(
Provisional::BeforeCkptEnd.is_provisional(before_lsn, ckpt_lsn)
);
assert!(
!Provisional::BeforeCkptEnd.is_provisional(after_lsn, ckpt_lsn)
);
assert!(
!Provisional::BeforeCkptEnd
.is_provisional(before_lsn, noxu_util::NULL_LSN)
);
}
}