This commit is contained in:
Amaury 2024-04-03 09:13:23 +02:00 committed by Amaury JOLY
parent 61d7f9a8f4
commit 29a2223ed0
58 changed files with 2031 additions and 6 deletions

View File

@ -29,4 +29,4 @@ Algorithme pour de la convergence BFT. (Reflexions sur des erreurs byzanties pos
__tseng_distributed_2019__, "Algo BFT pour cohérence causale (preuve + experiences)" __tseng_distributed_2019__, "Algo BFT pour cohérence causale (preuve + experiences)"
__misra_byzantine_2021__, "Preuve d'impossibilité de BFT dans un certain contexte pour de la cohérence causale + 2 algo pour de la cohérence causale BFT" __misra_byzantine_2021__, "Preuve d'impossibilité de BFT dans un certain contexte pour de la cohérence causale + 2 algo pour de la cohérence causale BFT"4

View File

@ -0,0 +1,32 @@
\begin{frame}
\frametitle{Conclusion}
\begin{block}{Bilan Moral}
\begin{itemize}
\item Mon intégration à Parsec
\item Ma présence au laboratoire et mon rythme de travail
\end{itemize}
\end{block}
\pause
\begin{block}{La suite ?}
\begin{itemize}
\item Étudier des applications existantes d'édition collaborative adoptant de la cohérence faible.
\item Continuer mon travail avec Parsec :
\begin{itemize}
\item fournir un rapport de l'état de l'art adapté à leur problématique
\item fournir une preuve de concept de l'éditeur collaboratif
\end{itemize}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Merci !}
Place aux questions !
\end{frame}

View File

@ -0,0 +1,14 @@
\begin{frame}
\frametitle{La cohérence faible appliquée aux milieux malveillant}
\begin{block}{Plusieurs directions de recherches :}
\begin{itemize}
\item Le critère de cohérence réduit par design le champ des attaques malicieuses possibles.
\item Le critère de cohérence introduit de nouveaux types d'erreurs byzantines.
\begin{itemize}
\item Hypothèse la plus étayée sur le sujet. Mais pas de réponse satisfaisante.
\end{itemize}
\end{itemize}
\end{block}
\end{frame}

View File

@ -0,0 +1,82 @@
\begin{frame}
\frametitle{Les classes de cohérences}
\begin{columns}
\column{0.6\textwidth}
\begin{figure}
\resizebox{\columnwidth}{!}{
\includegraphics{images/carte_criteres.png}
}
\caption{Perrin, \emph{Concurrence et cohérence dans les systèmes répartis}, 2017}
\end{figure}
\column{0.4\columnwidth}
\begin{block}{Les classes de cohérences}
Deux grandes familles :
\begin{itemize}
\item Cohérence Forte
\item Cohérence Faible :
\begin{itemize}
\item Convergence (EC)
\item Localité d'état (SL)
\item Validité (V)
\end{itemize}
\end{itemize}
\end{block}
\end{columns}
\end{frame}
\begin{frame}
\frametitle{Convergence (EC)}
\begin{block}{Définition}
Les \textbf{lectures infinies} d'un document n'étant plus soumis à \textbf{aucune opération d'écriture} doit retourner pour tout nœud du système \textbf{la même valeur}.
\end{block}
\begin{figure}
\centering
\resizebox{0.7\columnwidth}{!}{
\begin{tcolorbox}[colframe=green!50!black]
\input{schemas/convergence}
\end{tcolorbox}
}
\end{figure}
\end{frame}
\begin{frame}
\frametitle{Localité d'état (SL)}
\begin{block}{Définition}
Chaque processus, indépendamment des autres, doit garder une cohérence de ses lectures en fonction de leurs ordres locaux.
\end{block}
\begin{figure}
\centering
\resizebox{0.7\columnwidth}{!}{
\begin{tcolorbox}[colframe=green!50!black]
\input{schemas/localiteetat}
\end{tcolorbox}
}
\end{figure}
\end{frame}
\begin{frame}
\frametitle{Validité (V)}
\begin{block}{Definition}
Chaque lecture doit résulter d'une suite d'opérations d'écriture valides impliquant l'ensemble des opérations d'écriture connue par le nœud à cet instant.
\end{block}
\begin{figure}
\centering
\resizebox{0.7\columnwidth}{!}{
\begin{tcolorbox}[colframe=green!50!black]
\input{schemas/validite}
\end{tcolorbox}
}
\end{figure}
\end{frame}

View File

@ -0,0 +1,61 @@
\begin{frame}
\frametitle{La cohérence selon Lamport}
Leslie Lamport :
\begin{itemize}
\item Initialement ingénieur chez Intel dans les années 60.
\item Il a travaillé sur les premières problématiques d'architectures multicœurs.
\item Il a ainsi posé les bases de l'informatique distribuée.
\end{itemize}
Il a (entre autre) proposé une formalisation mathématique du comportement attendu d'un système réparti. \\
Il propose 3 registres permettant de spécifier un comportement séquentiel dans un environnement distribué.
\end{frame}
\begin{frame}
\frametitle{Sûreté}
\begin{block}{Définition}
Chaque opération de \textbf{lecture} réalisée dans le même espace \textbf{non-concurrent} doit fournir le même resultat.
\end{block}
\begin{figure}
\input{schemas/linearisation_surete_hc}
\end{figure}
\end{frame}
\begin{frame}
\frametitle{Régularité}
\begin{block}{Définition}
Une \textbf{opération de lecture concurrente à une opération d'écriture} doit fournir une valeur \textbf{antérieure ou postérieure à l'écriture}.
\end{block}
\begin{figure}
\input{schemas/linearisation_regularite_hc}
\end{figure}
\end{frame}
\begin{frame}
\frametitle{Atomicité}
\begin{block}{Definition}
Si \textbf{deux opérations de lecture sont non-concurrentes} alors la seconde doit fournir une valeur \textbf{au moins aussi récente que} la précédente.
\end{block}
\begin{figure}
\input{schemas/linearisation_atomicite_hc}
\end{figure}
\end{frame}
\begin{frame}
\frametitle{Cohérence Atomique ($C_\top$)}
\begin{block}{Définition}
La cohérence atomique est le critère de cohérence le plus "fort".
\begin{itemize}
\item Propose une interactivité très faible.
\item Nécessite une synchronisation forte entre chaque opération.
\begin{itemize}
\item Chaque opération est bloquante et doit attendre la fin des opérations précédentes pour être exécutée.
\end{itemize}
\item Elle est utilisée comme référence pour les autres classes de cohérence.
\end{itemize}
\end{block}
\end{frame}

View File

@ -0,0 +1,8 @@
\subsection*{Cohérence forte}
\include{consistency/forte.tex}
\subsection*{Les compromis de la cohérence faible}
\include{consistency/faible.tex}
\subsection*{Dans un contexte malveillant ?}
\include{consistency/byzantin.tex}

View File

@ -0,0 +1,32 @@
\begin{frame}
\frametitle{Un système distribué}
\begin{block}{Définition}
Un système distribué est un ensemble d'\textbf{acteurs} capable de communiquer \textbf{les uns avec les autres} et travaillant ensemble à la réalisation d'une \textbf{tâche commune}.
\end{block}
\begin{figure}
\centering
\resizebox{0.75\columnwidth}{!}{
\includegraphics{images/distributedsystems.png}
}
\caption{Thibaut Arribe, \emph{Conception des chaînes éditoriales}}
\end{figure}
\end{frame}
\begin{frame}
\frametitle{Un système distribué est un système vivant}
Les systèmes distribués évoluent au fil du temps
Il y a plusieurs approches permettant d'étudier ces changements :
\begin{itemize}
\item concentrés sur le \textbf{churn} (ajout ou retrait de nœuds)
\item concentrés sur les \textbf{messages}
\item concentrés sur la \textbf{connectivité}
\item concentrés sur les \textbf{états} $\Leftarrow$
\item sûrement d'autres... ?
\end{itemize}
\end{frame}

View File

@ -0,0 +1,2 @@
\subsection*{Définition}
\include{distr_sys/bases}

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,2 @@
\subsection*{Présentation de l'entreprise}
\include{intro/suite.tex}

View File

@ -0,0 +1,16 @@
\begin{frame}
\frametitle{Présentation}
\begin{itemize}
\item Amaury JOLY
\item Master Informatique
\begin{itemize}
\item Option Fiabilité Sécurité Informatique (FSI)
\end{itemize}
\end{itemize}
\end{frame}

View File

@ -0,0 +1,61 @@
\begin{frame}
\frametitle{Présentation de l'entreprise}
\begin{itemize}
\item D'avril à août 2023
\item Collaboration entre Parsec (SCILLE) et le Laboratoire d'Informatique et Systèmes (AMU)
\end{itemize}
\pause
\begin{itemize}
\item Présentation de Scille.
\begin{itemize}
\item Scille est une startup bordelaise initialement prestataire de services.
\item Ils ont développé en parallèle de leurs activités un logiciel de partage de fichier dans une approche "zero-trust"
\item Dû à la popularité du logiciel, les activités de l'entreprises se sont tournées exclusivement sur le développement de Parsec
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Présentation du logiciel}
\begin{itemize}
\item Parsec fonctionne dans une approche "zero-trust"
\begin{itemize}
\item Adopte un chiffrement de bout en bout
\item Parsec est donc une architecture de logiciels comportant trois parties :
\begin{itemize}
\item Une PKI
\item Un serveur de stockage des fichiers
\item Un serveur de stockage des méta-données
\end{itemize}
\end{itemize}
\item Parsec souhaite ajouter une fonctionnalité d'édition Collaborative :
\begin{itemize}
\item En restant cohérent avec l'approche "zero-trust" (donc impliquant probablement de la décentralisation)
\item Proposant une approche innovante de l'éditeur collaboratif (basse latence, haute disponibilité)
\end{itemize}
\item Le sujet est donc \textit{Cohérence faible appliquée au cloud pour une application distribuée}
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Présentation du Laboratoire}
\begin{itemize}
\item J'ai été accueilli au LIS qui est un laboratoire de recherche en Informatique
\item Sous l'encadrement d'Emmanuel GODARD et Corentin TRAVERS.
\item Au sein de l'équipe DALGO
\item Rythme très libre et porté sur l'autonomie :
\begin{itemize}
\item Des réunions hebdomadaires avec mes tuteurs
\item La participation aux séminaires et conférences de l'équipe de recherche
\item L'inclusion dans un laboratoire de recherche (rencontre d'autres stagiaires / doctorants / chercheurs)
\end{itemize}
\end{itemize}
\end{frame}

View File

@ -0,0 +1,65 @@
\documentclass{beamer}
\usetheme{Boadilla}
\usecolortheme{orchid}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{stackengine}
\addtobeamertemplate{navigation symbols}{}{%
\usebeamerfont{footline}%
\usebeamercolor[fg]{footline}%
\hspace{1em}%
\insertframenumber/\inserttotalframenumber
}
\usepackage{ulem}
\usepackage{tkz-tab}
\setbeamertemplate{blocks}[rounded]%
[shadow=true]
\AtBeginSection{%
\begin{frame}
\tableofcontents[sections=\value{section}]
\end{frame}
}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{calc}
\usetikzlibrary{arrows.meta}
\usepackage{tcolorbox}
\title[bwconsistency]{Présentation de Stage M2 FSI}
\subtitle{Étude de la cohérence dans les systèmes distribués}
\author[JOLY Amaury]{JOLY Amaury\\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin }
% \\[2ex] \includegraphics[scale=0.1]{./img/amu.png}
\institute[LIS, Scille]{LIS-LAB, Scille}
\date{\today}
\AtBeginSection{}
\begin{document}
\maketitle
\begin{frame}{Table des matières}
\tableofcontents
\end{frame}
\section{Entre industrie et recherche}
\input{intro/index.tex}
\section{Les systèmes distribués et l'étude de la cohérence}
\input{distr_sys/index.tex}
\section{Les compromis dans la gestion de la cohérence}
\input{consistency/index.tex}
\section{Mes contributions}
\input{work/index.tex}
\section{Ce qui nous attend}
\input{conclusion/index.tex}
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

View File

@ -0,0 +1,35 @@
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$ecrire(1)$};
\node[roundnode] (12) [right=50pt of 11] {};
\node[above] at (12.north) {$ecrire(0)$};
\node[roundnode] (13) [right=50pt of 12] {};
\node[above] at (13.north) {$lire/\emptyset$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$ecrire(2)$};
\node[roundnode] (22) [right=50pt of 21] {};
\node[below] at (22.south) {$lire/2$};
\node[roundnode] (23) [right=50pt of 22] {};
\node[below] at (23.south) {$lire/\emptyset$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw (23) -- (13);
\draw[dashed] ($(13)!0.5!(12) + (0,1)$) -- ++(0, -2.9);
\end{tikzpicture}
}

View File

@ -0,0 +1,31 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt},
invisible/.style={draw=none, fill=none},
]
\node[invisible] (10) {};
\node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$ecriture(1)$};
\node[invisible] (12) [right=100pt of 11] {};
\node[invisible] (20) [below=15pt of 10] {};
\node[roundedrectangle, minimum width=75pt] (21) [right=25pt of 20] {\textcolor{blue}{$lecture/0$}};
\node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$lecture/0$}};
\node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$lecture/1$}};
\node[invisible] (24) [below=15pt of 12] {};
\node[invisible] (30) [below=15pt of 20] {};
\node[roundedrectangle, minimum width=50pt] (31) [right=125pt of 30] {\textcolor{red}{$lecture/1$}};
\node[roundedrectangle, minimum width=80pt] (32) [right=40pt of 31] {\textcolor{red}{$lecture/1$}};
\node[invisible] (33) [below=15pt of 24] {};
\node[invisible] (40) [below=25pt of 30] {};
\node[invisible] (41) [below=25pt of 33] {};
\draw (10) -- (11) -- (12);
\draw (20) -- (21) -- (22) -- (23) -- (24);
\draw (30) -- (31) -- (32) -- (33);
\draw[->] (40) -- node [above] {temps} (41);
\end{tikzpicture}
}

View File

@ -0,0 +1,31 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt},
invisible/.style={draw=none, fill=none},
]
\node[invisible] (10) {};
\node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$ecriture(1)$};
\node[invisible] (12) [right=100pt of 11] {};
\node[invisible] (20) [below=15pt of 10] {};
\node[roundedrectangle, minimum width=75pt] (21) [right=25pt of 20] {\textcolor{blue}{$lecture/0$}};
\node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$lecture/0$}};
\node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$lecture/1$}};
\node[invisible] (24) [below=15pt of 12] {};
\node[invisible] (30) [below=15pt of 20] {};
\node[roundedrectangle, minimum width=50pt] (31) [right=125pt of 30] {\textcolor{red}{$lecture/1$}};
\node[roundedrectangle, minimum width=80pt] (32) [right=40pt of 31] {\textcolor{blue}{$lecture/0$}};
\node[invisible] (33) [below=15pt of 24] {};
\node[invisible] (40) [below=25pt of 30] {};
\node[invisible] (41) [below=25pt of 33] {};
\draw (10) -- (11) -- (12);
\draw (20) -- (21) -- (22) -- (23) -- (24);
\draw (30) -- (31) -- (32) -- (33);
\draw[->] (40) -- node [above] {temps} (41);
\end{tikzpicture}
}

View File

@ -0,0 +1,31 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundedrectangle/.style={draw, rounded corners, rectangle, minimum height=10pt, minimum width=20pt},
invisible/.style={draw=none, fill=none},
]
\node[invisible] (10) {};
\node[roundedrectangle, minimum width=150pt] (11) [right=100pt of 10] {$ecriture(1)$};
\node[invisible] (12) [right=100pt of 11] {};
\node[invisible] (20) [below=15pt of 10] {};
\node[roundedrectangle, minimum width=75pt] (21) [right=25pt of 20] {\textcolor{blue}{$lecture/0$}};
\node[roundedrectangle, minimum width=50pt] (22) [right=75pt of 21] {\textcolor{blue}{$lecture/0$}};
\node[roundedrectangle, minimum width=50pt] (23) [right=75pt of 22] {\textcolor{red}{$lecture/1$}};
\node[invisible] (24) [below=15pt of 12] {};
\node[invisible] (30) [below=15pt of 20] {};
\node[roundedrectangle, minimum width=80pt] (31) [right=125pt of 30] {\textcolor{red!50!blue}{$lecture/27$}};
\node[roundedrectangle, minimum width=50pt] (32) [right=40pt of 31] {\textcolor{red}{$lecture/1$}};
\node[invisible] (33) [below=15pt of 24] {};
\node[invisible] (40) [below=25pt of 30] {};
\node[invisible] (41) [below=25pt of 33] {};
\draw (10) -- (11) -- (12);
\draw (20) -- (21) -- (22) -- (23) -- (24);
\draw (30) -- (31) -- (32) -- (33);
\draw[->] (40) -- node [above] {temps} (41);
\end{tikzpicture}
}

