Skip to main content

SnapshotId

Struct SnapshotId 

Source
pub struct SnapshotId(pub u64);
Expand description

Snapshot identifier - points to committed transaction state

Only data committed at or before this snapshot_id is visible. If a value cannot be tied to a committed snapshot_id → it does not exist.

§Invariant

snapshot_id.0 MUST correspond to a committed transaction. Uncommitted transactions do not create valid snapshots.

§Representation

Internally, SnapshotId wraps a TransactionId (u64). This is valid because:

  • TransactionId is allocated at begin_transaction()
  • SnapshotId is created at commit_transaction()
  • The 1:1 mapping ensures snapshot_id uniquely identifies committed state

Tuple Fields§

§0: u64

Implementations§

Source§

impl SnapshotId

Source

pub fn current() -> Self

The “current” snapshot - sees only committed data

This returns the most recent committed transaction ID. All reads using this snapshot are guaranteed to see only data that has been durably committed.

§Implementation Note
  • For native-v2 backend: Returns the maximum committed LSN from the WAL manager
  • For SQLite backend: Returns 0 to indicate “all committed data”
§Example
let snapshot = SnapshotId::current();
// snapshot now points to the most recent committed transaction
Source

pub fn from_tx(tx_id: u64) -> Self

Create from explicit transaction ID

§Arguments
  • tx_id - A committed transaction ID
§Important

The caller MUST ensure that tx_id corresponds to a committed transaction. Using an uncommitted transaction ID violates snapshot isolation guarantees.

§Example
// After commit returns SnapshotId
let snapshot = coordinator.commit_transaction(tx_id)?;
// Later, reuse same snapshot for repeatable reads
let node = backend.get_node(snapshot, node_id)?;
Source

pub fn from_lsn(lsn: u64) -> Self

Create snapshot from explicit LSN (Log Sequence Number)

§Arguments
  • lsn - A commit LSN representing a committed transaction
§Important

The caller MUST ensure that lsn corresponds to a committed transaction. Using an uncommitted LSN violates snapshot isolation guarantees.

§Example
// Create snapshot at specific LSN
let snapshot = SnapshotId::from_lsn(12345);
Source

pub fn invalid() -> Self

Invalid snapshot - used for error cases

This sentinel value indicates that no valid snapshot exists. Read operations receiving this snapshot should return an error.

§Example
fn validate_snapshot(snapshot: SnapshotId) -> Result<()> {
    if snapshot == SnapshotId::invalid() {
        return Err("Invalid snapshot");
    }
    Ok(())
}
Source

pub fn is_valid(&self) -> bool

Check if this snapshot is valid

Returns false for the invalid sentinel value.

Source

pub fn as_u64(&self) -> u64

Get the underlying transaction ID

Source

pub fn as_lsn(&self) -> u64

Get snapshot as LSN (Log Sequence Number)

Since SnapshotId wraps a commit LSN, this returns the LSN directly. Used for WAL record visibility checks.

Trait Implementations§

Source§

impl Clone for SnapshotId

Source§

fn clone(&self) -> SnapshotId

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for SnapshotId

Source§

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

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

impl Hash for SnapshotId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SnapshotId

Source§

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

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

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

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for SnapshotId

Source§

impl Eq for SnapshotId

Source§

impl StructuralPartialEq for SnapshotId

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

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, 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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