feat: add Storage trait and JSONL journal backend

Replace the internal Vec<CompletedTrial<V>> with a pluggable Storage<V>
trait. MemoryStorage is the default (no behavior change for existing
users). Behind the `journal` feature flag, JournalStorage persists
trials to a JSONL file with fs2 file locking for multi-process safety.

- Storage<V> trait with push(), trials_arc(), refresh() methods
- MemoryStorage<V> wraps Arc<RwLock<Vec<CompletedTrial<V>>>>
- JournalStorage<V> appends JSON lines with exclusive file locks
- Study::with_sampler_and_storage() general constructor
- Study::with_journal() convenience constructor (journal feature)
- Refresh from storage on create_trial() for multi-process discovery
- MSRV bumped to 1.89
This commit is contained in:
Manuel Raimann
2026-02-11 22:58:38 +01:00
parent 24a0bdd473
commit 0a6f2345a8
10 changed files with 657 additions and 66 deletions
+5
View File
@@ -93,6 +93,11 @@ pub enum Error {
#[cfg(feature = "async")]
#[error("async task error: {0}")]
TaskError(String),
/// Returned when a storage operation fails.
#[cfg(feature = "journal")]
#[error("storage error: {0}")]
Storage(String),
}
pub type Result<T> = core::result::Result<T, Error>;