View File

@ -0,0 +1,34 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$ecrire(0)$};
\node[roundnode] (12) [right=50pt of 11] {};
\node[above] at (12.north) {$lire/\emptyset$};
\node[roundnode] (13) [right=50pt of 12] {};
\node[above] at (13.north) {$lire/1$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$ecrire(1)$};
\node[roundnode] (22) [right=50pt of 21] {};
\node[below] at (22.south) {$lire/\emptyset$};
\node[roundnode] (23) [right=50pt of 22] {};
\node[below] at (23.south) {$lire/0$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw[message] (11) -- ($(22)!0.5!(23)$);
\draw[message] (21) -- ($(12)!0.5!(13)$);
\end{tikzpicture}
}

View File

@ -0,0 +1,31 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$ecrire(1)$};
\node[roundnode] (12) [right=50pt of 11] {};
\node[above] at (12.north) {$lire/1$};
\node[roundnode] (13) [right=50pt of 12] {};
\node[above] at (13.north) {$lire/1$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$lire/1$};
\node[roundnode] (22) [right=50pt of 21] {};
\node[below] at (22.south) {$supprimer(1)$};
\node[roundnode] (23) [right=50pt of 22] {};
\node[below] at (23.south) {$lire/\emptyset$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\end{tikzpicture}
}

View File

@ -0,0 +1,42 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode, color=red] (11) {};
\node[above] at (11.north) {$w(1)$};
\node[roundnode, color=red!50] (12) [right=of 11] {};
\node[above] at (12.north) {$r/(0,1)$};
\node[roundnode, color=red!25] (13) [right=of 12] {};
\node[above] at (13.north) {$r/(3,2)^\omega$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode, color=green!75!black] (21) [below=20pt of 11] {};
\node[left] at (21.west) {$r/(3,1)$};
\node[roundnode, color=green!95!black] (22) [right=of 21] {};
\node[right] at (22.east) {$w(2)$};
\draw[arrow] (21) -- (22);
\node[roundnode, color=blue] (31) [below=20pt of 21] {};
\node[below] at (31.south) {$w(3)$};
\node[roundnode, color=blue!50] (32) [right=of 31] {};
\node[below] at (32.south) {$r/(3,1)$};
\node[roundnode, color=blue!25] (33) [right=of 32] {};
\node[below] at (33.south) {$r/(3,2)^\omega$};
\draw[arrow] (31) -- (32);
\draw[arrow] (32) -- (33);
\draw[message] (11) -- (21);
\draw[message] (31) -- (21);
\draw[message] (21) -- (32);
\draw[message] (22) -- (13);
\draw[message] (22) -- (33);
\end{tikzpicture}
}

View File

@ -0,0 +1,29 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[above] at (11.north) {$w(1)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$r/(2,1)$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$r/(2,1)^\omega$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode] (21) [below=20pt of 11] {};
\node[left] at (21.west) {$r/(0,1)$};
\node[roundnode] (22) [right=of 21] {};
\node[right] at (22.east) {$w(2)$};
\draw[arrow] (21) -- (22);
\draw[message] (11) -- (21);
\draw[message] (22) -- (12);
\end{tikzpicture}
}

View File

@ -0,0 +1,41 @@
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode, color=red] (11) {};
\node[above] at (11.north) {$w(1)$};
\node[roundnode, color=red!50] (12) [right=of 11] {};
\node[above] at (12.north) {$r/(3,1)$};
\node[roundnode, color=red!25] (13) [right=of 12] {};
\node[above] at (13.north) {$r/(1,2)^\omega$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode, color=green!75!black] (21) [below=20pt of 11] {};
\node[left] at (21.west) {$r/(0,0)$};
\node[roundnode, color=green!95!black] (22) [right=of 21] {};
\node[right] at (22.east) {$w(2)$};
\draw[arrow] (21) -- (22);
\node[roundnode, color=blue] (31) [below=20pt of 21] {};
\node[below] at (31.south) {$w(3)$};
\node[roundnode, color=blue!50] (32) [right=of 31] {};
\node[below] at (32.south) {$r/(1,3)$};
\node[roundnode, color=blue!25] (33) [right=of 32] {};
\node[below] at (33.south) {$r/(3,2)^\omega$};
\draw[arrow] (31) -- (32);
\draw[arrow] (32) -- (33);
\draw[message] (11) -- (31);
\draw[message] (31) -- (12);
\draw[message] (22) -- (13);
\draw[message] (22) -- (33);
\end{tikzpicture}
}

View File

@ -0,0 +1,25 @@
\begin{frame}
\frametitle{Travail réalisé}
\begin{columns}
\column{0.4\columnwidth}
\begin{block}{LIS}
\begin{itemize}
\item Une réflexion sur l'approche à prendre avec la problématique de Parsec
\item Une étude et une compréhension profonde de l'architecture derrière Parsec
\end{itemize}
\end{block}
\column{0.4\columnwidth}
\begin{block}{Scille}
\begin{itemize}
\item L'étude et la réalisation de l'état de l'art.
\item Des présentations dans le cadre du LIS
\end{itemize}
\end{block}
\vspace{50pt}
\end{columns}
\end{frame}

View File

@ -0,0 +1,17 @@
\begin{frame}
\frametitle{Le principe de la commutativité}
\begin{block}{Définition}
Une opération est commutative si l'ordre dans lequel elle est appliquée n'a pas d'importance.
\end{block}
\begin{exampleblock}{Exemple}
\begin{itemize}
\item $a + b = b + a$
\item $a \times b = b \times a$ MAIS $a \times b \times c \neq a \times c \times b$
\item $a \div b \neq b \div a$
\end{itemize}
\end{exampleblock}
L'idée est de restreindre les opérations possibles de l'application à seulement celles qui sont commutatives entre elles.
\end{frame}

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

View File

@ -0,0 +1,52 @@
\documentclass{beamer}
\usetheme{Boadilla}
\usecolortheme{orchid}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{stackengine}
\addtobeamertemplate{navigation symbols}{}{%
\usebeamerfont{footline}%
\usebeamercolor[fg]{footline}%
\hspace{1em}%
\insertframenumber/\inserttotalframenumber
}
\usepackage{ulem}
\usepackage{tkz-tab}
\setbeamertemplate{blocks}[rounded]%
[shadow=true]
\AtBeginSection{%
\begin{frame}
\tableofcontents[sections=\value{section}]
\end{frame}
}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{calc}
\usetikzlibrary{arrows.meta}
\title[bwconsistency]{Cohérence faible byzantine appliquée au cloud}
\subtitle{Présentation intermédiaire : Cohérence faible}
\author[JOLY Amaury]{JOLY Amaury\\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin }
% \\[2ex] \includegraphics[scale=0.1]{./img/amu.png}
\institute[LIS, Scille]{LIS-LAB, Scille}
\date{\today}
\begin{document}
\maketitle
\begin{frame}{Table des matières}
\tableofcontents
\end{frame}
% \section{Introduction}
% \input{définition/index.tex}
\section{Les CRDT (Conflict-free Replicated Data Types)}
\input{crdt/index.tex}
\end{document}

View File

@ -0,0 +1,27 @@
# Script présentation Cohérence Faible
## Plan
1. Présenter un processus séquentiel classique
- exemple : processeur monocœur
2. Introduire le concept de cohérence via la cohérence forte (le plus intuitif)
- exemple : processeur multicœur, application distribuée centralisée.
- notions : respect de l'ordre, atomicité, isolation
3. Introduire le concept de cohérence faible
- exemple : application distribuée décentralisée
4. Définir les propriétés d'un système réparti
5. Définir les différents modèles de cohérence faible (des plus trivial aux moins)
1. Cohérence Séquentielle (SC)
2. Linéarisabilité -> Serialisabilité
3. Convergence/Convergence Forte
1. Définit le concept de convergence
2. Pourquoi ? + les apports de la convergence forte
3. Types de données basés sur la convergence (pourquoi ?)
4. Cohérence Pipeline
1. On présente la notion d'Intention
2. On l'oppose à la cohérence Pipeline
6. Cohérence d'écriture
1. Ce que ne couvre pas les modèles précédents
2. Cohérence d'écriture et cohérence d'écriture forte.

View File

