Skip to main content

WalCheckpointPolicy

Enum WalCheckpointPolicy 

Source
#[non_exhaustive]
pub enum WalCheckpointPolicy { Default, Disabled, EveryPages(u32), }
Expand description

When SQLite should checkpoint the WAL on its own, for Tuning::wal_autocheckpoint (0.12.14, W5.3, D-157).

§Why this is not Option<u32>

The same reason CadencePolicy is not Option<SnapshotCadence>, and the plan for this wave specified Option<u32> here too. In a struct that derives Default, a field whose None means turn the mechanism off is a field that turns the mechanism off for everyone who did not mention it. Absence means “leave it alone” everywhere in Tuning, and disabling the automatic checkpointer — which is not safe without an explicit Database::checkpoint to replace it — has to be asked for by name.

The default does not change. 1,000 pages is SQLite’s default and stays SQLite’s default; F-30 is a control-loop perturbation, not a correctness bug, and changing a default is a behaviour change for every existing caller.

§What disabling it actually buys, measured (0.12.14, W5.3, D-157)

F-30 says the automatic checkpointer is an unbudgeted hold inside 0.12.0’s adaptive chunk controller: a checkpoint firing during a chunk transaction is charged to that chunk, and since D-146 made the measured hold the input to next_chunk_size, the controller shrinks in response to work the chunk did not do. Three rounds, 6,000 concepts of 1 KB each through write_concepts, release build:

longest chunk holdmeanchunksover budgetwall
autocheckpoint on (default)9.3–10.3 ms2.40–2.44 ms125–13024–28304–321 ms
autocheckpoint off4.50 ms2.08–2.20 ms142–15318–27298–339 ms

The tail is the finding, and it is real and reproducible. The longest hold roughly halves, and the >10 ms histogram bucket is populated only with the checkpointer on — that bucket is the checkpoint, landing inside somebody else’s transaction and being charged to it. Every round agrees.

What it does not buy is a calmer controller. over_budget overlaps between the arms, and total wall time is the same within noise. The controller works near the budget boundary either way, because D-090’s ~0.8 ms per-transaction floor and the convergence cost do not go anywhere. So the honest statement is that disabling autocheckpoint removes an outlier, not an oscillation.

And the cost is deferred, not removed. The explicit Database::checkpoint at the end of the same fixture moved 8,400–9,100 frames in 41–45 ms with the checkpointer off, against ~860 frames in 5.5–6.2 ms with it on. That is the whole trade in one line: the same work, moved out of the latency-bounded path and into one hold the caller chose the moment for. It is a good trade for a bulk importer and a bad one for an interactive process, which is why this is a knob and not a new default.

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.
§

Default

SQLite’s own default: checkpoint once the WAL passes 1,000 pages.

§

Disabled

No automatic checkpointing.

Only correct if you call Database::checkpoint yourself. Without one, the WAL grows for the life of the process and the database file is never brought up to date.

§

EveryPages(u32)

Checkpoint once the WAL passes this many pages.

0 is not special-cased to Self::Disabled even though SQLite treats it that way, because a caller who computed a threshold and got zero has a bug, and inheriting SQLite’s overload would turn it into a silently unbounded WAL.

Trait Implementations§

Source§

impl Clone for WalCheckpointPolicy

Source§

fn clone(&self) -> WalCheckpointPolicy

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for WalCheckpointPolicy

Source§

impl Debug for WalCheckpointPolicy

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for WalCheckpointPolicy

Source§

fn default() -> WalCheckpointPolicy

Returns the “default value” for a type. Read more
Source§

impl Eq for WalCheckpointPolicy

Source§

impl PartialEq for WalCheckpointPolicy

Source§

fn eq(&self, other: &WalCheckpointPolicy) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for WalCheckpointPolicy

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more