ThomasRuleEngine

Description générale

Les métadonnées

XWiki possède un ensemble de métadonnées associées à chaque page, commentaire ou encore pièce jointe. On trouvera par exemple associé à chaque page :

  • Id (String) : identificateur unique de la page
  • Space (String) : identificateur de l’espace de la page
  • Title (String) : titre de la page
  • Created (Date) : date de création de la page
  • Creator (String) : login du créateur de la page
  • Modified (Date) : date de création de la page
  • Modifier (String) : login du dernier utilisateur ayant modifié la page
  • Content (String) : contenu de la page (cette donnée est traitée par le WootEngine)
  • Version (int) : version de la page
  • homePage (boolean) : la page est elle homePage de l’espace
  • ...

Difficulté de fusion des métadonnées

Il n’est pas possible de fusionner et de résoudre des conflits de métadonnées avec le moteur du WootEngine (les métadonnées sont représentées sous forme d’XML ; le WootEngine permet de gérer des structure linéaires et non arborescentes…).

La règle du Last Writter Win (LWW)

Afin de remédier au problème des métadonnées, nous avons choisi d’utiliser la règle de Thomas. Plus communément appelé la règle du Last Writter Win (LWW), cet algorithme représente un compromis permettant de faire converger la réplication des métadonnées vers un état commun.

Modèle de représentation des métadonnées

Ce composant permet de stocker les métadonnées en appliquant directement l’algorithme du LWW. Pour ce faire il utilise un modèle interne permettant de générer/d’appliquer des opérations correspondantes aux modifications des métadonnées effectuées dans XWiki.

Application d’opérations

A chaque opération effectuée dans XWiki sur des métadonnées, le composant ThomasRuleEngine va être sollicité pour récupérer l’opération ThomasRuleEngine correspondante. Celle-ci sera appliquée localement et envoyée aux autres sites. Lorsqu’un site reçoit une opération, il l’applique à son modèle ThomasRuleEngine ; la règle du LWW sera alors appliquée : l’opération sera exécutée en fonction des conditions de l’algorithme.

Serialisation du modèle interne

L’ensemble des métadonnées stockées dans le modèle interne sont sérialisées dans des fichiers.

Modèle interne

Une donnée lorsqu'elle est supprimée ne l'est pas physiquement, c'est un attribut booléen (Tombstone) qui caractérise sont existence.

Chaque donnée est représentée par deux éléments devant être fournis par le client du composant voulant gérer une nouvelle métadonnée :

  • Un identifiant unique
  • Une valeur donnée
De plus, trois éléments sont attribués automatiquement par le composant lors de la création d’une nouvelle entrée (i.e. : demande d’opération par le client du composant) :
  • Une « tombstone » : un booléen à True si la donnée est supprimée, à False sinon.
  • Un premier « timestamp » : date de création de la donnée.
  • Un second « timestamp » : date de modification de la donnée.
L’ensemble de ces cinq élément correspond à un objet de type Entry.

Le module ThomasRuleEngine doit gérer un objet de type EntriesList, contenant l’ensemble des données traitées. La sérialisation concerne cet objet. Chaque accès à cet objet nécessite de le charger en pré-condition et de le sauvegarder en post-condition.

Les opérations

Il existe trois types d’opérations :

  • La création (ThomasRuleOpNew)
  • L’édition (ThomasRuleOpSet)
  • La suppression (ThomasRuleOpDel)
Ces trois opérations héritent de la classe abstraite ThomasRuleOp.

Algorithmes

Création d'une nouvelle opération

Condition de création d’une nouvelle opération en fonction d’un identificateur, d’une valeur et d’un module ThomasRuleEngine :

Soit  	id : identificateur ;

val : valeur ;

tre : ThomasRuleEngine ;

e : tre.get(id) ;

Si (val !=null && (e==null || e.isDeleted())

return new ThomasRuleOpNew ;

Sinon

Si (e!=null)

Si (val!=null && !e.isDeleted())

Si (!val.equals(e.getValue())

return new ThomasRuleOpSet ;

FinSi

Sinon

return new ThomasRuleOpDel ;

FinSi

FinSi

FinSi

return null ;

Vérification des timestamps

Une opération donnée est appliquée si ses timestamps vérifient certaines conditions :

Soit  	op : ThomasRuleOp ;

tre : ThomasRuleEngine ;

e : tre.get(op.getIdentificateur()) ;

Si (e !=null)

Si (e.getTimestampCreation > op.getTimestampCreation)

return false ;

Sinon

Si (e.getTimestampCreation == op.getTimestampCreation)

Si (e.getTimestampModif >= op.getTimestampModif)

return false;

FinSi

FinSi

FinSi

FinSi

return true;

Condition particulière :

Pour les opérations d’édition et de suppression, si l’identificateur donné n’existe pas dans le modèle interne, l’opération est précédée d’une opération de création.

Diagramme de composant

ThomasRuleEngineComponent.jpg

Entrées

  • getOp : permet de créer un object représentant l’opération ThomasRuleEngine correspondant au couple identificateur/valeur fourni.
  • getValue : permet de récupérer la valeur associée à un identificateur donné dans le modèle interne.

Sortie

  • applyOp : permet d’appliquer au modèle interne une opération ThomasRuleEngine donnée.

Diagramme de classe

TRE_class.jpg
Version 1.14 last modified by Julien MAIRE on 21/02/2008 at 17:14

Comments 0

No comments for this document

Attachments 2

[img]
TRE_class.jpg 1.1
PostedBy: Julien MAIRE on 21/02/2008 (912kb )
[img]
ThomasRuleEngineComponent.jpg 1.1
PostedBy: Julien MAIRE on 21/02/2008 (23kb )
Partenaires


Creator: Julien MAIRE on 20/02/2008 at 10:13
Copyright INRIA, ENST, EISTI, Mandriva, XPertNet
1.1-milestone-2.3619