@ -0,0 +1,96 @@
La cohérence forte présente, dans un premier temps, l'approche la plus intuitive pour une application collaborative dans le cloud.
Prenons l'approche de chercher à répliquer un processus d'édition local d'un document. Formalisons dans un premier temps ce qu'on attend d'une application d'édition de document local.
\begin{figure}[!h]
\centering
\resizebox{!}{.4\columnwidth}{
\input{images/local1.latex}
}
\caption{Bob edit un document localement}
\label{local_1}
\end{figure}
On voit sur la figure \ref{local_1} que Bob émet une requête à son interface utilisateur. À partir de là le clavier partage l'information au système jusqu'à l'application d'édition. En fonction du traitement de cette information, si elle est acceptée par l'application d'édition, alors elle affiche un document modifié en accord avec la saisie de Bob à l'écran. Ce qui donne un feedback à Bob concernant son action initiale.
Dans notre modélisation, nous séparons bien les actions de l'utilisateur sur ses interfaces (l'écran et le clavier) des interactions au sein du système.
Dans un cas d'usage courant, une application d'édition local ne présente pas de problèmes liés à la présence de plusieurs éditeurs en simultanés. Il y a en effet une seule interface homme-machine, c'est-à-dire de façon pragmatique un unique écran et clavier.
Imaginons ainsi un cas où Alice et Bob souhaitent éditer ensemble un même document. Si on voulait simplement appliquer le fonctionnement local que nous venons de décrire à cette nouvelle problématique. Il conviendrait de simplement rajouter un IHM à Alice. Ainsi il y a toujours une seule application d'édition collaborative sur lequel viennent se connecter cette fois-ci deux interfaces (comme visible dans la figure \ref{local_2}).
\begin{figure}[!h]
\begin{multicols}{2}
\centering
\resizebox{!}{.7\columnwidth}{
\input{images/local2.latex}
}
\caption{Alice et Bob éditent un document localement}
\label{local_2}
\columnbreak
\centering
\resizebox{!}{.8\columnwidth}{
\input{images/local2fail.latex}
}
\caption{Alice et Bob éditent un document localement de manière concurente}
\label{local_2_fail}
\end{multicols}
\end{figure}
Nous avons à présents deux acteurs qui éditent et lise le document, et un autre qui s'occupe de stocker et de synchroniser le document entre ces deux acteurs.
La limite liée à cette approche réside dans le fait que les communications entre Alice et l'application et Bob et l'application ne peuvent pas être garentits comme équitables. En effet, Alice et Bob peuvent très bien se retrouver déconnectés de manière non prévisible et asynchrone. Ou bien avoir des temps de transmissions de leurs informations qui diffèrent. Le caractère non-deterministe des ces erreurs peut résulter en des incohérences dans l'ordre d'arrivé des informations soumises par Alice et Bob. Ce qui peut a terme créer des incohérences dans le document final.
C'est néanmoins une problèmatique qui peut être assimilée à de la gestion de la concurrence entre processus. C'est en effet un domaine qui est étudié depuis l'apparition des premiers processeurs multi-coeur. Une approche que nous pouvons donc prendre à la programmation concurente serait de résoudre ce problème en venant utliser des techniques de synchronisation de processus. C'est-à-dire en utilisant des mécanismes de synchronisation tel que des verrous dans notre application. On peut par exemple utiliser des sémaphores pour gérer les accès concurrents à la mémoire partagée. Ce qui resulterais en l'execution suivante:
\begin{figure}[!h]
\centering
\resizebox{!}{.7\columnwidth}{
\input{images/serialized.latex}
}
\caption{Alice et Bob éditent un document localement avec des vérous}
\label{serialized}
\end{figure}
On voit sur la figure \ref{serialized} que les actions d'Alice et Bob sont sérialisées. C'est-à-dire que les actions d'Alice et Bob sont exécutées l'une après l'autre. Ce qui permet d'éviter les problèmes de concurrence entre les deux acteurs. Cependant, cette approche est très limitée. En effet, elle ne permet pas de profiter des avantages de l'édition collaborative. En effet, cela signifie que l'un des deux acteurs doit attendre que l'autre ait fini d'éditer le document pour pouvoir à son tour l'éditer. Ce qui rabaisse les performance de l'application à la latence de l'acteur le plus lent.
En revenons dans notre contexte initial qui est une applicationn d'édition collaborative nous souhaitons pouvoir gérér un grand nombre d'utilisateur en simultanés. Ainsi la probabilité d'avoir une expérience dégradé pour l'ensemble des utilisateur croit avec le nombre d'utilisateur. Pour pallier à ce problème l'approche qui peut être adopté est d'exclure les utilisateurs possèdant des connections trop limités avec le serveur.
C'est néanmoins la seule approche qui nous permet d'obtenir une cohérence absolue autant dans la prise en compte des opérations d'écritures des acteurs que dans le traitement de leurs lectures.
Selon Perrin on se placerait dans une approche qui relèverait de la cohérence séquentielle.
\subsection{Cohérence séquentielle}
% blbla sur la cohérence séquentielle de manière très théorique et fondamentale
\paragraph{Validité}
Dans une application d'édition collaborative on s'attend à ce que toutes les entrées des utilisateurs soient prises en compte. Il nous parait en effet inacceptable que des saisies disparaisses de manière aléatoire durant l'exécution.
Ce principe nous permet d'introduire une première propriété utilisée par Perrin pour définir et classer les différents critères de cohérence qu'est la validité.
La validité peut ainsi être résumé comme la propriété qui permet d'assurer que toutes les saisies réalisées, et seulement elles, soient prises en compte dans l'exécution du système.
Ceci se traduit par l'affichage d'un retour quant à la saisie de bob sur son application. Lui signifiant que son interaction avec l'application à bien était prise en compte, et n'est donc pas passée à la trappe. Elle n'implique néanmoins aucune notion d'ordre dans les saisies, ce qui signifie que les saisies peuvent être réagencées durant l'exécution.
\paragraph{Convergence}
Une autre attente d'une application d'édition collaborative est en quelque sorte sont determinisme sur une durée infinie. On s'attend en effet, une fois toutes les éditions terminés, que le document soit identique pour tous les acteurs. C'est-à-dire que peut importe l'ordre dans lequel les saisies ont été réalisées, le document final doit être identique pour tous les noeuds.
C'est ce que Perrin appelle la convergence qu'il définit plus formellement comment étant la propriété qui assure que si un nombre finit d'ecriture et infini de lecture sont réaliséés, alors tous les noeuds finissent par avoir la même valeur.
\paragraph{Localité D'état}
La dernière propriétée du model de Perrin est la localité d'état.
Elle consiste en le fait que chaque acteur doivent garder une vision local cohérente du système. Par exemple, comme illustrée dans la Figure \ref{local_state}, au fur et à mesure des éditions de Bob, sa vue local va évoluer en conséquence, mais si il recoit à un moment donné une édition d'Alice qui est antérieur à une de ses éditions, alors il doit privilégier sa propre édition. C'est-à-dire que sa vue local doit être cohérente avec son historique d'édition quitte à diverger de la vue local d'Alice.
\begin{figure}[!h]
\caption{Localité d'état}
\label{local_state}
\end{figure}

View File

@ -1,7 +1,68 @@
\subsection{Etat des différents critères} Nous venons de définir la cohérence séquentielle et de proposer une approche pour la réalisser. Néanmoins nous avons vue que cette approche est limitès puisqu'elle pousse le système à être nivelé par le bas en s'adaptant à l'acteur le plus lent.
\subsubsection{Les modèles de mémoires partagées} Nous allons donc explorer d'autres approches réalisant plus de compromis dans la gestion de la cohérence du système.
\subsubsection{La cohérence forte} Ainsi là où la cohérence séquentielle (et par extension la cohérence forte) permettait de garantir nos 3 propriétées que sont la validité, la convergence et la localité d'état. Nous allons explorer des solution qui certaines de ces propriétées afin de gagner en performance et en résilience.
Cohérence Séquentielle \cite{lamport_how_1979}
\subsubsection{La cohérence Faible} \subsection{Adaptation à notre problème}
Dans le cadre de notre problématique il convient dans un premier temps de spécifier quels sont les critères qui semblent être essentiels à la réalisation d'une application d'édition collaborative. Pour ca nous pouvons dèja imaginer ce qu'implique concretement ces différents critères sur le comportement de notre application.
\subsubsection{Validité}
Comme dit précèdemment, la validité permet d'assurer que les saisies de Bob soient toujours prise en compte en tout point du système. C'est-à-dire que si Bob saisit "Hello" puis "World" alors il s'attend à ce que ces deux saisies soient prises en compte. Ce qui se traduit par l'affichage de "Hello World" ou "World Hello sur son écran. Les états finaux incorects qui ne respecterais pas la validité sont alors "Hello", "World" ou "$\emptyset$".
De la même manière, les saisies des aitres acteurs du sytème peuvent donc très bien étre ignorés, intercalés entre les saises de Bob, et réagencés durant l'éxécution.
Ne pas prendre en compte le critère de validité dans notre application reviendrait donc à être capable d'ignorer des saisies soumises par l'utilisateur. C'est ce qui est formalisé par le critère de cohérence dit de Sérialization (selon Perrin).
L'application de la validité demande à notre système une approche d'acknowledgement. Puisque toutes saisies ce doit d'être considéré, le client doit s'assurer que sa saisie à bien était recu par l'ensemble des noeuds. Dans le cas d'une application centralisé, seul un intermédiaire doit être contacté. Mais dans un contexte plus distriué, le problème augmente en compléxité et en coût pour le réseau.
\paragraph{La Serialisation}
La sérialisation se propose donc comme étant l'exact inverse de la validité, c'est à dire un critère de cohérence fort auquel nous aurions retiré la validité. ($SER = \{C_\top\} - \{V\}$)
\subsubsection{Convergence}
La convergence permet d'assurer que le document final soit identique pour tous les acteurs. C'est-à-dire que peut importe l'ordre dans lequel les saisies ont été recu par chaque noeud, le document final doit être identique pour tous.
Il est important de noter que la convergence seule ne dit rien sur la source des données qui composent le document. Ainsi il est possible que le document final ne prenne pas en compte toutes les saisies réalisées sur le système. Ou bien même qu'il prenne en compte des saisies qui n'ont jamais été réalisées.
Appliqué à notre problème, la convergence assure que le document final soit identique pour tous les acteurs, ce qui peut sembler essentiel dans notre cas.
L'application de la convergence introduit dans notre système une notion de gestion des conflits. Si plusieurs acteurs souhaitent écrire au même moments, alors des mécanismes doivent être mise en place pour une gestion des conflits deterministe. C'est à dire, permettant de garantir une seule version pour tous les acteurs quelque soit sa position dans le système, et donc l'ordre potentiel de reception des saisies.
[Un exemple de gestion de conflits pas si évidente que ca]
Cette gestion des conflit peut être réalisé de manière distribué impliquant la mise en place d'un algorithme de consensus. Ce qui peut être très couteux en terme de performance et de complexité. Ou bien être délégué à un acteur centralisé qui aura le pouvoir de manipuler l'ordre final des saisies. Ce qui peut poser des problèmes en termes de gouvernance du système, donnant le pouvoir à un seul acteur.
Il est bon de noter que bien que la convergence est une propriétée qui semble importante dans le cadre d'une application d'édition collaborative classique. Il existe des manière de concevoir une application collaborative fournissant un document final identique, mais ne garantissant pas nécéssairement la convergence dans l'ordre où les saisies sont interprétés. Ce point sera discuté lorsque nous aborderons les CRDTs.
\subsubsection{Localité d'état}
La localité d'état permet d'assurer que les mises à jour d'affichages futures soient toujours cohérentes avec les mises à jour d'affichages passées. Indirectement, cela interdit le changement de l'ordre dans lequel les transactions passés sont interprétés une fois que le résultat est affiché à l'utilisateur. Mais empeche aussi l'insertion et la supression de transctions dans ce même passé.
L'objectif à haut niveau est de garder une expérience cohérente pour l'utilisateur, en interdisant à l'application de tolérer des retours en arrières de l'état courant.
Appliqué à notre problème, la localité d'état permet d'assurer que les saisies de Bob et celles qu'il a reçu soient toujours affichés dans l'ordre où elles ont étaient interprétés initialement. Cette propriétée permet par exemple d'empecher le cas où Alice traiterais la saisie de bob, bob de son coté suprime la saisie qu'il vient de réalisé, et Alice renvoit à Bob la saisie qu'elle vient de modifier. Ce cas est explicité dans la figure \ref{local_state_fail}.
\begin{figure}[!h]
\centering
\resizebox{!}{0.7\columnwidth}{
\input{images/localiteEtatFail.latex}
}
\caption{Localité d'état non respectée}
\label{local_state_fail}
\end{figure}
Du point de vue de Bob, il vient de revoir aparaitre une ligne qu'il vient de supprimer, ce qui rend son expérience incohérente.
En effet, premièrement Bob à vue s'afficher sur son écran la ligne qu'il venant de saisir \\ $\delta = \{"Hello World"\}$ qui est le resultat de l'éxécution $\text{inserer}("Hello World")$. Puis il supprime le mot "World". Le passé des éxécutions de Bob devient donc $\text{inserer}("Hello World") \cdot \text{supprimer}(" World") = \{"Hello"\}$. Mettant ainsi à jour son état local. Enfin il recoit l'opération d'Alice qui vinet de réaliser une modification en se basant sur un état antérieur à l'état actuel de Bob. L'état qu'il recoit est donc le résultat des opérations $\text{inserer}("Hello World") \cdot \text{inserer}("Hello World") = \{"Hello World"\}$. On omet ici une opération que Bob à soumise, qu'il à pu constater comme étant comptabilisé dans le calcul de son état local, mais qui à ensuite était ignoré par le système. La cohérence de l'état local de Bob n'a donc pas était respectée.
% \subsection{Etat des différents critères}
% \subsubsection{Les modèles de mémoires partagées}
% \subsubsection{La cohérence forte}
% Cohérence Séquentielle \cite{lamport_how_1979}
% \subsubsection{La cohérence Faible}

View File

@ -0,0 +1,43 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{0,0,0}
\definecolor{plantucolor0002}{RGB}{226,226,240}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (23pt,84.0679pt) -- (23pt,311.01pt);
\draw[pstyle0] (134.7162pt,84.0679pt) -- (134.7162pt,311.01pt);
\draw[pstyle0] (208.3289pt,84.0679pt) -- (208.3289pt,311.01pt);
\draw[pstyle0] (368.0101pt,84.0679pt) -- (368.0101pt,311.01pt);
\node at (5pt,65pt)[below right,color=black]{Bob};
\draw[pstyle1] (23.3692pt,13.5pt) ellipse (8pt and 8pt);
\draw[color=plantucolor0000,line width=0.5pt] (23.3692pt,21.5pt) -- (23.3692pt,48.5pt)(10.3692pt,29.5pt) -- (36.3692pt,29.5pt)(23.3692pt,48.5pt) -- (10.3692pt,63.5pt)(23.3692pt,48.5pt) -- (36.3692pt,63.5pt);
\draw[pstyle1] (100.7162pt,55pt) arc (180:270:5pt) -- (105.7162pt,50pt) -- (164.3289pt,50pt) arc (270:360:5pt) -- (169.3289pt,55pt) -- (169.3289pt,78.0679pt) arc (0:90:5pt) -- (164.3289pt,83.0679pt) -- (105.7162pt,83.0679pt) arc (90:180:5pt) -- (100.7162pt,78.0679pt) -- cycle;
\node at (107.7162pt,57pt)[below right,color=black]{Clavier};
\draw[pstyle1] (179.3289pt,55pt) arc (180:270:5pt) -- (184.3289pt,50pt) -- (233.3289pt,50pt) arc (270:360:5pt) -- (238.3289pt,55pt) -- (238.3289pt,78.0679pt) arc (0:90:5pt) -- (233.3289pt,83.0679pt) -- (184.3289pt,83.0679pt) arc (90:180:5pt) -- (179.3289pt,78.0679pt) -- cycle;
\node at (186.3289pt,57pt)[below right,color=black]{Ecran};
\draw[pstyle1] (330.0101pt,55pt) arc (180:270:5pt) -- (335.0101pt,50pt) -- (402.2546pt,50pt) arc (270:360:5pt) -- (407.2546pt,55pt) -- (407.2546pt,78.0679pt) arc (0:90:5pt) -- (402.2546pt,83.0679pt) -- (335.0101pt,83.0679pt) arc (90:180:5pt) -- (330.0101pt,78.0679pt) -- cycle;
\node at (337.0101pt,57pt)[below right,color=black]{Système};
\draw[pstyle3] (123.0226pt,113.7739pt) -- (133.0226pt,117.7739pt) -- (123.0226pt,121.7739pt) -- (127.0226pt,117.7739pt) -- cycle;
\draw[pstyle4] (23.3692pt,117.7739pt) -- (129.0226pt,117.7739pt);
\node at (30.3692pt,98.0679pt)[below right,color=black]{Ecrit "Hello"};
\draw[pstyle3] (356.6323pt,145.4799pt) -- (366.6323pt,149.4799pt) -- (356.6323pt,153.4799pt) -- (360.6323pt,149.4799pt) -- cycle;
\draw[pstyle4] (135.0226pt,149.4799pt) -- (362.6323pt,149.4799pt);
\node at (142.0226pt,129.7739pt)[below right,color=black]{Envoie "Hello"};
\draw[pstyle4] (368.6323pt,198.892pt) -- (410.6323pt,198.892pt);
\draw[pstyle4] (410.6323pt,198.892pt) -- (410.6323pt,211.892pt);
\draw[pstyle4] (369.6323pt,211.892pt) -- (410.6323pt,211.892pt);
\draw[pstyle3] (379.6323pt,207.892pt) -- (369.6323pt,211.892pt) -- (379.6323pt,215.892pt) -- (375.6323pt,211.892pt) -- cycle;
\node at (375.6323pt,161.4799pt)[below right,color=black]{Accepte la saisie et};
\node at (375.6323pt,179.186pt)[below right,color=black]{modifie le document};
\draw[pstyle3] (219.8289pt,257.304pt) -- (209.8289pt,261.304pt) -- (219.8289pt,265.304pt) -- (215.8289pt,261.304pt) -- cycle;
\draw[pstyle4] (213.8289pt,261.304pt) -- (367.6323pt,261.304pt);
\node at (225.8289pt,223.892pt)[below right,color=black]{Afiche le document};
\node at (225.8289pt,241.598pt)[below right,color=black]{mis à jour};
\draw[pstyle3] (34.3692pt,289.01pt) -- (24.3692pt,293.01pt) -- (34.3692pt,297.01pt) -- (30.3692pt,293.01pt) -- cycle;
\draw[pstyle4] (28.3692pt,293.01pt) -- (207.8289pt,293.01pt);
\node at (40.3692pt,273.304pt)[below right,color=black]{Regarde};
\end{tikzpicture}

View File

@ -0,0 +1,16 @@
@startuml local1
hide footbox
actor Bob
participant Clavier
participant Ecran
participant Système
Bob -> Clavier : Ecrit "Hello"
Clavier -> Système : Envoie "Hello"
Système -> Système : Accepte la saisie et\nmodifie le document
Système -> Ecran : Afiche le document\nmis à jour
Ecran -> Bob : Regarde
@enduml

View File

@ -0,0 +1,41 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{0,0,0}
\definecolor{plantucolor0002}{RGB}{226,226,240}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (26pt,84.0679pt) -- (26pt,294.304pt);
\draw[pstyle0] (75.9pt,84.0679pt) -- (75.9pt,294.304pt);
\draw[pstyle0] (235.9633pt,84.0679pt) -- (235.9633pt,294.304pt);
\node at (5pt,65pt)[below right,color=black]{Alice};
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
\node at (57.9pt,65pt)[below right,color=black]{Bob};
\draw[pstyle1] (76.2692pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (76.2692pt,21.5pt) -- (76.2692pt,48.5pt)(63.2692pt,29.5pt) -- (89.2692pt,29.5pt)(76.2692pt,48.5pt) -- (63.2692pt,63.5pt)(76.2692pt,48.5pt) -- (89.2692pt,63.5pt);
\draw[pstyle1] (184.9633pt,55pt) arc (180:270:5pt) -- (189.9633pt,50pt) -- (282.623pt,50pt) arc (270:360:5pt) -- (287.623pt,55pt) -- (287.623pt,78.0679pt) arc (0:90:5pt) -- (282.623pt,83.0679pt) -- (189.9633pt,83.0679pt) arc (90:180:5pt) -- (184.9633pt,78.0679pt) -- cycle;
\node at (191.9633pt,57pt)[below right,color=black]{Application};
\draw[pstyle3] (224.2932pt,113.7739pt) -- (234.2932pt,117.7739pt) -- (224.2932pt,121.7739pt) -- (228.2932pt,117.7739pt) -- cycle;
\draw[pstyle4] (26.45pt,117.7739pt) -- (230.2932pt,117.7739pt);
\node at (33.45pt,98.0679pt)[below right,color=black]{saisir("Hello")};
\draw[pstyle3] (37.45pt,145.4799pt) -- (27.45pt,149.4799pt) -- (37.45pt,153.4799pt) -- (33.45pt,149.4799pt) -- cycle;
\draw[pstyle4] (31.45pt,149.4799pt) -- (235.2932pt,149.4799pt);
\node at (43.45pt,129.7739pt)[below right,color=black]{lire("Hello")};
\draw[pstyle3] (87.2692pt,177.186pt) -- (77.2692pt,181.186pt) -- (87.2692pt,185.186pt) -- (83.2692pt,181.186pt) -- cycle;
\draw[pstyle4] (81.2692pt,181.186pt) -- (235.2932pt,181.186pt);
\node at (93.2692pt,161.4799pt)[below right,color=black]{lire("Hello")};
\draw[pstyle3] (224.2932pt,208.892pt) -- (234.2932pt,212.892pt) -- (224.2932pt,216.892pt) -- (228.2932pt,212.892pt) -- cycle;
\draw[pstyle4] (76.2692pt,212.892pt) -- (230.2932pt,212.892pt);
\node at (83.2692pt,193.186pt)[below right,color=black]{saisir(" World")};
\draw[pstyle3] (37.45pt,240.598pt) -- (27.45pt,244.598pt) -- (37.45pt,248.598pt) -- (33.45pt,244.598pt) -- cycle;
\draw[pstyle4] (31.45pt,244.598pt) -- (235.2932pt,244.598pt);
\node at (43.45pt,224.892pt)[below right,color=black]{lire("Hello World")};
\draw[pstyle3] (87.2692pt,272.304pt) -- (77.2692pt,276.304pt) -- (87.2692pt,280.304pt) -- (83.2692pt,276.304pt) -- cycle;
\draw[pstyle4] (81.2692pt,276.304pt) -- (235.2932pt,276.304pt);
\node at (93.2692pt,256.598pt)[below right,color=black]{lire("Hello World")};
\end{tikzpicture}

View File

@ -0,0 +1,38 @@
@startuml local2
!pragma teoz true
hide footbox
actor Alice
actor Bob
participant Application
Alice ->(15) Application: saisir("Hello")
Application ->(15) Alice: lire("Hello")
& Application ->(30) Bob
Bob ->(15) Application: saisir(" World")
Application ->(15) Alice: lire("Hello World")
& Application ->(30) Bob
@enduml
@startuml local2fail
!pragma teoz true
hide footbox
actor Alice
participant Application
actor Bob
Alice ->(15) Application: saisir("Le chat")
Application ->(15) Alice: lire("Le chat")
& Application ->(15) Bob: lire("Le chat")
Bob ->(15) Application: saisir(" mange")
& Alice ->(20) Application: saisir(" boit")
Application ->(15) Alice: lire("Le chat mange boit")
& Application ->(15) Bob: lire("Le chat mange boit")
@enduml

View File

@ -0,0 +1,44 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{0,0,0}
\definecolor{plantucolor0002}{RGB}{226,226,240}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (26.45pt,84.0679pt) -- (26.45pt,293.892pt);
\draw[pstyle0] (230.5952pt,84.0679pt) -- (230.5952pt,293.892pt);
\draw[pstyle0] (434.7404pt,84.0679pt) -- (434.7404pt,293.892pt);
\node at (5pt,65pt)[below right,color=black]{Alice};
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
\draw[pstyle1] (179.2654pt,55pt) arc (180:270:5pt) -- (184.2654pt,50pt) -- (276.9251pt,50pt) arc (270:360:5pt) -- (281.9251pt,55pt) -- (281.9251pt,78.0679pt) arc (0:90:5pt) -- (276.9251pt,83.0679pt) -- (184.2654pt,83.0679pt) arc (90:180:5pt) -- (179.2654pt,78.0679pt) -- cycle;
\node at (186.2654pt,57pt)[below right,color=black]{Application};
\node at (416.3712pt,65pt)[below right,color=black]{Bob};
\draw[pstyle1] (434.7404pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (434.7404pt,21.5pt) -- (434.7404pt,48.5pt)(421.7404pt,29.5pt) -- (447.7404pt,29.5pt)(434.7404pt,48.5pt) -- (421.7404pt,63.5pt)(434.7404pt,48.5pt) -- (447.7404pt,63.5pt);
\draw[pstyle3] (218.9152pt,126.0519pt) -- (228.5952pt,130.7739pt) -- (218.329pt,134.0304pt) -- (222.6114pt,130.3343pt) -- cycle;
\draw[pstyle4] (26.45pt,115.7739pt) -- (228.5952pt,130.7739pt);
\node at (33.45pt,96.0679pt)[below right,color=black]{saisir("Le chat")};
\draw[pstyle3] (37.13pt,172.7579pt) -- (27.45pt,177.4799pt) -- (37.7162pt,180.7364pt) -- (33.4339pt,177.0403pt) -- cycle;
\draw[pstyle4] (229.5952pt,162.4799pt) -- (26.45pt,177.4799pt);
\node at (43.45pt,142.7739pt)[below right,color=black]{lire("Le chat")};
\draw[pstyle3] (423.0604pt,172.7579pt) -- (432.7404pt,177.4799pt) -- (422.4742pt,180.7364pt) -- (426.7566pt,177.0403pt) -- cycle;
\draw[pstyle4] (230.5952pt,162.4799pt) -- (432.7404pt,177.4799pt);
\node at (237.5952pt,142.7739pt)[below right,color=black]{lire("Le chat")};
\draw[pstyle3] (241.2752pt,219.4639pt) -- (231.5952pt,224.186pt) -- (241.8615pt,227.4424pt) -- (237.5791pt,223.7463pt) -- cycle;
\draw[pstyle4] (433.7404pt,209.186pt) -- (230.5952pt,224.186pt);
\node at (247.5952pt,189.4799pt)[below right,color=black]{saisir(" mange")};
\draw[pstyle3] (219.0329pt,224.23pt) -- (228.5952pt,229.186pt) -- (218.2529pt,232.1919pt) -- (222.6238pt,228.601pt) -- cycle;
\draw[pstyle4] (26.45pt,209.186pt) -- (228.5952pt,229.186pt);
\node at (33.45pt,189.4799pt)[below right,color=black]{saisir(" boit")};
\draw[pstyle3] (37.13pt,271.1699pt) -- (27.45pt,275.892pt) -- (37.7162pt,279.1484pt) -- (33.4339pt,275.4523pt) -- cycle;
\draw[pstyle4] (229.5952pt,260.892pt) -- (26.45pt,275.892pt);
\node at (43.45pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
\draw[pstyle3] (423.0604pt,271.1699pt) -- (432.7404pt,275.892pt) -- (422.4742pt,279.1484pt) -- (426.7566pt,275.4523pt) -- cycle;
\draw[pstyle4] (230.5952pt,260.892pt) -- (432.7404pt,275.892pt);
\node at (237.5952pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
\end{tikzpicture}

View File

@ -0,0 +1,22 @@
@startuml localiteEtatFail
Bob -> Bob : inserer("Hello World")
Bob -> Bob : afficher() -> "Hello World"
Bob -> Alice : partager("Hello World")
!pragma teoz true
Alice -> Alice : afficher() : "Hello World"
Alice -> Alice : souligner("Hello World")
& Bob -> Bob : supprimer("Hello World", " World")
Alice -> Alice : afficher() : "__Hello World__"
& Bob -> Bob : afficher() : "Hello"
Alice ->(25) Bob : \t\t partager("__Hello World__")\n
& Bob ->(25) Alice : partager("Hello")
Bob -> Bob : afficher() -> "__Hello World__"
& Alice -> Alice : afficher() -> "__Hello__"
@enduml

View File

@ -0,0 +1,76 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{226,226,240}
\definecolor{plantucolor0002}{RGB}{0,0,0}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,line width=1.0pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (27.3692pt,39.0679pt) -- (27.3692pt,431.4221pt);
\draw[pstyle0] (295.551pt,39.0679pt) -- (295.551pt,431.4221pt);
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (44.7385pt,5pt) arc (270:360:5pt) -- (49.7385pt,10pt) -- (49.7385pt,33.0679pt) arc (0:90:5pt) -- (44.7385pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
\node at (12pt,12pt)[below right,color=black]{Bob};
\draw[pstyle1] (270.101pt,10pt) arc (180:270:5pt) -- (275.101pt,5pt) -- (316.001pt,5pt) arc (270:360:5pt) -- (321.001pt,10pt) -- (321.001pt,33.0679pt) arc (0:90:5pt) -- (316.001pt,38.0679pt) -- (275.101pt,38.0679pt) arc (90:180:5pt) -- (270.101pt,33.0679pt) -- cycle;
\node at (277.101pt,12pt)[below right,color=black]{Alice};
\draw[pstyle1] (5pt,436.4221pt) arc (180:270:5pt) -- (10pt,431.4221pt) -- (44.7385pt,431.4221pt) arc (270:360:5pt) -- (49.7385pt,436.4221pt) -- (49.7385pt,459.49pt) arc (0:90:5pt) -- (44.7385pt,464.49pt) -- (10pt,464.49pt) arc (90:180:5pt) -- (5pt,459.49pt) -- cycle;
\node at (12pt,438.4221pt)[below right,color=black]{Bob};
\draw[pstyle1] (270.101pt,436.4221pt) arc (180:270:5pt) -- (275.101pt,431.4221pt) -- (316.001pt,431.4221pt) arc (270:360:5pt) -- (321.001pt,436.4221pt) -- (321.001pt,459.49pt) arc (0:90:5pt) -- (316.001pt,464.49pt) -- (275.101pt,464.49pt) arc (90:180:5pt) -- (270.101pt,459.49pt) -- cycle;
\node at (277.101pt,438.4221pt)[below right,color=black]{Alice};
\draw[pstyle2] (27.3692pt,70.7739pt) -- (69.3692pt,70.7739pt);
\draw[pstyle2] (69.3692pt,70.7739pt) -- (69.3692pt,83.7739pt);
\draw[pstyle2] (28.3692pt,83.7739pt) -- (69.3692pt,83.7739pt);
\draw[pstyle3] (38.3692pt,79.7739pt) -- (28.3692pt,83.7739pt) -- (38.3692pt,87.7739pt) -- (34.3692pt,83.7739pt) -- cycle;
\node at (34.3692pt,51.0679pt)[below right,color=black]{inserer("Hello World")};
\draw[pstyle2] (27.3692pt,115.4799pt) -- (69.3692pt,115.4799pt);
\draw[pstyle2] (69.3692pt,115.4799pt) -- (69.3692pt,128.4799pt);
\draw[pstyle2] (28.3692pt,128.4799pt) -- (69.3692pt,128.4799pt);
\draw[pstyle3] (38.3692pt,124.4799pt) -- (28.3692pt,128.4799pt) -- (38.3692pt,132.4799pt) -- (34.3692pt,128.4799pt) -- cycle;
\node at (34.3692pt,95.7739pt)[below right,color=black]{afficher() -\textgreater "Hello World"};
\draw[pstyle3] (283.551pt,156.186pt) -- (293.551pt,160.186pt) -- (283.551pt,164.186pt) -- (287.551pt,160.186pt) -- cycle;
\draw[pstyle2] (27.3692pt,160.186pt) -- (289.551pt,160.186pt);
\node at (34.3692pt,140.4799pt)[below right,color=black]{partager("Hello World")};
\draw[pstyle2] (295.551pt,191.892pt) -- (337.551pt,191.892pt);
\draw[pstyle2] (337.551pt,191.892pt) -- (337.551pt,204.892pt);
\draw[pstyle2] (296.551pt,204.892pt) -- (337.551pt,204.892pt);
\draw[pstyle3] (306.551pt,200.892pt) -- (296.551pt,204.892pt) -- (306.551pt,208.892pt) -- (302.551pt,204.892pt) -- cycle;
\node at (302.551pt,172.186pt)[below right,color=black]{afficher() : "Hello World"};
\draw[pstyle2] (295.551pt,236.598pt) -- (337.551pt,236.598pt);
\draw[pstyle2] (337.551pt,236.598pt) -- (337.551pt,249.598pt);
\draw[pstyle2] (296.551pt,249.598pt) -- (337.551pt,249.598pt);
\draw[pstyle3] (306.551pt,245.598pt) -- (296.551pt,249.598pt) -- (306.551pt,253.598pt) -- (302.551pt,249.598pt) -- cycle;
\node at (302.551pt,216.892pt)[below right,color=black]{souligner("Hello World")};
\draw[pstyle2] (27.3692pt,236.598pt) -- (69.3692pt,236.598pt);
\draw[pstyle2] (69.3692pt,236.598pt) -- (69.3692pt,249.598pt);
\draw[pstyle2] (28.3692pt,249.598pt) -- (69.3692pt,249.598pt);
\draw[pstyle3] (38.3692pt,245.598pt) -- (28.3692pt,249.598pt) -- (38.3692pt,253.598pt) -- (34.3692pt,249.598pt) -- cycle;
\node at (34.3692pt,216.892pt)[below right,color=black]{supprimer("Hello World", " World")};
\draw[pstyle2] (295.551pt,281.304pt) -- (337.551pt,281.304pt);
\draw[pstyle2] (337.551pt,281.304pt) -- (337.551pt,294.304pt);
\draw[pstyle2] (296.551pt,294.304pt) -- (337.551pt,294.304pt);
\draw[pstyle3] (306.551pt,290.304pt) -- (296.551pt,294.304pt) -- (306.551pt,298.304pt) -- (302.551pt,294.304pt) -- cycle;
\node at (302.551pt,261.598pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
\draw[pstyle2] (27.3692pt,281.304pt) -- (69.3692pt,281.304pt);
\draw[pstyle2] (69.3692pt,281.304pt) -- (69.3692pt,294.304pt);
\draw[pstyle2] (28.3692pt,294.304pt) -- (69.3692pt,294.304pt);
\draw[pstyle3] (38.3692pt,290.304pt) -- (28.3692pt,294.304pt) -- (38.3692pt,298.304pt) -- (34.3692pt,294.304pt) -- cycle;
\node at (34.3692pt,261.598pt)[below right,color=black]{afficher() : "Hello"};
\draw[pstyle3] (37.9548pt,363.8051pt) -- (28.3692pt,368.716pt) -- (38.6973pt,371.7706pt) -- (34.3433pt,368.1591pt) -- cycle;
\draw[pstyle2] (294.551pt,343.716pt) -- (27.3692pt,368.716pt);
\node at (44.3692pt,306.304pt)[below right,color=black]{\qquad\qquad\qquad\qquad\qquad\qquad\qquad partager("\underline{Hello World}")};
\node at (44.3692pt,324.01pt)[below right,color=black]{ };
\draw[pstyle3] (283.9655pt,363.8051pt) -- (293.551pt,368.716pt) -- (283.2229pt,371.7706pt) -- (287.577pt,368.1591pt) -- cycle;
\draw[pstyle2] (27.3692pt,343.716pt) -- (293.551pt,368.716pt);
\node at (34.3692pt,324.01pt)[below right,color=black]{partager("Hello")};
\draw[pstyle2] (27.3692pt,400.4221pt) -- (69.3692pt,400.4221pt);
\draw[pstyle2] (69.3692pt,400.4221pt) -- (69.3692pt,413.4221pt);
\draw[pstyle2] (28.3692pt,413.4221pt) -- (69.3692pt,413.4221pt);
\draw[pstyle3] (38.3692pt,409.4221pt) -- (28.3692pt,413.4221pt) -- (38.3692pt,417.4221pt) -- (34.3692pt,413.4221pt) -- cycle;
\node at (34.3692pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
\draw[pstyle2] (295.551pt,400.4221pt) -- (337.551pt,400.4221pt);
\draw[pstyle2] (337.551pt,400.4221pt) -- (337.551pt,413.4221pt);
\draw[pstyle2] (296.551pt,413.4221pt) -- (337.551pt,413.4221pt);
\draw[pstyle3] (306.551pt,409.4221pt) -- (296.551pt,413.4221pt) -- (306.551pt,417.4221pt) -- (302.551pt,413.4221pt) -- cycle;
\node at (302.551pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello}"};
\end{tikzpicture}

View File

@ -0,0 +1,25 @@
@startuml serialized
!pragma teoz true
hide footbox
participant Alice
participant Server
participant Bob
Alice ->(10) Server : lock()
Server -->(10) Alice : true
Bob -> Server : lock()
& Alice ->(10) Server : inserer("hello world")
Server -->(10) Bob : false
& Alice ->(10) Server : lire()
Server -->(10) Alice : "hello world"
Alice -> Server : unlock()
Bob -> Server : lock()
Bob -> Server : lire()
Server -->(10) Bob : "hello world"
Bob -> Server : unlock()
@enduml

View File

@ -0,0 +1,57 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{226,226,240}
\definecolor{plantucolor0002}{RGB}{0,0,0}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle3/.style={color=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt,dash pattern=on 2.0pt off 2.0pt}
]
\draw[pstyle0] (30.45pt,39.0679pt) -- (30.45pt,434.1281pt);
\draw[pstyle0] (210.5241pt,39.0679pt) -- (210.5241pt,434.1281pt);
\draw[pstyle0] (328.7611pt,39.0679pt) -- (328.7611pt,434.1281pt);
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (50.9pt,5pt) arc (270:360:5pt) -- (55.9pt,10pt) -- (55.9pt,33.0679pt) arc (0:90:5pt) -- (50.9pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
\node at (12pt,12pt)[below right,color=black]{Alice};
\draw[pstyle1] (177.9423pt,10pt) arc (180:270:5pt) -- (182.9423pt,5pt) -- (238.1059pt,5pt) arc (270:360:5pt) -- (243.1059pt,10pt) -- (243.1059pt,33.0679pt) arc (0:90:5pt) -- (238.1059pt,38.0679pt) -- (182.9423pt,38.0679pt) arc (90:180:5pt) -- (177.9423pt,33.0679pt) -- cycle;
\node at (184.9423pt,12pt)[below right,color=black]{Server};
\draw[pstyle1] (306.3919pt,10pt) arc (180:270:5pt) -- (311.3919pt,5pt) -- (346.1303pt,5pt) arc (270:360:5pt) -- (351.1303pt,10pt) -- (351.1303pt,33.0679pt) arc (0:90:5pt) -- (346.1303pt,38.0679pt) -- (311.3919pt,38.0679pt) arc (90:180:5pt) -- (306.3919pt,33.0679pt) -- cycle;
\node at (313.3919pt,12pt)[below right,color=black]{Bob};
\draw[pstyle2] (198.7612pt,76.2256pt) -- (208.5241pt,80.7739pt) -- (198.3177pt,84.2133pt) -- (202.5333pt,80.4412pt) -- cycle;
\draw[pstyle3] (30.45pt,70.7739pt) -- (208.5241pt,80.7739pt);
\node at (37.45pt,51.0679pt)[below right,color=black]{lock()};
\draw[pstyle2] (41.2128pt,117.9316pt) -- (31.45pt,122.4799pt) -- (41.6564pt,125.9193pt) -- (37.4408pt,122.1473pt) -- cycle;
\draw[pstyle4] (209.5241pt,112.4799pt) -- (30.45pt,122.4799pt);
\node at (47.45pt,92.7739pt)[below right,color=black]{true};
\draw[pstyle2] (221.5241pt,150.186pt) -- (211.5241pt,154.186pt) -- (221.5241pt,158.186pt) -- (217.5241pt,154.186pt) -- cycle;
\draw[pstyle3] (215.5241pt,154.186pt) -- (327.7611pt,154.186pt);
\node at (227.5241pt,134.4799pt)[below right,color=black]{lock()};
\draw[pstyle2] (198.7612pt,159.6376pt) -- (208.5241pt,164.186pt) -- (198.3177pt,167.6253pt) -- (202.5333pt,163.8533pt) -- cycle;
\draw[pstyle3] (30.45pt,154.186pt) -- (208.5241pt,164.186pt);
\node at (37.45pt,134.4799pt)[below right,color=black]{inserer("hello world")};
\draw[pstyle2] (317.1338pt,201.0635pt) -- (326.7611pt,205.892pt) -- (316.4596pt,209.035pt) -- (320.7825pt,205.3863pt) -- cycle;
\draw[pstyle4] (210.5241pt,195.892pt) -- (326.7611pt,205.892pt);
\node at (217.5241pt,176.186pt)[below right,color=black]{false};
\draw[pstyle2] (198.7612pt,201.3437pt) -- (208.5241pt,205.892pt) -- (198.3177pt,209.3314pt) -- (202.5333pt,205.5593pt) -- cycle;
\draw[pstyle3] (30.45pt,195.892pt) -- (208.5241pt,205.892pt);
\node at (37.45pt,176.186pt)[below right,color=black]{lire()};
\draw[pstyle2] (41.2128pt,243.0497pt) -- (31.45pt,247.598pt) -- (41.6564pt,251.0374pt) -- (37.4408pt,247.2653pt) -- cycle;
\draw[pstyle4] (209.5241pt,237.598pt) -- (30.45pt,247.598pt);
\node at (47.45pt,217.892pt)[below right,color=black]{"hello world"};
\draw[pstyle2] (198.5241pt,275.304pt) -- (208.5241pt,279.304pt) -- (198.5241pt,283.304pt) -- (202.5241pt,279.304pt) -- cycle;
\draw[pstyle3] (30.45pt,279.304pt) -- (204.5241pt,279.304pt);
\node at (37.45pt,259.598pt)[below right,color=black]{unlock()};
\draw[pstyle2] (221.5241pt,307.01pt) -- (211.5241pt,311.01pt) -- (221.5241pt,315.01pt) -- (217.5241pt,311.01pt) -- cycle;
\draw[pstyle3] (215.5241pt,311.01pt) -- (327.7611pt,311.01pt);
\node at (227.5241pt,291.304pt)[below right,color=black]{lock()};
\draw[pstyle2] (221.5241pt,338.716pt) -- (211.5241pt,342.716pt) -- (221.5241pt,346.716pt) -- (217.5241pt,342.716pt) -- cycle;
\draw[pstyle3] (215.5241pt,342.716pt) -- (327.7611pt,342.716pt);
\node at (227.5241pt,323.01pt)[below right,color=black]{lire()};
\draw[pstyle2] (317.1338pt,379.5935pt) -- (326.7611pt,384.4221pt) -- (316.4596pt,387.5651pt) -- (320.7825pt,383.9164pt) -- cycle;
\draw[pstyle4] (210.5241pt,374.4221pt) -- (326.7611pt,384.4221pt);
\node at (217.5241pt,354.716pt)[below right,color=black]{"hello world"};
\draw[pstyle2] (221.5241pt,412.1281pt) -- (211.5241pt,416.1281pt) -- (221.5241pt,420.1281pt) -- (217.5241pt,416.1281pt) -- cycle;
\draw[pstyle3] (215.5241pt,416.1281pt) -- (327.7611pt,416.1281pt);
\node at (227.5241pt,396.4221pt)[below right,color=black]{unlock()};
\end{tikzpicture}

View File

@ -10,6 +10,13 @@
\usepackage{biblatex} \usepackage{biblatex}
\addbibresource{../../recherches/Stage.bib} \addbibresource{../../recherches/Stage.bib}
\usepackage{tikz}
\usepackage{aeguill}
\usepackage{amsmath}
\usepackage{multicol}
\begin{document} \begin{document}
\title{Critères de Cohérence faible byzantine appliquée aux environements cloud} \title{Critères de Cohérence faible byzantine appliquée aux environements cloud}
@ -34,6 +41,9 @@
\section{Introduction} \section{Introduction}
\input{intro/index.tex} \input{intro/index.tex}
\section{Cohérence Forte}
\input{coherence_forte/index.tex}
\section{Les critères de cohérence} \section{Les critères de cohérence}
\input{consistency_criteria/index.tex} \input{consistency_criteria/index.tex}

View File

@ -0,0 +1,34 @@
Les CRDT sont des types de données qui supporte de manière intrinsèque les critères de convergence (Strong Eventual Consistency) et de cohérence pipeline (qui est un compromis entre la validité et la Localité d'état).
Pour y parvenir, un type de donnée dit CRDT doit proposer une bibliothèque d'opérations qui sont commutatives l'une à l'autre. Ainsi pour deux suites d'opérations $S$ et $S'$, soit $L$ l'ensemble contenant tous les termes de $S$ et $L'$ l'ensemble contenant tous les termes de $S'$. Si $L$ et $L'$ sont indiscernables, alors les résultats de $S$ et $S'$ l'est aussi. [REF CRDT]
Ces types de données présentent un très grand intérêt pour le problème de l'édition collaborative. En effet, ils permettent de mettre en place des approches qui sont dites local-first. C'est à dire que les modifications sont dans un premier temps appliquées localement au client, pour ensuite être éventuellement fusionnées, sans avoir à gérer d'hypothétiques conflits (puisque le type de donnée ne le permet pas).
Cette approche est déjà utilisée par certains projets déjà en production, notamment à travers le protocole YATA [REF YATA] qui trouve son implémentation dans l'application Yjs. Yjs est une application de prise de note, d'organisation et de productivité utilisant des CRDT, ce qui lui permet d'être résilient aux pannes réseaux et de permettre une synchronisation entre plusieurs terminaux pour un seul client sans utiliser d'entité centrale. Cette solution apporte toutefois une limite, qui est le manque de clarté dans l'expérience utilisateur sur ce qui est synchronisé et ce qui ne l'est pas. Ce comportement est toute fois intrinsèque au design de l'application est relève d'un compromis technique.
L'usage des CRDT dans Yjs est toutefois assez limité, puisque proposant une application "un seul utilisateur". Et pour cause, l'ajout de plusieurs utilisateurs introduit une nouvelle problématique qui est celle des droits d'accès et d'édition.
Dans l'approche d'Yjs, rien de ce que peut soumettre l'utilisateur ne peut provoquer d'état illégal. Puisque par définition TOUT est accepté. De plus, aucun comportement arbitraire et malveillant n'a à être envisagé puisqu'une nouvelle fois, il n'y a pas de notion de malveillance.
Mais si Yjs fait ce choix, c'est parce que les CRDT passe très mal l'épreuve du problème des généraux byzantins. Le problème des généraux byzantin est un problème connu en algorithmie distribuée. Il vise à introduire dans notre système des noeuds aux comportements arbitraires. C'est à dire des noeuds qui dévieraient du protocole attendu afin de réaliser des actions aléatoires, imprévisibles et irrationnelles (dans le cas d'un bug dans l'implémentation par exemple), ou bien des actions malveillantes et donc rationnels (dans le cas d'une attaque du protocole par un membre malveillant du réseau).
% En effet les CRDT ne proposent aucun mécanisme permettant de mitiger les actions d'un attaquant. Reprenons l'exemple d'Yjs, qui ne définit pas de notion d'état illégal. Ceci est du au fait que pour satisfaire les propriétés des CRDT, le choix de YATA est d'utiliser un "grow only set". C'est à dire une structure de donnée qui ne peut que s'agrandir. La seule opération possible est donc l'insertion d'un élement, facilitant ainsi la commutativité des opérations, Et la suppression y est traitée comme une opération spécifique d'insertion du point de vue de la structure de donnée, la donnée ne disparait donc pas, mais se voit attribuer un "marqueur" qui la rend invisible.
% Ainsi la notion de légalité dans un grow only set n'existe pas puisque toutes les suites d'opérations sont valides. Or si Bob tente d'insérer dans une zone de texte où seule Alice a le droit en écriture, il est attendu que l'opération soit rejetée. Ce qui n'a pas de sens dans un grow only set, et empêcherait la convergence des états à la fin de l'exécution.
% Pour palier à ce problème, l'approche du PCDO
Notamment un problème connu qui est celui de l'équivocation. L'équivocation est le fait pour un noeud malveillant devant normalement envoyer une information à l'ensemble des noeuds d'un réseau distribué, d'envoyer une opération $A$ à une partie du réseau et une opération $B$ à l'autre partie. Créant ainsi une divergence dans les suites d'opérations que maintiennent chaque partie concernée du réseau.
Plusieurs papiers tendent à montrer qu'une certaine classe de CRDT peut être améliorée afin de mitiger ce problème. Une approche intéressante consiste en la mise en place d'un DAG (un graph dirigé acyclique) stockant tous les états atteints par le réseau ainsi que leurs parents. Et d'accrocher une trace de ce DAG à l'opération qui est envoyé aux autres noeuds. Ainsi l'ensemble des noeuds légitimes seraient en capacité de détecter si leur propre DAG manque d'information, et seraient donc à même de redemander l'information manquante. [REF MEG22] Cette solution proposerait ainsi un mécanisme de resynchronisation entre noeuds légitimes.
Un autre aspect limitant des CRDT est qu'ils ne conviennent pas à tous les types d'applications. En effet, de par leur aspect commutatif, ils ne peuvent opérer que sur des données qui ne présentent pas de notion d'états illégaux. Prenons le cas d'un compteur sur lequel nous pouvons appliquer des opérations d'additions ou de soustractions (et qui sont donc commutatives les unes avec les autres). Peu importe si nous appliquons toutes les soustractions puis toutes les additions, ou bien l'inverse, ou encore un mélange aléatoire de celles-ci. Le compteur qui se verra évoluer au fil du temps n'entrera jamais dans un état "interdit".
Or, dans beaucoup d'application nous avons besoin de restreindre la donnée à un ensemble d'état dits valides. Et d'interdire un ensemble d'état dits invalides. Ce serait le cas dans le traitement d'un solde d'une carte de débit. L'utilisateur peut soumettre un ensemble d'opérations qui vont venir débiter ou créditer la carte. Mais même si l'utilisateur ne cherche pas à dépenser de l'argent qu'il ne possède pas, nous ne pouvons pas appliquer les opérations dans tous les ordres possibles. Par exemple si toutes les opérations de débit sont soumises les unes après les autres, le solde se trouvera en négatif ce qui n'est pas permis, même pour un état qu'on pourrait qualifier de "temporaire".
C'est pour palier à ce problème que Reynal [REF Raynal 23] propose un nouveau type de donnée qui hérite des CRDT et qu'il nomme PCDO (Process-Commutative Distributed Objects). cette solution améliore les CRDT pour proposer un type de donnée empêchant l'atteinte d'état illégaux. Pour ce faire il divise les opérations possibles en deux groupe. Les opérations qui sont réalisables par tous les membres du réseau, et les opérations qui sont spécifiques à un acteur. Il définit alors deux règles. Les opérations communes ne doivent jamais permettre d'atteindre un état illégal. Et seule l'application de plusieurs opérations spécifique à un seul processus permet d'atteindre un état illégal.
Cette solution contraint en réalité l'usage des CRDT, puisqu'elle semble reposer sur la mise en place de plusieurs registres SWMR (Single Writer Multiple Reader) comme théorisé par Lamport en 198X [REF LAMPORT SWMR]. Cette approche ne posant en effet aucun problême de cohérence sur le registre en tant que tel, puisque l'ordre est défini par le seul noeud capable d'édition. La somme de ses registres propose par contre une cohérence partielle, puisque les opérations se retrouvent ordonnées via un ordre lui-même partiel.
Le contre coüt est donc dans la généralisation de ce type de donnée, puisqu'il demande à ce que l'application découpe la donnée partagée en plusieurs registres SWMR ce qui n'est pas applicable dans tous les contextes.
Pour ces raisons, l'application des CRDTs pour l'édition collaborative n'est pas évidente. Puisque dans un contexte multi-utilisateur avec des politiques de contrôle d'accès au document (et dans le corps du document), les CRDT se retrouvent peu résistantes aux problématiques d'édition malveillante. De plus, l'application des CRDT à l'édition collaborative ne résout pas tous les problèmes de résolutions de conflits, et certains cas de figure peuvent encore causer des incohérences et à terme des divergences importantes dans le document final.

View File

@ -0,0 +1,125 @@
La cohérence forte présente, dans un premier temps, lapproche la plus intuitive pour une application collaborative dans le cloud.
Cherchons dans un premier temps à répliquer un processus dédition local dun document. Formalisons alors ce quon attend dune application dédition de document seulement local.
Nous avons un acteur qui va réaliser deux types dactions différentes, la lecture ou lécriture dun document. Ces opérations sont des opérations atomiques du point de vue de lutilisateur et il ne peut les exécuter que lune après lautre. Dans notre manière dappréhender ce modèle nous partons du principe que lécriture nimplique pas nécessairement une lecture, forçant ainsi lacteur à soumettre une opération de lecture pour pouvoir vérifier que son opération décriture a bien été prise en compte. Ce point est important puisque la cohérence du point de vue de lutilisateur sera conditionné par ces opérations de lecture.
Lapplication de ce modèle sur un seul acteur résultera donc en une suite finit dopérations décritures et de lectures, pour terminer par une suite de lecture infinies (qui est le moment où lutilisateur arrête déditer le document).
\begin{math}
w('he') \cdot r/\{'he'\} \cdot w('llo') \cdot r/\{'hello'\}^\omega
\end{math}
\begin{figure}[! h]
\centering
\resizebox{0.5\columnwidth}{!}{
\input{images/local1_tzk.tex}
}
\caption{Modification local d'un document}
\label{local_1}
\end{figure}
On voit sur la figure \ref{local_1} que le noeud émet deux requêtes atomiques de modification $w('h')$ et $w('e')$ (regroupées sous la forme d'une seule pour soucis de lisibilité). Il réalise ensuite une requête de lecture $r/\{'h','e'\}$ qui lui permet de vérifier que ses modifications ont bien été prises en compte. Puis il écrit $w('llo')$ et récupère un retour en lisant $r/\{'h','e','l','l','o'\}$ qui lui permet de vérifier que ses modifications ont bien été prises en compte. Il réalise ensuite une suite infinie de lecture $r/\{'h','e','l','l','o'\}^\omega$ correspondant à la consultation du document sur un temps infini.
Cette modélisation nous permet de mettre en avant les points critiques dans la mise en place d'une expérience cohérente pour l'utilisateur. Dans un premier temps nous pouvons nous concentrer sur le lien entre les écritures et les lectures :
Lorsque l'utilisateur soumet les écritures $w('h')$ et $w('e')$ il lui attribue une notion d'ordre. L'écriture de $w('h')$ est donc antérieur à celle de $w('e')$, il serait donc incohérent que au moment de la lecture qui suit, l'utilisateur constate un ordre différent. Cela représente une première propriété de la cohérence séquentielle, la préservation de l'ordre entre les écritures.
Une seconde propriété est la préservation de la validité des écritures. C'est-à-dire que si l'utilisateur soumet une écriture $w('h')$ et une écriture $w('e')$ il s'attend à ce que la lecture qui suit retourne un état qui contient uniquement $'h'$ et $'e'$. Il serait en effet incohérent de recevoir tout autre état.
La troisième propriété est la préservation de la cohérence entre les lectures, c'est-à-dire que si l'utilisateur lit à un instant $t$ un état $\alpha$, alors toutes lectures réalisées à un instant $t' > t$ doivent retourner un état $\beta$ tel que $\alpha \subseteq \beta$.
Ces trois propriétés sont celles définit par Lamport [REF LAMPORT89] et permettent de définir ce qu'il nomme "registre atomique".
\fbox{
\begin{minipage}{0.94\linewidth}
\paragraph{Un registre}
est une structure mathématique qui sert d'abstraction pour parler d'un système qui permet de réaliser des opérations d'écritures et de lectures. L'approche du registre permet de se concentrer sur le point de vue d'un client sans considérer les aspects topologiques du système. Il est donc tout trouvé pour spécifier les problématiques liées à la cohérence dans les systèmes distribués.
\end{minipage}
}
Le registre atomique de lamport permet de définir le comportement attendu dans un système SWMR (Single Writer Multiple Reader). C'est-à-dire un système où un seul acteur peut écrire et plusieurs peuvent lire. Ce modèle est pertinent dans notre cas d'édition à un seul acteur puisque nous avons un acteur qui écrit et un acteur qui lit (en l'occurrence toujours le même).
\emph{TODO : Résumer papier Lamport89}
Dans un cas dusage courant, une application dédition local ne présente pas de problèmes liés à la présence de plusieurs éditeurs en simultanés. Il y a en effet une seule interface homme-machine, cest-à-dire de façon pragmatique un unique écran et clavier.
Imaginons ainsi un cas où Alice et Bob souhaitent éditer ensemble un même document. Si on voulait simplement appliquer le fonctionnement local que nous venons de décrire à cette nouvelle problématique. Il conviendrait de simplement rajouter une IHM à Alice. Ainsi il y a toujours une seule application dédition collaborative sur lequel viennent se connecter cette fois-ci deux interfaces (comme visible dans la figure \ref{local_2}).
\begin{figure}[! h]
\begin{multicols}{2}
\centering
\resizebox{!}{.7\columnwidth}{
\input{images/local2.latex}
}
\caption{Alice et Bob éditent un document localement}
\label{local_2}
\columnbreak
\centering
\resizebox{!}{.8\columnwidth}{
\input{images/local2fail.latex}
}
\caption{Alice et Bob éditent un document localement de manière concurrente}
\label{local_2_fail}
\end{multicols}
\end{figure}
Nous avons à présents deux acteurs qui éditent et lisent le document, et un autre qui soccupe de stocker et de synchroniser le document entre ces deux acteurs.
La limite liée à cette approche réside dans le fait que les communications entre Alice et lapplication et Bob et lapplication ne peuvent pas être garantis comme équitables. En effet, Alice et Bob peuvent très bien se retrouver déconnectés de manière non prévisible et asynchrone. Ou bien avoir des temps de transmissions de leurs informations qui diffèrent. Le caractère non-deterministe de ces erreurs peut résulter en des incohérences dans lordre darrivée des informations soumises par Alice et Bob. Ce qui peut a terme créer des incohérences dans le document final.
Cest néanmoins une problématique qui peut être assimilée à de la gestion de la concurrence entre processus. Cest en effet un domaine qui est étudié depuis lapparition des premiers processeurs multi-cœur. Une approche que nous pouvons donc prendre à la programmation concurrente serait de résoudre ce problème en venant utiliser des techniques de synchronisation de processus. Cest-à-dire en utilisant des mécanismes de synchronisation tel que des verrous dans notre application. On peut par exemple utiliser des sémaphores pour gérer les accès concurrents à la mémoire partagée. Ce qui résulterait en lexécution suivante :
\begin{figure}[! h]
\centering
\resizebox{!}{.7\columnwidth}{
\input{images/serialized.latex}
}
\caption{Alice et Bob éditent un document localement avec des vérrous}
\label{serialized}
\end{figure}
On voit sur la figure \ref{serialized} que les actions dAlice et Bob sont sérialisés. Cest-à-dire que les actions dAlice et Bob sont exécutés lune après lautre. Ce qui permet déviter les problèmes de concurrence entre les deux acteurs. Cependant, cette approche est très limitée. En effet, elle ne permet pas de profiter des avantages de lédition collaborative. En effet, cela signifie que lun des deux acteurs doit attendre que lautre ait fini déditer le document pour pouvoir à son tour léditer. Ce qui rabaisse les performances de lapplication à la latence de lacteur le plus lent.
En revenons dans notre contexte initial qui est une application dédition collaborative nous souhaitons pouvoir gérer un grand nombre dutilisateur en simultanés. Ainsi la probabilité davoir une expérience dégradée pour lensemble des utilisateurs croit avec le nombre dutilisateur. Pour pallier à ce problème lapproche qui peut être adopté est dexclure les utilisateurs possédant des connexions trop limités avec le serveur.
Cest néanmoins la seule approche qui nous permet dobtenir une cohérence absolue autant dans la prise en compte des opérations décritures des acteurs que dans le traitement de leurs lectures.
Selon Perrin on se placerait dans une approche qui relèverait de la cohérence séquentielle.
\subsection{Cohérence séquentielle}
% blbla sur la cohérence séquentielle de manière très théorique et fondamentale
\paragraph{Validité}
Dans une application dédition collaborative on sattend à ce que toutes les entrées des utilisateurs soient prises en compte. Il nous parait en effet inacceptable que des saisies disparaisses de manière aléatoire durant lexécution.
Ce principe nous permet dintroduire une première propriété utilisée par Perrin pour définir et classer les différents critères de cohérence quest la validité.
La validité peut ainsi être résumé comme la propriété qui permet dassurer que toutes les saisies réalisées, et seulement elles, soient prises en compte dans lexécution du système.
Ceci se traduit par laffichage dun retour quant à la saisie de bob sur son application. Lui signifiant que son interaction avec lapplication à bien était prise en compte, et nest donc pas passée à la trappe. Elle nimplique néanmoins aucune notion dordre dans les saisies, ce qui signifie que les saisies peuvent être réagencées durant lexécution.
\paragraph{Convergence}
Une autre attente dune application dédition collaborative est en quelque sorte sont determinisme sur une durée infinie. On sattend en effet, une fois toutes les éditions terminés, que le document soit identique pour tous les acteurs. Cest-à-dire que peut importe lordre dans lequel les saisies ont été réalisées, le document final doit être identique pour tous les nœuds.
Cest ce que Perrin appelle la convergence quil définit plus formellement comment étant la propriété qui assure que si un nombre finit decriture et infini de lecture sont réaliséés, alors tous les nœuds finissent par avoir la même valeur.
\paragraph{Localité Détat}
La dernière propriétée du model de Perrin est la localité détat.
Elle consiste en le fait que chaque acteur doivent garder une vision local cohérente du système. Par exemple, comme illustrée dans la Figure \ref{local_state}, au fur et à mesure des éditions de Bob, sa vue local va évoluer en conséquence, mais si il recoit à un moment donné une édition dAlice qui est antérieur à une de ses éditions, alors il doit privilégier sa propre édition. Cest-à-dire que sa vue local doit être cohérente avec son historique dédition quitte à diverger de la vue local dAlice.
\begin{figure}[! h]
\caption{Localité détat}
\label{local_state}
\end{figure}

View File

@ -0,0 +1,70 @@
Nous venons de définir la cohérence séquentielle et de proposer une approche pour la réaliser. Néanmoins nous avons vu que cette approche est limitée puisquelle pousse le système à être nivelé par le bas en sadaptant à lacteur le plus lent.
Nous allons donc explorer dautres approches réalisant plus de compromis dans la gestion de la cohérence du système.
Ainsi là où la cohérence séquentielle (et par extension la cohérence forte) permettait de garantir nos 3 propriété que sont la validité, la convergence et la localité détat. Nous allons explorer des solutions qui certaines de ces propriétés afin de gagner en performance et en résilience.
\subsection{Adaptation à notre problème}
Dans le cadre de notre problématique il convient dans un premier temps de spécifier quels sont les critères qui semblent être essentiels à la réalisation dune application dédition collaborative. Pour ça nous pouvons déjà imaginer ce quimpliquent concrètement ces différents critères sur le comportement de notre application.
\subsubsection{Validité}
Comme dit précédemment, la validité permet dassurer que les saisies de Bob soient toujours prises en compte en tout point du système. Cest-à-dire que si Bob saisit “Hello” puis “World” alors il sattend à ce que ces deux saisies soient prises en compte. Ce qui se traduit par laffichage de « Hello World » ou « World Hello sur son écran. Les états finaux incorrects qui ne respecterait pas la validité sont alors “Hello”, “World” ou "$\emptyset$".
De la même manière, les saisies des aitres acteurs du système peuvent donc très bien être ignorés, intercalés entre les saisis de Bob, et réagencés durant lexécution.
Ne pas prendre en compte le critère de validité dans notre application reviendrait donc à être capable dignorer des saisies soumises par lutilisateur. Cest ce qui est formalisé par le critère de cohérence dit de Sérialisation (selon Perrin).
Lapplication de la validité demande à notre système une approche dacknowledgement. Puisque toutes saisies ce doit dêtre considéré, le client doit sassurer que sa saisie a bien été reçue par lensemble des nœuds. Dans le cas dune application centralisé, seul un intermédiaire doit être contacté. Mais dans un contexte plus distribué, le problème augmente en complexité et en coût pour le réseau.
\paragraph{La Sérialisation}
La sérialisation se propose donc comme étant lexact inverse de la validité, cest-à-dire un critère de cohérence fort auquel nous aurions retiré la validité. ($SER = \{C_\top\} - \{V\}$)
\subsubsection{Convergence}
La convergence permet dassurer que le document final soit identique pour tous les acteurs. Cest-à-dire que, peu importe lordre dans lequel les saisies ont été reçus par chaque nœud, le document final doit être identique pour tous.
Il est important de noter que la convergence seule ne dit rien sur la source des données qui composent le document. Ainsi il est possible que le document final ne prenne pas en compte toutes les saisies réalisées sur le système. Ou bien même quil prenne en compte des saisies qui nont jamais été réalisées.
Appliqué à notre problème, la convergence assure que le document final soit identique pour tous les acteurs, ce qui peut sembler essentiel dans notre cas.
Lapplication de la convergence introduit dans notre système une notion de gestion des conflits. Si plusieurs acteurs souhaitent écrire au même moments, alors des mécanismes doivent être mis en place pour une gestion des conflits déterministe. Cest-à-dire, permettant de garantir une seule version pour tous les acteurs quelle que soit sa position dans le système, et donc lordre potentiel de réception des saisies.
[Un exemple de gestion de conflits pas si évidente que ça]
Cette gestion des conflits peut être réalisée de manière distribuée impliquant la mise en place dun algorithme de consensus. Ce qui peut être très couteux en termes de performance et de complexité. Ou bien être délégué à un acteur centralisé qui aura le pouvoir de manipuler lordre final des saisies. Ce qui peut poser des problèmes en termes de gouvernance du système, donnant le pouvoir à un seul acteur.
Il est bon de noter que bien que la convergence est une propriété qui semble importante dans le cadre dune application dédition collaborative classique. Il existe des manières de concevoir une application collaborative fournissant un document final identique, mais ne garantissant pas nécessairement la convergence dans lordre où les saisies sont interprétées. Ce point sera discuté lorsque nous aborderons les CRDTs.
\subsubsection{Localité détat}
La localité détat permet dassurer que les mises à jour daffichages futurs soient toujours cohérentes avec les mises à jour daffichages passés. Indirectement, cela interdit le changement de lordre dans lequel les transactions passées sont interprétés une fois que le résultat est affiché à lutilisateur. Mais empêche aussi linsertion et la suppression de transactions dans ce même passé.
Lobjectif à haut niveau est de garder une expérience cohérente pour lutilisateur, en interdisant à lapplication de tolérer des retours en arrières de létat courant.
Appliqué à notre problème, la localité détat permet dassurer que les saisies de Bob et celles quil a reçu soient toujours affichés dans lordre où elles ont été interprétées initialement. Cette propriété permet par exemple dempêcher le cas où Alice traiterait la saisie de bob, bob de son côté supprime la saisie quil vient de réaliser, et Alice renvoi à Bob la saisie quelle vient de modifier. Ce cas est explicité dans la figure \ref{local_state_fail}.
\begin{figure}[! h]
\centering
\resizebox{!}{0.7\columnwidth}{
\input{images/localiteEtatFail.latex}
}
\caption{Localité détat non respectée}
\label{local_state_fail}
\end{figure}
Du point de vue de Bob, il vient de revoir apparaitre une ligne quil vient de supprimer, ce qui rend son expérience incohérente.
En effet, premièrement Bob à vue safficher sur son écran la ligne quil venait de saisir \\ $\delta = \{"Hello World"\}$ qui est le résultat de lexécution $\text{insérer}("Hello World")$. Puis il supprime le mot “World”. Le passé des exécutions de Bob devient donc $\text{insérer}("Hello World") \cdot \text{supprimer}("World") = \{"Hello"\}$. Mettant ainsi à jour son état local. Enfin il recoit lopération dAlice qui vient de réaliser une modification en se basant sur un état antérieur à létat actuel de Bob. Létat quil reçoit est donc le résultat des opérations $\text{insérer}("Hello World") \cdot \text{insérer}("Hello World") = \{"Hello World"\}$. On omet ici une opération que Bob à soumise, quil a pu constater comme étant comptabilisé dans le calcul de son état local, mais qui a ensuite été ignoré par le système. La cohérence de létat local de Bob na donc pas était respectée.
% \subsection{État des différents critères}
% \subsubsection{Les modèles de mémoires partagées}
% \subsubsection{La cohérence forte}
% Cohérence Séquentielle \cite{lamport_how_1979}
% \subsubsection{La cohérence Faible}

View File

@ -0,0 +1,43 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{0,0,0}
\definecolor{plantucolor0002}{RGB}{226,226,240}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (23pt,84.0679pt) -- (23pt,311.01pt);
\draw[pstyle0] (134.7162pt,84.0679pt) -- (134.7162pt,311.01pt);
\draw[pstyle0] (208.3289pt,84.0679pt) -- (208.3289pt,311.01pt);
\draw[pstyle0] (368.0101pt,84.0679pt) -- (368.0101pt,311.01pt);
\node at (5pt,65pt)[below right,color=black]{Bob};
\draw[pstyle1] (23.3692pt,13.5pt) ellipse (8pt and 8pt);
\draw[color=plantucolor0000,line width=0.5pt] (23.3692pt,21.5pt) -- (23.3692pt,48.5pt)(10.3692pt,29.5pt) -- (36.3692pt,29.5pt)(23.3692pt,48.5pt) -- (10.3692pt,63.5pt)(23.3692pt,48.5pt) -- (36.3692pt,63.5pt);
\draw[pstyle1] (100.7162pt,55pt) arc (180:270:5pt) -- (105.7162pt,50pt) -- (164.3289pt,50pt) arc (270:360:5pt) -- (169.3289pt,55pt) -- (169.3289pt,78.0679pt) arc (0:90:5pt) -- (164.3289pt,83.0679pt) -- (105.7162pt,83.0679pt) arc (90:180:5pt) -- (100.7162pt,78.0679pt) -- cycle;
\node at (107.7162pt,57pt)[below right,color=black]{Clavier};
\draw[pstyle1] (179.3289pt,55pt) arc (180:270:5pt) -- (184.3289pt,50pt) -- (233.3289pt,50pt) arc (270:360:5pt) -- (238.3289pt,55pt) -- (238.3289pt,78.0679pt) arc (0:90:5pt) -- (233.3289pt,83.0679pt) -- (184.3289pt,83.0679pt) arc (90:180:5pt) -- (179.3289pt,78.0679pt) -- cycle;
\node at (186.3289pt,57pt)[below right,color=black]{Ecran};
\draw[pstyle1] (330.0101pt,55pt) arc (180:270:5pt) -- (335.0101pt,50pt) -- (402.2546pt,50pt) arc (270:360:5pt) -- (407.2546pt,55pt) -- (407.2546pt,78.0679pt) arc (0:90:5pt) -- (402.2546pt,83.0679pt) -- (335.0101pt,83.0679pt) arc (90:180:5pt) -- (330.0101pt,78.0679pt) -- cycle;
\node at (337.0101pt,57pt)[below right,color=black]{Système};
\draw[pstyle3] (123.0226pt,113.7739pt) -- (133.0226pt,117.7739pt) -- (123.0226pt,121.7739pt) -- (127.0226pt,117.7739pt) -- cycle;
\draw[pstyle4] (23.3692pt,117.7739pt) -- (129.0226pt,117.7739pt);
\node at (30.3692pt,98.0679pt)[below right,color=black]{Ecrit "Hello"};
\draw[pstyle3] (356.6323pt,145.4799pt) -- (366.6323pt,149.4799pt) -- (356.6323pt,153.4799pt) -- (360.6323pt,149.4799pt) -- cycle;
\draw[pstyle4] (135.0226pt,149.4799pt) -- (362.6323pt,149.4799pt);
\node at (142.0226pt,129.7739pt)[below right,color=black]{Envoie "Hello"};
\draw[pstyle4] (368.6323pt,198.892pt) -- (410.6323pt,198.892pt);
\draw[pstyle4] (410.6323pt,198.892pt) -- (410.6323pt,211.892pt);
\draw[pstyle4] (369.6323pt,211.892pt) -- (410.6323pt,211.892pt);
\draw[pstyle3] (379.6323pt,207.892pt) -- (369.6323pt,211.892pt) -- (379.6323pt,215.892pt) -- (375.6323pt,211.892pt) -- cycle;
\node at (375.6323pt,161.4799pt)[below right,color=black]{Accepte la saisie et};
\node at (375.6323pt,179.186pt)[below right,color=black]{modifie le document};
\draw[pstyle3] (219.8289pt,257.304pt) -- (209.8289pt,261.304pt) -- (219.8289pt,265.304pt) -- (215.8289pt,261.304pt) -- cycle;
\draw[pstyle4] (213.8289pt,261.304pt) -- (367.6323pt,261.304pt);
\node at (225.8289pt,223.892pt)[below right,color=black]{Afiche le document};
\node at (225.8289pt,241.598pt)[below right,color=black]{mis à jour};
\draw[pstyle3] (34.3692pt,289.01pt) -- (24.3692pt,293.01pt) -- (34.3692pt,297.01pt) -- (30.3692pt,293.01pt) -- cycle;
\draw[pstyle4] (28.3692pt,293.01pt) -- (207.8289pt,293.01pt);
\node at (40.3692pt,273.304pt)[below right,color=black]{Regarde};
\end{tikzpicture}

View File

@ -0,0 +1,16 @@
@startuml local1
hide footbox
actor Bob
participant Clavier
participant Ecran
participant Système
Bob -> Clavier : Ecrit "Hello"
Clavier -> Système : Envoie "Hello"
Système -> Système : Accepte la saisie et\nmodifie le document
Système -> Ecran : Afiche le document\nmis à jour
Ecran -> Bob : Regarde
@enduml

View File

@ -0,0 +1,21 @@
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$w('he')$};
\node[roundnode] (12) [right=40pt of 11] {};
\node[above] at (12.north) {$r/\{'he'\}$};
\node[roundnode] (13) [right=40pt of 12] {};
\node[above] at (13.north) {$w('llo')$};
\node[roundnode] (14) [right=40pt of 13] {};
\node[above] at (14.north) {$r/\{'hello'\}^\omega$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\draw[arrow] (13) -- (14);
\end{tikzpicture}

View File

@ -0,0 +1,41 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{0,0,0}
\definecolor{plantucolor0002}{RGB}{226,226,240}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (26pt,84.0679pt) -- (26pt,294.304pt);
\draw[pstyle0] (75.9pt,84.0679pt) -- (75.9pt,294.304pt);
\draw[pstyle0] (235.9633pt,84.0679pt) -- (235.9633pt,294.304pt);
\node at (5pt,65pt)[below right,color=black]{Alice};
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
\node at (57.9pt,65pt)[below right,color=black]{Bob};
\draw[pstyle1] (76.2692pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (76.2692pt,21.5pt) -- (76.2692pt,48.5pt)(63.2692pt,29.5pt) -- (89.2692pt,29.5pt)(76.2692pt,48.5pt) -- (63.2692pt,63.5pt)(76.2692pt,48.5pt) -- (89.2692pt,63.5pt);
\draw[pstyle1] (184.9633pt,55pt) arc (180:270:5pt) -- (189.9633pt,50pt) -- (282.623pt,50pt) arc (270:360:5pt) -- (287.623pt,55pt) -- (287.623pt,78.0679pt) arc (0:90:5pt) -- (282.623pt,83.0679pt) -- (189.9633pt,83.0679pt) arc (90:180:5pt) -- (184.9633pt,78.0679pt) -- cycle;
\node at (191.9633pt,57pt)[below right,color=black]{Application};
\draw[pstyle3] (224.2932pt,113.7739pt) -- (234.2932pt,117.7739pt) -- (224.2932pt,121.7739pt) -- (228.2932pt,117.7739pt) -- cycle;
\draw[pstyle4] (26.45pt,117.7739pt) -- (230.2932pt,117.7739pt);
\node at (33.45pt,98.0679pt)[below right,color=black]{saisir("Hello")};
\draw[pstyle3] (37.45pt,145.4799pt) -- (27.45pt,149.4799pt) -- (37.45pt,153.4799pt) -- (33.45pt,149.4799pt) -- cycle;
\draw[pstyle4] (31.45pt,149.4799pt) -- (235.2932pt,149.4799pt);
\node at (43.45pt,129.7739pt)[below right,color=black]{lire("Hello")};
\draw[pstyle3] (87.2692pt,177.186pt) -- (77.2692pt,181.186pt) -- (87.2692pt,185.186pt) -- (83.2692pt,181.186pt) -- cycle;
\draw[pstyle4] (81.2692pt,181.186pt) -- (235.2932pt,181.186pt);
\node at (93.2692pt,161.4799pt)[below right,color=black]{lire("Hello")};
\draw[pstyle3] (224.2932pt,208.892pt) -- (234.2932pt,212.892pt) -- (224.2932pt,216.892pt) -- (228.2932pt,212.892pt) -- cycle;
\draw[pstyle4] (76.2692pt,212.892pt) -- (230.2932pt,212.892pt);
\node at (83.2692pt,193.186pt)[below right,color=black]{saisir(" World")};
\draw[pstyle3] (37.45pt,240.598pt) -- (27.45pt,244.598pt) -- (37.45pt,248.598pt) -- (33.45pt,244.598pt) -- cycle;
\draw[pstyle4] (31.45pt,244.598pt) -- (235.2932pt,244.598pt);
\node at (43.45pt,224.892pt)[below right,color=black]{lire("Hello World")};
\draw[pstyle3] (87.2692pt,272.304pt) -- (77.2692pt,276.304pt) -- (87.2692pt,280.304pt) -- (83.2692pt,276.304pt) -- cycle;
\draw[pstyle4] (81.2692pt,276.304pt) -- (235.2932pt,276.304pt);
\node at (93.2692pt,256.598pt)[below right,color=black]{lire("Hello World")};
\end{tikzpicture}

View File

@ -0,0 +1,38 @@
@startuml local2
!pragma teoz true
hide footbox
actor Alice
actor Bob
participant Application
Alice ->(15) Application: saisir("Hello")
Application ->(15) Alice: lire("Hello")
& Application ->(30) Bob
Bob ->(15) Application: saisir(" World")
Application ->(15) Alice: lire("Hello World")
& Application ->(30) Bob
@enduml
@startuml local2fail
!pragma teoz true
hide footbox
actor Alice
participant Application
actor Bob
Alice ->(15) Application: saisir("Le chat")
Application ->(15) Alice: lire("Le chat")
& Application ->(15) Bob: lire("Le chat")
Bob ->(15) Application: saisir(" mange")
& Alice ->(20) Application: saisir(" boit")
Application ->(15) Alice: lire("Le chat mange boit")
& Application ->(15) Bob: lire("Le chat mange boit")
@enduml

View File

@ -0,0 +1,44 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{0,0,0}
\definecolor{plantucolor0002}{RGB}{226,226,240}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0002,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,line width=0.5pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (26.45pt,84.0679pt) -- (26.45pt,293.892pt);
\draw[pstyle0] (230.5952pt,84.0679pt) -- (230.5952pt,293.892pt);
\draw[pstyle0] (434.7404pt,84.0679pt) -- (434.7404pt,293.892pt);
\node at (5pt,65pt)[below right,color=black]{Alice};
\draw[pstyle1] (26.45pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (26.45pt,21.5pt) -- (26.45pt,48.5pt)(13.45pt,29.5pt) -- (39.45pt,29.5pt)(26.45pt,48.5pt) -- (13.45pt,63.5pt)(26.45pt,48.5pt) -- (39.45pt,63.5pt);
\draw[pstyle1] (179.2654pt,55pt) arc (180:270:5pt) -- (184.2654pt,50pt) -- (276.9251pt,50pt) arc (270:360:5pt) -- (281.9251pt,55pt) -- (281.9251pt,78.0679pt) arc (0:90:5pt) -- (276.9251pt,83.0679pt) -- (184.2654pt,83.0679pt) arc (90:180:5pt) -- (179.2654pt,78.0679pt) -- cycle;
\node at (186.2654pt,57pt)[below right,color=black]{Application};
\node at (416.3712pt,65pt)[below right,color=black]{Bob};
\draw[pstyle1] (434.7404pt,13.5pt) ellipse (8pt and 8pt);
\draw[pstyle2] (434.7404pt,21.5pt) -- (434.7404pt,48.5pt)(421.7404pt,29.5pt) -- (447.7404pt,29.5pt)(434.7404pt,48.5pt) -- (421.7404pt,63.5pt)(434.7404pt,48.5pt) -- (447.7404pt,63.5pt);
\draw[pstyle3] (218.9152pt,126.0519pt) -- (228.5952pt,130.7739pt) -- (218.329pt,134.0304pt) -- (222.6114pt,130.3343pt) -- cycle;
\draw[pstyle4] (26.45pt,115.7739pt) -- (228.5952pt,130.7739pt);
\node at (33.45pt,96.0679pt)[below right,color=black]{saisir("Le chat")};
\draw[pstyle3] (37.13pt,172.7579pt) -- (27.45pt,177.4799pt) -- (37.7162pt,180.7364pt) -- (33.4339pt,177.0403pt) -- cycle;
\draw[pstyle4] (229.5952pt,162.4799pt) -- (26.45pt,177.4799pt);
\node at (43.45pt,142.7739pt)[below right,color=black]{lire("Le chat")};
\draw[pstyle3] (423.0604pt,172.7579pt) -- (432.7404pt,177.4799pt) -- (422.4742pt,180.7364pt) -- (426.7566pt,177.0403pt) -- cycle;
\draw[pstyle4] (230.5952pt,162.4799pt) -- (432.7404pt,177.4799pt);
\node at (237.5952pt,142.7739pt)[below right,color=black]{lire("Le chat")};
\draw[pstyle3] (241.2752pt,219.4639pt) -- (231.5952pt,224.186pt) -- (241.8615pt,227.4424pt) -- (237.5791pt,223.7463pt) -- cycle;
\draw[pstyle4] (433.7404pt,209.186pt) -- (230.5952pt,224.186pt);
\node at (247.5952pt,189.4799pt)[below right,color=black]{saisir(" mange")};
\draw[pstyle3] (219.0329pt,224.23pt) -- (228.5952pt,229.186pt) -- (218.2529pt,232.1919pt) -- (222.6238pt,228.601pt) -- cycle;
\draw[pstyle4] (26.45pt,209.186pt) -- (228.5952pt,229.186pt);
\node at (33.45pt,189.4799pt)[below right,color=black]{saisir(" boit")};
\draw[pstyle3] (37.13pt,271.1699pt) -- (27.45pt,275.892pt) -- (37.7162pt,279.1484pt) -- (33.4339pt,275.4523pt) -- cycle;
\draw[pstyle4] (229.5952pt,260.892pt) -- (26.45pt,275.892pt);
\node at (43.45pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
\draw[pstyle3] (423.0604pt,271.1699pt) -- (432.7404pt,275.892pt) -- (422.4742pt,279.1484pt) -- (426.7566pt,275.4523pt) -- cycle;
\draw[pstyle4] (230.5952pt,260.892pt) -- (432.7404pt,275.892pt);
\node at (237.5952pt,241.186pt)[below right,color=black]{lire("Le chat mange boit")};
\end{tikzpicture}

View File

@ -0,0 +1,22 @@
@startuml localiteEtatFail
Bob -> Bob : inserer("Hello World")
Bob -> Bob : afficher() -> "Hello World"
Bob -> Alice : partager("Hello World")
!pragma teoz true
Alice -> Alice : afficher() : "Hello World"
Alice -> Alice : souligner("Hello World")
& Bob -> Bob : supprimer("Hello World", " World")
Alice -> Alice : afficher() : "__Hello World__"
& Bob -> Bob : afficher() : "Hello"
Alice ->(25) Bob : \t\t partager("__Hello World__")\n
& Bob ->(25) Alice : partager("Hello")
Bob -> Bob : afficher() -> "__Hello World__"
& Alice -> Alice : afficher() -> "__Hello__"
@enduml

View File

@ -0,0 +1,76 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{226,226,240}
\definecolor{plantucolor0002}{RGB}{0,0,0}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,line width=1.0pt}
,pstyle3/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
]
\draw[pstyle0] (27.3692pt,39.0679pt) -- (27.3692pt,431.4221pt);
\draw[pstyle0] (295.551pt,39.0679pt) -- (295.551pt,431.4221pt);
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (44.7385pt,5pt) arc (270:360:5pt) -- (49.7385pt,10pt) -- (49.7385pt,33.0679pt) arc (0:90:5pt) -- (44.7385pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
\node at (12pt,12pt)[below right,color=black]{Bob};
\draw[pstyle1] (270.101pt,10pt) arc (180:270:5pt) -- (275.101pt,5pt) -- (316.001pt,5pt) arc (270:360:5pt) -- (321.001pt,10pt) -- (321.001pt,33.0679pt) arc (0:90:5pt) -- (316.001pt,38.0679pt) -- (275.101pt,38.0679pt) arc (90:180:5pt) -- (270.101pt,33.0679pt) -- cycle;
\node at (277.101pt,12pt)[below right,color=black]{Alice};
\draw[pstyle1] (5pt,436.4221pt) arc (180:270:5pt) -- (10pt,431.4221pt) -- (44.7385pt,431.4221pt) arc (270:360:5pt) -- (49.7385pt,436.4221pt) -- (49.7385pt,459.49pt) arc (0:90:5pt) -- (44.7385pt,464.49pt) -- (10pt,464.49pt) arc (90:180:5pt) -- (5pt,459.49pt) -- cycle;
\node at (12pt,438.4221pt)[below right,color=black]{Bob};
\draw[pstyle1] (270.101pt,436.4221pt) arc (180:270:5pt) -- (275.101pt,431.4221pt) -- (316.001pt,431.4221pt) arc (270:360:5pt) -- (321.001pt,436.4221pt) -- (321.001pt,459.49pt) arc (0:90:5pt) -- (316.001pt,464.49pt) -- (275.101pt,464.49pt) arc (90:180:5pt) -- (270.101pt,459.49pt) -- cycle;
\node at (277.101pt,438.4221pt)[below right,color=black]{Alice};
\draw[pstyle2] (27.3692pt,70.7739pt) -- (69.3692pt,70.7739pt);
\draw[pstyle2] (69.3692pt,70.7739pt) -- (69.3692pt,83.7739pt);
\draw[pstyle2] (28.3692pt,83.7739pt) -- (69.3692pt,83.7739pt);
\draw[pstyle3] (38.3692pt,79.7739pt) -- (28.3692pt,83.7739pt) -- (38.3692pt,87.7739pt) -- (34.3692pt,83.7739pt) -- cycle;
\node at (34.3692pt,51.0679pt)[below right,color=black]{inserer("Hello World")};
\draw[pstyle2] (27.3692pt,115.4799pt) -- (69.3692pt,115.4799pt);
\draw[pstyle2] (69.3692pt,115.4799pt) -- (69.3692pt,128.4799pt);
\draw[pstyle2] (28.3692pt,128.4799pt) -- (69.3692pt,128.4799pt);
\draw[pstyle3] (38.3692pt,124.4799pt) -- (28.3692pt,128.4799pt) -- (38.3692pt,132.4799pt) -- (34.3692pt,128.4799pt) -- cycle;
\node at (34.3692pt,95.7739pt)[below right,color=black]{afficher() -\textgreater "Hello World"};
\draw[pstyle3] (283.551pt,156.186pt) -- (293.551pt,160.186pt) -- (283.551pt,164.186pt) -- (287.551pt,160.186pt) -- cycle;
\draw[pstyle2] (27.3692pt,160.186pt) -- (289.551pt,160.186pt);
\node at (34.3692pt,140.4799pt)[below right,color=black]{partager("Hello World")};
\draw[pstyle2] (295.551pt,191.892pt) -- (337.551pt,191.892pt);
\draw[pstyle2] (337.551pt,191.892pt) -- (337.551pt,204.892pt);
\draw[pstyle2] (296.551pt,204.892pt) -- (337.551pt,204.892pt);
\draw[pstyle3] (306.551pt,200.892pt) -- (296.551pt,204.892pt) -- (306.551pt,208.892pt) -- (302.551pt,204.892pt) -- cycle;
\node at (302.551pt,172.186pt)[below right,color=black]{afficher() : "Hello World"};
\draw[pstyle2] (295.551pt,236.598pt) -- (337.551pt,236.598pt);
\draw[pstyle2] (337.551pt,236.598pt) -- (337.551pt,249.598pt);
\draw[pstyle2] (296.551pt,249.598pt) -- (337.551pt,249.598pt);
\draw[pstyle3] (306.551pt,245.598pt) -- (296.551pt,249.598pt) -- (306.551pt,253.598pt) -- (302.551pt,249.598pt) -- cycle;
\node at (302.551pt,216.892pt)[below right,color=black]{souligner("Hello World")};
\draw[pstyle2] (27.3692pt,236.598pt) -- (69.3692pt,236.598pt);
\draw[pstyle2] (69.3692pt,236.598pt) -- (69.3692pt,249.598pt);
\draw[pstyle2] (28.3692pt,249.598pt) -- (69.3692pt,249.598pt);
\draw[pstyle3] (38.3692pt,245.598pt) -- (28.3692pt,249.598pt) -- (38.3692pt,253.598pt) -- (34.3692pt,249.598pt) -- cycle;
\node at (34.3692pt,216.892pt)[below right,color=black]{supprimer("Hello World", " World")};
\draw[pstyle2] (295.551pt,281.304pt) -- (337.551pt,281.304pt);
\draw[pstyle2] (337.551pt,281.304pt) -- (337.551pt,294.304pt);
\draw[pstyle2] (296.551pt,294.304pt) -- (337.551pt,294.304pt);
\draw[pstyle3] (306.551pt,290.304pt) -- (296.551pt,294.304pt) -- (306.551pt,298.304pt) -- (302.551pt,294.304pt) -- cycle;
\node at (302.551pt,261.598pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
\draw[pstyle2] (27.3692pt,281.304pt) -- (69.3692pt,281.304pt);
\draw[pstyle2] (69.3692pt,281.304pt) -- (69.3692pt,294.304pt);
\draw[pstyle2] (28.3692pt,294.304pt) -- (69.3692pt,294.304pt);
\draw[pstyle3] (38.3692pt,290.304pt) -- (28.3692pt,294.304pt) -- (38.3692pt,298.304pt) -- (34.3692pt,294.304pt) -- cycle;
\node at (34.3692pt,261.598pt)[below right,color=black]{afficher() : "Hello"};
\draw[pstyle3] (37.9548pt,363.8051pt) -- (28.3692pt,368.716pt) -- (38.6973pt,371.7706pt) -- (34.3433pt,368.1591pt) -- cycle;
\draw[pstyle2] (294.551pt,343.716pt) -- (27.3692pt,368.716pt);
\node at (44.3692pt,306.304pt)[below right,color=black]{\qquad\qquad\qquad\qquad\qquad\qquad\qquad partager("\underline{Hello World}")};
\node at (44.3692pt,324.01pt)[below right,color=black]{ };
\draw[pstyle3] (283.9655pt,363.8051pt) -- (293.551pt,368.716pt) -- (283.2229pt,371.7706pt) -- (287.577pt,368.1591pt) -- cycle;
\draw[pstyle2] (27.3692pt,343.716pt) -- (293.551pt,368.716pt);
\node at (34.3692pt,324.01pt)[below right,color=black]{partager("Hello")};
\draw[pstyle2] (27.3692pt,400.4221pt) -- (69.3692pt,400.4221pt);
\draw[pstyle2] (69.3692pt,400.4221pt) -- (69.3692pt,413.4221pt);
\draw[pstyle2] (28.3692pt,413.4221pt) -- (69.3692pt,413.4221pt);
\draw[pstyle3] (38.3692pt,409.4221pt) -- (28.3692pt,413.4221pt) -- (38.3692pt,417.4221pt) -- (34.3692pt,413.4221pt) -- cycle;
\node at (34.3692pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello World}"};
\draw[pstyle2] (295.551pt,400.4221pt) -- (337.551pt,400.4221pt);
\draw[pstyle2] (337.551pt,400.4221pt) -- (337.551pt,413.4221pt);
\draw[pstyle2] (296.551pt,413.4221pt) -- (337.551pt,413.4221pt);
\draw[pstyle3] (306.551pt,409.4221pt) -- (296.551pt,413.4221pt) -- (306.551pt,417.4221pt) -- (302.551pt,413.4221pt) -- cycle;
\node at (302.551pt,380.716pt)[below right,color=black]{afficher() : "\underline{Hello}"};
\end{tikzpicture}

View File

@ -0,0 +1,25 @@
@startuml serialized
!pragma teoz true
hide footbox
participant Alice
participant Server
participant Bob
Alice ->(10) Server : lock()
Server -->(10) Alice : true
Bob -> Server : lock()
& Alice ->(10) Server : inserer("hello world")
Server -->(10) Bob : false
& Alice ->(10) Server : lire()
Server -->(10) Alice : "hello world"
Alice -> Server : unlock()
Bob -> Server : lock()
Bob -> Server : lire()
Server -->(10) Bob : "hello world"
Bob -> Server : unlock()
@enduml

View File

@ -0,0 +1,57 @@
% generated by Plantuml 1.2022.7
\definecolor{plantucolor0000}{RGB}{24,24,24}
\definecolor{plantucolor0001}{RGB}{226,226,240}
\definecolor{plantucolor0002}{RGB}{0,0,0}
\begin{tikzpicture}[yscale=-1
,pstyle0/.style={color=plantucolor0000,line width=0.5pt,dash pattern=on 5.0pt off 5.0pt}
,pstyle1/.style={color=plantucolor0000,fill=plantucolor0001,line width=0.5pt}
,pstyle2/.style={color=plantucolor0000,fill=plantucolor0000,line width=1.0pt}
,pstyle3/.style={color=plantucolor0000,line width=1.0pt}
,pstyle4/.style={color=plantucolor0000,line width=1.0pt,dash pattern=on 2.0pt off 2.0pt}
]
\draw[pstyle0] (30.45pt,39.0679pt) -- (30.45pt,434.1281pt);
\draw[pstyle0] (210.5241pt,39.0679pt) -- (210.5241pt,434.1281pt);
\draw[pstyle0] (328.7611pt,39.0679pt) -- (328.7611pt,434.1281pt);
\draw[pstyle1] (5pt,10pt) arc (180:270:5pt) -- (10pt,5pt) -- (50.9pt,5pt) arc (270:360:5pt) -- (55.9pt,10pt) -- (55.9pt,33.0679pt) arc (0:90:5pt) -- (50.9pt,38.0679pt) -- (10pt,38.0679pt) arc (90:180:5pt) -- (5pt,33.0679pt) -- cycle;
\node at (12pt,12pt)[below right,color=black]{Alice};
\draw[pstyle1] (177.9423pt,10pt) arc (180:270:5pt) -- (182.9423pt,5pt) -- (238.1059pt,5pt) arc (270:360:5pt) -- (243.1059pt,10pt) -- (243.1059pt,33.0679pt) arc (0:90:5pt) -- (238.1059pt,38.0679pt) -- (182.9423pt,38.0679pt) arc (90:180:5pt) -- (177.9423pt,33.0679pt) -- cycle;
\node at (184.9423pt,12pt)[below right,color=black]{Server};
\draw[pstyle1] (306.3919pt,10pt) arc (180:270:5pt) -- (311.3919pt,5pt) -- (346.1303pt,5pt) arc (270:360:5pt) -- (351.1303pt,10pt) -- (351.1303pt,33.0679pt) arc (0:90:5pt) -- (346.1303pt,38.0679pt) -- (311.3919pt,38.0679pt) arc (90:180:5pt) -- (306.3919pt,33.0679pt) -- cycle;
\node at (313.3919pt,12pt)[below right,color=black]{Bob};
\draw[pstyle2] (198.7612pt,76.2256pt) -- (208.5241pt,80.7739pt) -- (198.3177pt,84.2133pt) -- (202.5333pt,80.4412pt) -- cycle;
\draw[pstyle3] (30.45pt,70.7739pt) -- (208.5241pt,80.7739pt);
\node at (37.45pt,51.0679pt)[below right,color=black]{lock()};
\draw[pstyle2] (41.2128pt,117.9316pt) -- (31.45pt,122.4799pt) -- (41.6564pt,125.9193pt) -- (37.4408pt,122.1473pt) -- cycle;
\draw[pstyle4] (209.5241pt,112.4799pt) -- (30.45pt,122.4799pt);
\node at (47.45pt,92.7739pt)[below right,color=black]{true};
\draw[pstyle2] (221.5241pt,150.186pt) -- (211.5241pt,154.186pt) -- (221.5241pt,158.186pt) -- (217.5241pt,154.186pt) -- cycle;
\draw[pstyle3] (215.5241pt,154.186pt) -- (327.7611pt,154.186pt);
\node at (227.5241pt,134.4799pt)[below right,color=black]{lock()};
\draw[pstyle2] (198.7612pt,159.6376pt) -- (208.5241pt,164.186pt) -- (198.3177pt,167.6253pt) -- (202.5333pt,163.8533pt) -- cycle;
\draw[pstyle3] (30.45pt,154.186pt) -- (208.5241pt,164.186pt);
\node at (37.45pt,134.4799pt)[below right,color=black]{inserer("hello world")};
\draw[pstyle2] (317.1338pt,201.0635pt) -- (326.7611pt,205.892pt) -- (316.4596pt,209.035pt) -- (320.7825pt,205.3863pt) -- cycle;
\draw[pstyle4] (210.5241pt,195.892pt) -- (326.7611pt,205.892pt);
\node at (217.5241pt,176.186pt)[below right,color=black]{false};
\draw[pstyle2] (198.7612pt,201.3437pt) -- (208.5241pt,205.892pt) -- (198.3177pt,209.3314pt) -- (202.5333pt,205.5593pt) -- cycle;
\draw[pstyle3] (30.45pt,195.892pt) -- (208.5241pt,205.892pt);
\node at (37.45pt,176.186pt)[below right,color=black]{lire()};
\draw[pstyle2] (41.2128pt,243.0497pt) -- (31.45pt,247.598pt) -- (41.6564pt,251.0374pt) -- (37.4408pt,247.2653pt) -- cycle;
\draw[pstyle4] (209.5241pt,237.598pt) -- (30.45pt,247.598pt);
\node at (47.45pt,217.892pt)[below right,color=black]{"hello world"};
\draw[pstyle2] (198.5241pt,275.304pt) -- (208.5241pt,279.304pt) -- (198.5241pt,283.304pt) -- (202.5241pt,279.304pt) -- cycle;
\draw[pstyle3] (30.45pt,279.304pt) -- (204.5241pt,279.304pt);
\node at (37.45pt,259.598pt)[below right,color=black]{unlock()};
\draw[pstyle2] (221.5241pt,307.01pt) -- (211.5241pt,311.01pt) -- (221.5241pt,315.01pt) -- (217.5241pt,311.01pt) -- cycle;
\draw[pstyle3] (215.5241pt,311.01pt) -- (327.7611pt,311.01pt);
\node at (227.5241pt,291.304pt)[below right,color=black]{lock()};
\draw[pstyle2] (221.5241pt,338.716pt) -- (211.5241pt,342.716pt) -- (221.5241pt,346.716pt) -- (217.5241pt,342.716pt) -- cycle;
\draw[pstyle3] (215.5241pt,342.716pt) -- (327.7611pt,342.716pt);
\node at (227.5241pt,323.01pt)[below right,color=black]{lire()};
\draw[pstyle2] (317.1338pt,379.5935pt) -- (326.7611pt,384.4221pt) -- (316.4596pt,387.5651pt) -- (320.7825pt,383.9164pt) -- cycle;
\draw[pstyle4] (210.5241pt,374.4221pt) -- (326.7611pt,384.4221pt);
\node at (217.5241pt,354.716pt)[below right,color=black]{"hello world"};
\draw[pstyle2] (221.5241pt,412.1281pt) -- (211.5241pt,416.1281pt) -- (221.5241pt,420.1281pt) -- (217.5241pt,416.1281pt) -- cycle;
\draw[pstyle3] (215.5241pt,416.1281pt) -- (327.7611pt,416.1281pt);
\node at (227.5241pt,396.4221pt)[below right,color=black]{unlock()};
\end{tikzpicture}

View File

@ -0,0 +1,5 @@
\subsection{Motivation}
\input{intro/motivation.tex}
\subsection{Introduction}
\input{intro/intro.tex}

View File

@ -0,0 +1,10 @@
Les comportements des systèmes distribués sont étudiés depuis les années 1970, depuis larrivée des premiers processeurs multicœur.
Dans ce contexte il semblait essentiel de pouvoir répartir une tâche entre plusieurs acteurs de manières asynchrone afin daccroitre les performances sur une unique tâche.
Ainsi Lamport définit un modèle de cohérence quil nomme “séquentiel”. Il présente la séquentialité de la manière suivante : une tâche est décomposable en un ensemble finit dopération atomique. Sil est possible de réordonner ces opérations de façon à ce que leur remaniement séquentiel émette des résultats indiscernables pour un opérateur extérieur par rapport à lexécution séquentielle non-distribuée. Alors la cohérence atteinte par ce système peut être appelée séquentiel.
Aujourdhui nous savons que cette approche nécessite de garder une synchronicité forte entre les acteurs [REF].
La difficulté à préserver cette synchronicité croit considérablement avec le nombre dacteur et le temps de transmission de linformation. Lusage dune approche séquentiel sur des applications visant à faire travailler des acteurs distants à travers un réseau mondial tel quinternet semble à ce titre loin dêtre efficace. Restreignant les applications dans un dilemme, nécessitant de choisir entre un usage hautement interactif mais excluant les nœuds les plus lents du réseau, ou permettant à lensemble des noeuds de participer au prix dune très grande latence pour lensemble du réseau.
% Parallèle édition collaborative synchrone VS git
Néanmoins là ou lapproche séquentiel est la seule fournissant une cohérence absolue dans la gestion des données du point de vue général et du point de vue de lutilisateur.
Il est possible daccepter une perte de cette cohérence partielle ou total afin de gagner en performances sur des applications à grande échelle.
Ce compromis entre cohérence et performances est lobjet de ce document qui vise à faire un état du paysage des différentes approches et solutions existantes, en définissant les cas dusages associés.

View File

@ -0,0 +1,9 @@
La plupart des applications collaboratifs sur le marché prennent la forme dune entité centralisée traitant des données, puis les redistribuent aux différents clients en résolvant au passage les possibles problèmes de cohérences qui auraient pu survenir.
De manière à favoriser linteractivité de lapplication et ainsi fournir lexpérience utilisateur la plus optimale, on constate que certaines de ces applications font appels à des algorithmes qui ne respectent pas ce quon attendrait dune exécution séquentielle, pouvant ainsi mener à des incohérences dans les exécutions.
Et à terme avoir un impact sur lexpérience utilisateur.
Il nous semble donc intéressant de se pencher sur létat de la recherche concernant les divers manières daborder ce compromis dans la gestion de la cohérence dans ce genre de systèmes. Et ainsi mettre en avant les différentes propriétés qui en résultent. Lintérêt ici est de fournir une base permettant déclairer la prise de décision lors de limplémentation dun algorithme visant à satisfaire un problème distribué.
Ce document est réalisé dans le cadre de la réalisation de ma thèse à fin de servir de base en tant quétat de lart sur le sujet.
Lobjectif est de fournir un état de lart de la recherche autour des différents compromis réalisables dans la gestion de la cohérence dans le contexte dapplications distribués.
Il a pour but de servir de base à un projet de thèse en CIFRE financé par lentreprise Scille SAS, et encadré par le Laboratoire dInformatique et Système.

View File

@ -0,0 +1,59 @@
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[affil-it]{authblk}
\usepackage{fullpage}
\usepackage{graphicx}
\usepackage{biblatex}
\addbibresource{../../recherches/Stage.bib}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{calc}
\usetikzlibrary{arrows.meta}
\usepackage{aeguill}
\usepackage{amsmath}
\usepackage{multicol}
\begin{document}
\title{DRAFT: Critères de Cohérence faible byzantine appliquée aux environements cloud}
\author{JOLY Amaury \\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin}
\affil{Aix-Marseille Université, Scille}
\date{\today}
\begin{titlepage}
\maketitle
\end{titlepage}
\begin{abstract}
DRAFT !
\end{abstract}
\newpage
\tableofcontents
\newpage
\section{Introduction}
\input{intro/index.tex}
\section{Cohérence Forte}
\input{coherence_forte/index.tex}
\section{Les critères de cohérence}
\input{consistency_criteria/index.tex}
\section{Les CRDT}
\input{CRDT/index.tex}
\printbibliography
\end{document}