HLClock v0.1.2 HLClock View Source

Hybrid Logical Clock

Provides globally-unique, monotonic timestamps. Timestamps are bounded by the clock synchronization constraint, max_drift.

Implementation assumes that timestamps are (at a minimum) regularly sent; a clock at rest will eventually be unable to generate timestamps due to assumed bounds on the logical clock relative to physical time.

In order to account for physical time drift within the system, timestamps should regularly be exchanged between nodes. Generate a timestamp at one node via HLClock.send_timestamp/1; at the other node, call HLClock.recv_timestamp/2 with the received timestamp from the first node.

Inspired by https://www.cse.buffalo.edu/tech-reports/2014-04.pdf

Link to this section Summary

Functions

Determines if the clock’s timestamp “happened before” a different timestamp

Configurable clock synchronization parameter, ε. Defaults to 300 seconds

Functionally equivalent to using send_timestamp. This generates a timestamp for local causality tracking

Given the current timestamp for this node and a provided remote timestamp, perform the merge of both logical time and logical counters. Returns the new current timestamp for the local node

Generate a single HLC Timestamp for sending to other nodes or local causality tracking

Starts and links the supervision tree

Create a millisecond granularity DateTime struct representing the logical time portion of the Timestamp

Return the logical, monotonic time portion. Unlike System.monotonic_time, if timestamps are regularly exchanged with other nodes and/or clients, this monotonic timestamp will represent a cluster wide monotonic value

Link to this section Functions

Determines if the clock’s timestamp “happened before” a different timestamp

Configurable clock synchronization parameter, ε. Defaults to 300 seconds

Functionally equivalent to using send_timestamp. This generates a timestamp for local causality tracking.

Given the current timestamp for this node and a provided remote timestamp, perform the merge of both logical time and logical counters. Returns the new current timestamp for the local node

Generate a single HLC Timestamp for sending to other nodes or local causality tracking

Starts and links the supervision tree.

Create a millisecond granularity DateTime struct representing the logical time portion of the Timestamp.

Given that this representation loses the logical counter and node information, it should be used as a reference only. Including the counter in the DateTime struct would create absurd but still ordered timestamps.

Example

iex> {:ok, t0} = Timestamp.new(1410652800000, 0, 0)
{:ok, %HLClock.Timestamp{counter: 0, node_id: 0, time: 1410652800000}}
iex> encoded = Timestamp.encode(t0)
<<1, 72, 113, 117, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>>
iex> << time_and_counter :: size(64), _ :: size(64) >> = encoded
iex> DateTime.from_unix(time_and_counter, :microsecond)
{:ok, #DateTime<4899-07-30 06:31:40.800000Z>}

Return the logical, monotonic time portion. Unlike System.monotonic_time, if timestamps are regularly exchanged with other nodes and/or clients, this monotonic timestamp will represent a cluster wide monotonic value.