pub struct CoreWalSeam { /* private fields */ }Expand description
Real WAL seam backed by a live turso_core::Connection.
Implementations§
Source§impl CoreWalSeam
impl CoreWalSeam
Sourcepub fn open(path: &str) -> Result<Self>
pub fn open(path: &str) -> Result<Self>
Open a writable connection at path and disable auto-checkpoint /
auto-restart so the caller owns WAL maintenance. Requires turso_core
with features = ["conn_raw_api"] (set in this crate’s Cargo.toml).
This takes turso’s whole-file exclusive fcntl lock, so it is
mutually exclusive with any other process holding the database open —
including upstream C SQLite (measured: examples/foreign_checkpoint_probe.rs
probes D and G). That is correct for the restore/apply direction, which
owns the destination file outright, and wrong for reading a live source:
use Self::open_reader there.
Sourcepub fn open_reader(path: &str) -> Result<Self>
pub fn open_reader(path: &str) -> Result<Self>
R858-B18 — open a read-only connection at path, taking no
whole-file lock. This is the constructor the backup direction wants: a
backup is a reader, and it must not lock out the application whose
database it is reading.
OpenFlags::ReadOnly is what buys that, per handle and with no
process-wide effect. turso_core-0.7.2/io/unix.rs:67-72 takes the
exclusive lock only when
env::var(ENV_DISABLE_FILE_LOCK).is_err() && !flags.intersects(ReadOnly | NoLock);
io_uring.rs:463 and windows.rs:305 carry the identical condition, so
this is not a unix-only accident. The LIMBO_DISABLE_FILE_LOCK=1 escape
hatch reaches the same no-lock state but does it for every open in
the process, including the writable ones — never use it here.
§Two things this does NOT give you
- No shared locking protocol. Getting in without a lock is not
coordination: a foreign checkpoint can still land mid-read. That is
what
SourceFingerprintvalidation is for, and whyraw_consistent_copy_livepairs the two rather than shipping this flag alone — the flag alone converts “refuses to open” into “may return a torn image”, which is strictly worse. - No escape from turso’s process-global registry.
Database::open_file_with_flagsconsultsDATABASE_MANAGER, keyed by file id, before it looks at the flags (lib.rs:940), and hands back an already-openDatabasewith its own flags discarded. So in a process that already holds a writable handle on this exact file, this call returns that writable handle — same assnapshot.rs’supload_base_snapshotdoc records. Cross-process (the headscale case) is unaffected: the registry is per-process.
Sourcepub fn from_conn(conn: Arc<Connection>) -> Self
pub fn from_conn(conn: Arc<Connection>) -> Self
Wrap an already-open connection. The caller is responsible for having
called wal_auto_actions_disable() on it.
Trait Implementations§
Source§impl WalInsertSeam for CoreWalSeam
impl WalInsertSeam for CoreWalSeam
Source§fn wal_insert_begin(&self) -> Result<()>
fn wal_insert_begin(&self) -> Result<()>
Source§fn wal_insert_frame(&self, frame_no: u64, frame: &[u8]) -> Result<()>
fn wal_insert_frame(&self, frame_no: u64, frame: &[u8]) -> Result<()>
frame (a 24-byte header + page_size bytes of page data) at
position frame_no (1-based, must be exactly prev + 1 — gaps error).
Identical content at an already-written position is a no-op (the engine
compares and returns OK).Source§fn wal_insert_end(&self, force_commit: bool) -> Result<()>
fn wal_insert_end(&self, force_commit: bool) -> Result<()>
force_commit = false (the restore default) the
engine drops any frames after the last commit frame — automatic
crash-consistency for a tail captured mid-transaction. force_commit = true
commits even an uncommitted suffix; not used by restore.Source§impl WalSeam for CoreWalSeam
impl WalSeam for CoreWalSeam
Source§fn wal_state(&self) -> Result<Watermark>
fn wal_state(&self) -> Result<Watermark>
Source§fn wal_get_frame(&self, frame_no: u64, buf: &mut [u8]) -> Result<FrameInfo>
fn wal_get_frame(&self, frame_no: u64, buf: &mut [u8]) -> Result<FrameInfo>
frame_no (1-based) into buf (must be
WAL_FRAME_HEADER_SIZE + page_size bytes). Returns the page number
the frame applies to and the post-frame DB size (in pages) — non-zero
db_size marks a commit frame.Source§fn wal_auto_actions_disable(&self)
fn wal_auto_actions_disable(&self)
cli/sync_server.rs) makes the same move at startup.Source§impl WarmApplier for CoreWalSeam
impl WarmApplier for CoreWalSeam
Source§fn trim_page_cache(&self, target_kb: i64) -> Result<()>
fn trim_page_cache(&self, target_kb: i64) -> Result<()>
target_kb kilobytes.
Best-effort in the sense that turso_core’s page cache only evicts
pages that aren’t pinned/dirty — harmless here, since an applier
only ever holds pages it just wrote and is about to hand off to the
engine, not mid-query state.Auto Trait Implementations§
impl !RefUnwindSafe for CoreWalSeam
impl !UnwindSafe for CoreWalSeam
impl Freeze for CoreWalSeam
impl Send for CoreWalSeam
impl Sync for CoreWalSeam
impl Unpin for CoreWalSeam
impl UnsafeUnpin for CoreWalSeam
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
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> ErasedDestructor for Twhere
T: 'static,
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