Skip to main content

Clock

Struct Clock 

Source
pub struct Clock { /* private fields */ }
Expand description

A millisecond clock that only moves when it is told to.

A handle and not a value. Cloning one gives a second handle onto the same reading, which is what lets every stripe of every database on a server read the time a command is being judged against without any of them being told separately. Moving the clock is one store however many stripes there are.

§Why a shared reading is not a shared line

It is read on every command on every thread, so the obvious worry is a line that bounces between cores. It does not, because a refresh only writes when the millisecond has actually changed and a turn of the loop is a few microseconds. The reading changes about a thousand times a second and is read millions of times, so the line sits in every core’s cache in the shared state and the writer disturbs it about as often as a timer would.

Implementations§

Source§

impl Clock

Source

pub fn system() -> Clock

A clock that follows the system, read once now.

Source

pub fn fixed(ms: u64) -> Clock

A clock that reads ms until somebody moves it.

Source

pub fn now_ms(&self) -> u64

The current reading, in milliseconds since the unix epoch.

Source

pub fn refresh(&self)

Take a new reading, which a system clock does from the operating system and a fixed clock does not do at all.

Called once per turn of the shard loop, from the maintenance slice. The store only happens when the millisecond has changed, which is what keeps a reading every thread is looking at from being a line every thread is fighting over.

Shared and not exclusive, because on a server running more than one thread every one of them turns a loop and every one of them refreshes. Two threads that read the operating system a nanosecond apart write the same millisecond, and a thread that reads the field between the two stores gets that millisecond either way.

Source

pub fn set(&self, ms: u64)

Move the clock to ms by hand.

On a system clock the next Clock::refresh will overwrite this, so it is only meaningful on a fixed one.

Source

pub fn advance(&self, ms: u64)

Move a clock forward by ms.

A read and a store and not an add, because it saturates. Nothing moves a clock this way but a test, which is one thread.

Source

pub fn fine_now_ms() -> u64

Read the operating system’s clock right now.

A time before the unix epoch reads as zero rather than failing. There is nothing useful a database can do about a machine whose clock says 1969, and every key expiring immediately is a more honest outcome than a panic on a path that has no error to return.

Trait Implementations§

Source§

impl Clone for Clock

Source§

fn clone(&self) -> Clock

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 Debug for Clock

Source§

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

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

impl Default for Clock

Source§

fn default() -> Clock

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

Auto Trait Implementations§

§

impl Freeze for Clock

§

impl RefUnwindSafe for Clock

§

impl Send for Clock

§

impl Sync for Clock

§

impl Unpin for Clock

§

impl UnsafeUnpin for Clock

§

impl UnwindSafe for Clock

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

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

fn try_from(value: U) -> Result<T, !>

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.