# ALGOREP : Logical Time
# Problem statement
*Dans la classe, qui s'est reveille avant qui ?*
> $1^{ere}$ proposition: on demande l'heure du reveil de tout le monde
> Probleme: il faut que tout le monde ait un horloge
:::warning
On ne peut pas faire l'hypothese qu'on a une horloge pour tout le monde, sinon on est synchrone
**Les horloges peuvent avoir des divergences**
:::
> Quelqu'un peut dire qu'il est debout depuis 5h alors qu'en fait il etait 8h
> $2^{eme}$ proposition: On envoie un message des qu'on se leve (ne le fait pas, c'est pas bon pour la sante)
> On ne doit pas avoir de delais de transmission du message
:::danger
***Quel evenement a eu lieu avant quel evenement ?***
:::
*Est-ce qu'on a vraiment besoin de cette info ?*
> $1^{ere}$ proposition: pour savoir quand est-ce qu'une faute est arrivee et on relance le systeme dans un etat precedent $\Rightarrow$ c'est une **snapshot**
:::warning
On n'a pas de garanti sur le delais des messages
:::
Il faudrait prendre en compte la latence des messages et c'est trop complique
:::success
On va utiliser des **horloges logiques**
:::
On va essayer de construire un systeme ou on date les evenements par rapports a des evenements logique $\Rightarrow$ _**les envois de messages**_
> "J'ai vu le message d'Etienne avant de manger ma tartine"
Consider 3 processes $E$, $F$ et $G$
- With some local events: $e_1$, $f_1$, $f_3$, $g_2$, $g_3$
- With some *send* events: $g_1$, $f_2$, $e_2$
- With some *receive* events: $e_3$, $f_4$, $g_4$
![](https://i.imgur.com/rZQNUyp.png)
Ces 2 executions sont **impossibles a distinguer**
![](https://i.imgur.com/tF5SNlq.png)
:::success
On va donner une notion de progres
:::
# Scalar Time: Lamport Clocks
## Definitions
:::info
![](https://i.imgur.com/53LQmNY.png)
:::
:::info
**Rule R1**
Before executing an event (send, receive, or internal), process pi executes the following
$$
C_i:=C_i+d\quad\text{with } d\gt0\text{, typically 1}
$$
:::
:::info
**Rule R2**
Each message piggybacks the clock value of its sender at sending time.
When a process $p_i$ receives a message with timestamp $C_{msg}$ , it executes the following actions :
- $C_i := max(C_i, C_{msg} )$
- Execute R1 and deliver message
:::
## Example
1.
![](https://i.imgur.com/NRtJyFW.png)
2.
![](https://i.imgur.com/DZ0i5VA.png)
3.
![](https://i.imgur.com/wG1m8cY.png)
4.
![](https://i.imgur.com/JAapPIg.png)
5.
![](https://i.imgur.com/0eAzDhH.png)
6.
![](https://i.imgur.com/r9P4F0D.png)
7.
![](https://i.imgur.com/3snkcnA.png)
## Remarques
- On peut utiliser l'horloge de Lamport pour l'ordre
- Il suffit de dire $e_1 \lt g_1$
- Si on incremente toujours de $1$, $h-1$ sera toujours le temps requis pour atteindre le process $e_h$
- No Strong Consistency
## Problem
:::danger
The main problem in totally ordering events is that two or more events at different processes may have identical timestamp !
:::
# Vector Time: Mattern Clocks
- On va toujours maintenir un compteur
- On va avoir une horloge local par processus
- On gere comme une horloge de Lamport
- On maintient son horloge et celle de tout le monde
*Comment est-ce qu'on peut connaitre l'etat d'un processus ?*
> En envoyant un message
> On echange avec une $3^e$ personne qui n'a jamais echange avec Etienne
> On lui transmet l'avancement d'Etienne
> Si cette 3e personne envoie un message a Etienne, elle connaitra son avancee
*Pourquoi une personne tierce ?*
> Si on est que 2, on echange des messages qu'a 2 et on ne peut pas mettre en avant des horloges complexes
*En pratique, comment est-ce qu'on fait passer notre compteur local ?*
> Quand on structure un programme distribue, on incremente l'horloge local a des points stables (barre de progression de chargement, etc.)
## Example
![](https://i.imgur.com/jqziiZe.png)
> On envoie un message a $G$, on veut savoir s'il l'a recu mais il ghost
> Indirectement, on apprend que $G$ a avance de $5$ elements donc il est vivant, *mais est-ce qu'il a recu le message ?*
> On sait que $F$ n'avait pas d'information de notre part au depart
> Le $2$ envoye par $E$ a $G$ a ete renvoyee par $F$, sachant que $E$ n'a pas envoye de message a $F$ auparavant
> **On sait donc que $F$ a recu le message de $E$**
## Remarques
![](https://i.imgur.com/cz6tRvK.png)
## Efficient Implementation of Vector Clocks
*Comment on implemente ca de maniere efficace ?*
:::info
**Implementation**
On peut garder les $n$ derniers messages avec nos voisins, on peut juste envoyer le differentiel de la derniere heure envoyer par quelqu'un et l'horloge courante
:::
## Problem
:::danger
Qu'est-ce qu'il se passe si j'ai une inversion de messages ?
:::
*Est-ce qu'on est capable de gerer ce cas avec les horloges precedentes ?*
> Non.
![](https://i.imgur.com/5O2V6hu.gif)
:::success
On va utiliser les **ragots** $\Rightarrow$ des **matrices d'informations**
:::
> On m'a dit que tu m'as dit que...
$$
\begin{vmatrix}
E&F_E&G_E\\
E_F&F&G_F\\
E_G&F_G&G
\end{vmatrix}
$$
![](https://i.imgur.com/I5bka2J.png)
*La machine qui a le plus de communication serait-elle celle qui a le plus de chance d'etre a jour sur la timeline des processus sur chaque machine ?*
> Oui.
# Virtual Time System
:::info
**Definition**
Virtual time system is an (**optimistic**) paradigm for organizing and synchronizing distributed systems
:::
- Relies on Time Warp mechanism, i.e. lookahead-rollback mechanism
- When a conflict is discovered, the offending processes are rolled back to the time just before the conflict
- Processes are then executed forward along the **revised path**
# Conclusion
- Different kind of logical time
- Virtual time system (Jefferson) is a paradigm for organizing and synchronizing distributed systems