pub struct StoreOpenGuard { /* private fields */ }Expand description
The single-writer store lock: an exclusive advisory lock on
<store>/.coven-lock, held for the life of a full open handle (and its
running sync loop). A second full open of the same store is refused with
StoreOpenGuardError::AlreadyOpen while the lock is held — the invariant
that keeps two writers from racing the same db and blob store.
§Read-only opens take no lock
A read-only open deliberately does not touch this lock. The lock is
exclusive, so a shared lock on the same file would block against a writer
that already holds it (and vice versa) — a reader could never coexist with
the writer it exists to read alongside. But a read-only open needs no lock
at all: the lock guards against a second writer, and a read-only handle
holds a SQLITE_OPEN_READONLY connection that cannot write. So a read-only
open skips the guard entirely. Cross-process safety comes from WAL mode (a
reader sees committed rows while the writer commits more), not from this
lock; the blob cache a reader may populate is per-device scratch written
atomically (temp + rename), so a reader and the writer touching the same
cache file never tear it. This lets one writer and any number of read-only
readers coexist on one store.
Implementations§
Source§impl StoreOpenGuard
impl StoreOpenGuard
pub fn acquire(store_dir: &StoreDir) -> Result<Self, StoreOpenGuardError>
Sourcepub fn acquire_for_test(store_dir: &StoreDir) -> Arc<Self>
pub fn acquire_for_test(store_dir: &StoreDir) -> Arc<Self>
Acquire the guard for a test, panicking on refusal.