pub struct FileCheckpointStore { /* private fields */ }Expand description
Durable checkpoint store that persists one checkpoint per JSON file.
Checkpoints are written atomically, so a failed save never leaves a partial
or zero-length live file behind. Checkpoint IDs are validated before file
access and therefore must not contain path separators, .., :, or ASCII
control characters.
Retention is unbounded by default. Use
with_max_checkpoints to prune older
checkpoints after each save.
All filesystem work runs on Tokio’s blocking pool via
tokio::task::spawn_blocking, so the returned futures never stall an
async worker thread and must be polled inside a Tokio runtime.
Implementations§
Source§impl FileCheckpointStore
impl FileCheckpointStore
Sourcepub const DEFAULT_MAX_CHECKPOINTS: usize = 20
pub const DEFAULT_MAX_CHECKPOINTS: usize = 20
Recommended bound for callers that want capped checkpoint retention.
New stores are unbounded by default for backwards compatibility with the public checkpoint policy contract.
Sourcepub fn new(checkpoints_dir: PathBuf) -> Result<Self>
pub fn new(checkpoints_dir: PathBuf) -> Result<Self>
Create a new store rooted at the given directory.
Creates the directory (and parents) if it does not already exist.
The store keeps every checkpoint by default; see
Self::with_max_checkpoints to opt into bounded retention.
Sourcepub fn default_dir() -> Option<PathBuf>
pub fn default_dir() -> Option<PathBuf>
Default checkpoints directory: <config_dir>/swink-agent/checkpoints.
Sourcepub fn with_max_checkpoints(self, n: usize) -> Self
pub fn with_max_checkpoints(self, n: usize) -> Self
Keep at most n checkpoints, pruning the oldest (by created_at)
after each save.
The checkpoint just saved counts toward the limit, so n should be at
least 1. Self::DEFAULT_MAX_CHECKPOINTS is a reasonable preset for
callers that do not need every historical checkpoint.
Pruning only considers files in the store directory that parse as checkpoints; foreign or malformed files are never deleted. Pruning is best-effort: failures are logged at warn level and never fail the save that triggered them.
Sourcepub fn unbounded(self) -> Self
pub fn unbounded(self) -> Self
Disable retention pruning and keep every checkpoint.
This is the default for new stores. It is also useful after a builder chain has temporarily selected a bound. Disk usage then grows without bound: a per-turn checkpoint policy leaves one growing file per turn, so an N-turn session stores O(N²) bytes. Prefer a bound unless every historical checkpoint is needed.
Trait Implementations§
Source§impl CheckpointStore for FileCheckpointStore
impl CheckpointStore for FileCheckpointStore
Source§fn save_checkpoint(&self, checkpoint: Checkpoint) -> CheckpointFuture<'_, ()>
fn save_checkpoint(&self, checkpoint: Checkpoint) -> CheckpointFuture<'_, ()>
Source§fn load_checkpoint(&self, id: &str) -> CheckpointFuture<'_, Option<Checkpoint>>
fn load_checkpoint(&self, id: &str) -> CheckpointFuture<'_, Option<Checkpoint>>
Source§fn list_checkpoints(&self) -> CheckpointFuture<'_, Vec<String>>
fn list_checkpoints(&self) -> CheckpointFuture<'_, Vec<String>>
Source§fn delete_checkpoint(&self, id: &str) -> CheckpointFuture<'_, ()>
fn delete_checkpoint(&self, id: &str) -> CheckpointFuture<'_, ()>
Auto Trait Implementations§
impl Freeze for FileCheckpointStore
impl RefUnwindSafe for FileCheckpointStore
impl Send for FileCheckpointStore
impl Sync for FileCheckpointStore
impl Unpin for FileCheckpointStore
impl UnsafeUnpin for FileCheckpointStore
impl UnwindSafe for FileCheckpointStore
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> Fruit for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more