[ 
https://issues.apache.org/jira/browse/IGNITE-16893?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sergey Uttsel reassigned IGNITE-16893:
--------------------------------------

    Assignee: Sergey Uttsel

> Implement HLC and clock syncrhonization logic
> ---------------------------------------------
>
>                 Key: IGNITE-16893
>                 URL: https://issues.apache.org/jira/browse/IGNITE-16893
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Alexander Lapin
>            Assignee: Sergey Uttsel
>            Priority: Major
>              Labels: ignite-3
>         Attachments: Screenshot from 2022-04-22 16-14-27.png, Screenshot from 
> 2022-04-22 16-16-10.png
>
>
> HLC is similar to LC, but has a physical meaning and accurately represents 
> physical time within a bound error.
> The rules for updating HLC:
> {code:java}
> Initially l.j = 0; c.j = 0 
> Send or local event 
> l’.j = l.j; 
> l.j = max(l’.j, pt.j); 
> If (l.j = l’.j) then c.j = c.j + 1
> Else c.j = 0;
> Timestamp with l.j, c.j 
> {code}
> Receive event of message m
> {code:java}
> l’.j = l.j; 
> l.j = max(l’.j, l.m, pt.j); 
> If (l.j = l’.j =l.m) then c.j = max(c.j, c.m)+1 
> Elseif (l.j =l’.j) then c.j = c.j + 1 
> Elseif (l.j =l.m) then c.j = c.m + 1 
> Else c.j = 0 
> Timestamp with l.j, c.j{code}
> !Screenshot from 2022-04-22 16-14-27.png!The following statements hold true 
> for HLC, represented by (l,c):
>  # For any two events e and f, e <- f => (l.e; c.e) < (l.f; c.f) // 
> Lexicographic comparison
>  # For any event f, l.f >= pt.f
>  # l.f > pt.f => (∃g : g <- f && pt.g = l.f)
>  # For any event f, |l.f - pt.f| < ϶,
> where ϶ represents clock sync uncertainty. For NTP e ~= 2 * ntp_offset
>  # For any event f, c.f = k && k > 0 => (
> ∃g1; g2; … ; gk : (∀j: 1 <= j < k : gj <- gj+1) && (∀j : 1 <= j < k : l.(gj) 
> = l.f) && (gk hb f)
> )
>  # For any event f, c.f <= |\{g : g <- f && l.g = l.f}|
>  # For any event f, c.f <=  N * (϶ + 1), if a physical clock of a node is 
> incremented by at least one between any two events on that node
> HLC *may overflow* if physical time is not catching up with logical time. In 
> this case only a causal counter can be used to move the timestamp forward. 
> The *bounded time staleness requirement* is aimed to fix this.
> HLC is not limited by NTP and can be used with other time sync protocols, 
> like PTP.
> h4. Consistent Cut
> HLC can also be used to take a consistent snapshot at a logical time {_}t{_}.
> The consistent cut should capture all causal relationships. It can be written 
> down as follows:
> *(e ∈ C) && (e’ <- e) => e’ ∈ C*
> [https://www.cs.cornell.edu/courses/cs5414/2010fa/publications/BM93.pdf]
> !Screenshot from 2022-04-22 16-16-10.png!
> In the picture are shown two cuts: C - is the consistent cut, C’ - is the 
> inconsistent cut.
> HLC allows taking a consistent cut at logical time l=t, c=K
> A global time, corresponding to the cut, lies in [t-϶,t]
> h4. HLC Update Rules
> We assume two major event sources for updating HLC for enlisted nodes:
> h5. RAFT events
> RAFT events help to synchronize HLC between RAFT replicas. All RAFT 
> communications are initiated by a leader, and only one leader can exist at a 
> time. This enforces monotonic growth of HLC on raft group replicas. 
> RequestVote and AppendEntries RPC calls are enriched with sender’s HLC. The 
> HLC update rules are applied on receiving messages. RAFT lease intervals are 
> bound to the HLC range.
> h5. Transaction protocol events
> Another source of HLC sync is a transaction protocol. Each message involved 
> in the execution of the transaction carries the sender’s HLC and updates 
> receiver HLC according to rules.
>  
> Tx.Phase1



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to