From 4e6e3d9874ef70df3dae245de0dfa60aac52bdd2 Mon Sep 17 00:00:00 2001 From: n-peugnet Date: Fri, 12 Nov 2021 13:17:54 +0100 Subject: rewrite commit algorithm --- pdf/doc.tex | 75 ++++++++++++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 38 deletions(-) (limited to 'pdf/doc.tex') diff --git a/pdf/doc.tex b/pdf/doc.tex index 5ceba47..7878993 100644 --- a/pdf/doc.tex +++ b/pdf/doc.tex @@ -904,7 +904,7 @@ DNA-Backup stocke le contenu de ce fichier comme une liste de structures \verb|F Le fichier \verb|recipe| est celui qui permet de reconstruire le disque virtuel. Go nous autorise à créer des listes de structures hétérogènes grâce aux interfaces, il s'agit donc concrètement d'une simple liste de structures de chunks (Figure~\ref{fig:type-chunks-struct}). -Une fois encore encodée à l'aide de \verb|gob|~\cite{pike2011gob}. +Une fois encore, encodée à l'aide de \verb|gob|~\cite{pike2011gob}. Un chunk est référencé par son ID, dont la structure est visible Figure~\ref{fig:type-chunkid-struct}. \begin{figure}[ht] @@ -966,80 +966,79 @@ par exemple le tout dernier chunk du disque virtuel. \begin{enumerate} \item - Chargement des métadonnées du \emph{repo} afin de reconstruire en + Chargement des métadonnées du repo afin de reconstruire en mémoire l'état de la dernière version : \begin{itemize} \item - Reconstruction de la \emph{recipe} à partir des deltas de chaque + Reconstruction de la recipe à partir des deltas de chaque version. \item Reconstruction du listage des fichiers à partir des deltas de chaque - version (fichier \emph{files}). + version (fichier \verb|files|). \item - Reconstruction en mémoire des \emph{maps} de \emph{fingerprints} et - de \emph{sketches} à partir des fichiers \emph{hashes} de chaque + Reconstruction en mémoire des index de \emph{fingerprints} et + de \emph{sketches} à partir des fichiers \verb|hashes| de chaque version. \end{itemize} \item - Listage des fichiers de la \emph{source}. + Listage des fichiers de la source. \item Concaténation de l'ensemble des fichiers de la source en un disque virtuel continu. \item - Lecture du \emph{stream} de ce disque virtuel et découpage en - \emph{chunk} (de 8 Kio actuellement). -\item - Pour chaque \emph{chunk} du \emph{stream} : - - \begin{enumerate} + Lecture de ce disque virtuel. Tant qu'il reste des données dans le disque virtuel : + + \begin{itemize} + \item + Application de l'empreinte de Rabin~\cite{rabin1981fingerprinting} + sur les données du disque virtuel, avec une fenêtre glissante de la taille d'une chunk, + afin de chercher des correspondances de \emph{fingerprint} avec l'index. + \item + Lorsqu'une fingerprint est trouvée, le chunk correspondant est alors + stocké de manière dé-dupliquée, sous la forme d'un \verb|StoredChunk| + (Figure~\ref{fig:type-chunks-struct}) + contenant l'identifiant du chunk trouvé dans l'index. \item - Calculer sa \emph{fingerprint} (hash classique), si elle est - présente dans la \emph{map} : le stocker de manière dé-dupliquée - (sous la forme d'identifiant faisant référence au \emph{chunk} - trouvé dans la map). + Si aucune correspondance n'est trouvé après avoir analysé + l'équivalent de 3 chunks de données, + alors le \emph{sketch} du premier chunk est calculé et cherché dans l'index + pour tenter de le stocker en encodage delta, sous la forme d'un \verb|DeltaChunk| + (Figure~\ref{fig:type-chunks-struct}). \item - Sinon, calculer son \emph{sketch} (hash de ressemblance), s'il est - présent dans la \emph{map}, le stocker sous la forme de delta - (calcul de sa différence par rapport au \emph{chunk} trouvé dans la - map). + S'il n'est pas trouvé, il est alors stocké en tant que nouveau \verb|StoredChunk| + et sa \emph{fingerprint} et son \emph{sketch} sont ajoutés aux index. \item - Sinon, le stocker sous la forme de nouveau bloc (ajout de sa - \emph{fingerprint} et de son \emph{sketch} dans les \emph{maps} et - stockage du contenu complet dans un nouveau \emph{chunk}). - \end{enumerate} + Si une correspondance (de fingerprint ou de sketch) arrive entre le deuxième + et le troisième chunk, alors, si possible, le reste du deuxième chunk est + fusionné avec le premier pour tenter de l'encoder en tant qu'un seul \verb|DeltaChunk|. + \end{itemize} \item Calcul des différences entre la nouvelle version et la précédente pour - les métadonnées (\emph{files} et \emph{recipe}) et stockage des deltas - ainsi obtenus. + les métadonnées (files et recipe) et stockage des deltas ainsi obtenus. \end{enumerate} \section{Algorithme du restore} \begin{enumerate} \item - Chargement des métadonnées du \emph{repo} afin de reconstruire en + Chargement des métadonnées du repo afin de reconstruire en mémoire l'état de la dernière version : \begin{itemize} \item - Reconstruction de la \emph{recipe} à partir des deltas de chaque - version. + Reconstruction de la recipe à partir des deltas de chaque version. \item - Reconstruction du listage des fichiers à partir des deltas de chaque - version. + Reconstruction du listage des fichiers à partir des deltas de chaque version. \end{itemize} \item - À partir de la \emph{recipe}, reconstruire le disque virtuel (sous la - forme d'un \emph{stream}). + À partir de la recipe, reconstruire le disque virtuel. \item - Découper ce \emph{stream} en fonction du listage des fichiers - (\emph{files}) et réécrire les données dans les fichiers - correspondants dans le répertoire \emph{destination}. + Découper ce disque virtuel en fonction du listage des fichiers + et réécrire les données dans les fichiers correspondants dans le répertoire destination. \end{enumerate} - \chapter{Évaluation de performances} Le dossier \verb|exp| contient les scripts permettant de reproduire -- cgit v1.2.3