#[non_exhaustive]pub enum ReplayMode {
Strict,
Resync,
}Expand description
What a replay (and the open that follows it) does at a corrupt record in the middle of a log.
use kevy_persist::ReplayMode;
assert_eq!(ReplayMode::default(), ReplayMode::Strict);Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
Strict
Stop at the first corrupt record; the open quarantines and truncates everything from there.
use kevy_persist::{Aof, Argv, Fsync, ReplayMode, ReplaySummary, replay_aof_in_place};
let path = std::env::temp_dir().join(format!("mode-strict-doc-{}.aof", std::process::id()));
let mut aof = Aof::open(&path, Fsync::Always)?;
aof.append(&Argv::from(vec![b"SET".to_vec(), b"k".to_vec(), b"v".to_vec()]))?;
drop(aof);
let mut bytes = std::fs::read(&path)?;
*bytes.last_mut().unwrap() ^= 1; // flip a payload bit
std::fs::write(&path, &bytes)?;
let report = replay_aof_in_place(&path, ReplayMode::Strict, ReplaySummary::Quiet, |_| {})?;
assert!(report.corrupt);
assert_eq!(report.commands, 0);Resync
Hop over a corrupt region to the next record whose checksum holds and keep replaying; the open leaves interior corrupt regions in place and quarantines only the bytes after the last recoverable record. v1 logs have no checksums to anchor on and replay strictly.
use kevy_persist::{Aof, Argv, Fsync, ReplayMode, ReplaySummary, replay_aof_in_place};
let path = std::env::temp_dir().join(format!("mode-resync-doc-{}.aof", std::process::id()));
let mut aof = Aof::open(&path, Fsync::Always)?;
for key in [b"a", b"b"] {
aof.append(&Argv::from(vec![b"SET".to_vec(), key.to_vec(), b"v".to_vec()]))?;
}
drop(aof);
let mut bytes = std::fs::read(&path)?;
bytes[kevy_persist::AOF2_MAGIC.len() + 12] ^= 1; // damage the first record only
std::fs::write(&path, &bytes)?;
let report = replay_aof_in_place(&path, ReplayMode::Resync, ReplaySummary::Quiet, |_| {})?;
assert!(report.corrupt);
assert_eq!(report.commands, 1, "the record behind the damage still replays");Trait Implementations§
Source§impl Clone for ReplayMode
impl Clone for ReplayMode
Source§fn clone(&self) -> ReplayMode
fn clone(&self) -> ReplayMode
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreimpl Copy for ReplayMode
Source§impl Debug for ReplayMode
impl Debug for ReplayMode
Source§impl Default for ReplayMode
impl Default for ReplayMode
Source§fn default() -> ReplayMode
fn default() -> ReplayMode
Returns the “default value” for a type. Read more
impl Eq for ReplayMode
Source§impl Hash for ReplayMode
impl Hash for ReplayMode
Source§impl PartialEq for ReplayMode
impl PartialEq for ReplayMode
impl StructuralPartialEq for ReplayMode
Auto Trait Implementations§
impl Freeze for ReplayMode
impl RefUnwindSafe for ReplayMode
impl Send for ReplayMode
impl Sync for ReplayMode
impl Unpin for ReplayMode
impl UnsafeUnpin for ReplayMode
impl UnwindSafe for ReplayMode
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more