#[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 hold | mean | chunks | over budget | wall | |
|---|---|---|---|---|---|
| autocheckpoint on (default) | 9.3–10.3 ms | 2.40–2.44 ms | 125–130 | 24–28 | 304–321 ms |
| autocheckpoint off | 4.50 ms | 2.08–2.20 ms | 142–153 | 18–27 | 298–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
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
impl Clone for WalCheckpointPolicy
Source§fn clone(&self) -> WalCheckpointPolicy
fn clone(&self) -> WalCheckpointPolicy
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for WalCheckpointPolicy
Source§impl Debug for WalCheckpointPolicy
impl Debug for WalCheckpointPolicy
Source§impl Default for WalCheckpointPolicy
impl Default for WalCheckpointPolicy
Source§fn default() -> WalCheckpointPolicy
fn default() -> WalCheckpointPolicy
impl Eq for WalCheckpointPolicy
Source§impl PartialEq for WalCheckpointPolicy
impl PartialEq for WalCheckpointPolicy
impl StructuralPartialEq for WalCheckpointPolicy
Auto Trait Implementations§
impl Freeze for WalCheckpointPolicy
impl RefUnwindSafe for WalCheckpointPolicy
impl Send for WalCheckpointPolicy
impl Sync for WalCheckpointPolicy
impl Unpin for WalCheckpointPolicy
impl UnsafeUnpin for WalCheckpointPolicy
impl UnwindSafe for WalCheckpointPolicy
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request