• Aucun résultat trouvé

6.4 Mise en ÷uvre de la migration d'objets

6.4.3 Protocole de migration

La migration d'un objet d'un site ou processus à un autre est déclenchée par l'envoi d'un événement spécial dans le noyau distribué d'OpenMASK. Cet événe-ment comporte le nom de l'objet à faire migrer et le nom du processus destination. L'événement de migration sera reçu par tous les contrôleurs au prochain pas de simulation. À la réception de l'événement chaque contrôleur local a en eet un travail particulier à réaliser. Un contrôleur doit donc choisir parmi quatre cas possibles celui qui correspond à son état :

Mise en ÷uvre de la migration d'objets 117 ce cas le référentiel doit être transformé en miroir. Ceci veut dire que son gestionnaire de référentiel associé doit être détruit et remplacé par un ges-tionnaire de miroir. Une fois l'objet transformé en miroir il faut le brancher sur son nouveau référentiel.



le contrôleur est sur le processus destination et possède un miroir

de l'objet à faire migrer :

ceci veut dire que nous sommes déjà sur le

site cible, donc il faut transformer le miroir en référentiel. Inversement au cas précédent, c'est le gestionnaire de miroir qui est détruit et remplacé par un gestionnaire de référentiel.



le contrôleur est sur le processus destination et ne possède pas de

miroir de l'objet à faire migrer :

dans ce cas il faut commencer par créer

un miroir de l'objet sur ce processus en utilisant la méthode standard de création de miroir. Ensuite nous appliquons la procédure de transformation de miroir en référentiel comme indiquée dans le paragraphe précédent.



le contrôleur possède l'un des miroirs de l'objet à faire migrer :

dans ce dernier cas nous devons gérer la situation des autres miroirs de l'objet à migrer. Rappelons que ces miroirs sont branchés à leur référentiel par une connexion en ots de données. Il faut donc débrancher ces miroirs de leur référentiel qui se transforme en miroir puis les rebrancher sur leur nouveau référentiel.

Ces diérentes étapes ne doivent pas être traitées dans n'importe quel ordre. Par exemple on ne peut pas déclencher le mécanisme de réorientation des miroirs vers leur nouveau référentiel si ce dernier n'a pas encore été métamorphosé en référentiel pour qu'il puisse traiter les demandes de branchement. En même temps il faut éviter de perdre du temps en exécutant toutes les étapes de migration en autant de pas de simulation.

Après quelques études, nous avons trouvé un compromis qui permet l'achè-vement de la procédure de migration en deux étapes pendant deux pas de si-mulation. La première étape consiste à faire exécuter l'algorithme 3 par tous les contrôleurs. Cet algorithme consiste à transformer le miroir sur le processus destination en référentiel. En parallèle les autres miroirs se débranchent de leur référentiel actuel qui est en train de migrer sur un autre processus. L'étape sui-vante est l'application de l'algorithme 5. Ici, nous transformons le référentiel à migrer en miroir et nous le branchons sur son nouveau référentiel. En même temps nous nous occupons du branchement des autres miroirs sur les autres processus vers leur nouveau référentiel.

118 Migration

Algorithme 3

Algorithme exécuté par tous les contrôleurs à la réception d'un

événement de migration

// nomProcessusDestination est le nom du processus destination vers lequel un objet doit migrer

// nomObjet est le nom de l'objet à faire migrer

si

nomProcessusAbritant (nomObjet) = nomProcessusDestination

alors

// cas trivial : cela veut dire que dans ce cas on ne fait rien car le processus est déjà sur le processus destination

sinon si

contrôleur.nomDuProcessus = nomProcessusDestination

alors

// Donc c'est le contrôleur du processus qui détient le miroir qui se trans-formera en référentiel

mir listeDesMiroirs.chercher (nomObjet); transformerEnRéférentiel (mir); // voir algo. 4

envoyerEvénement (migrationEtape2); // voir algo. 5

sinon si

listeDesMiroirs.chercher (nomObjet) 6= φ

alors

// Dans ce cas c'est un contrôleur qui a un des miroirs de l'objet à faire migrer

// donc il faut désabonner ce miroir de leur ex-référentiel annulerAbonnementAuRéférentiel (nomObjet);

sinon si

listeDesRéférentiels.chercher (nomObjet) 6= φ

alors

// Dans ce cas c'est un contrôleur qui a le référentiel de l'objet à faire migrer // il faut sauvegarder ses valeurs internes avant de le transformer en miroir dans

// l'étape suivante

sauvegarderValeursInternes (nomObjet);

nsi

Algorithme 4

Algorithme de transformation d'un miroir en référentiel

// nomProcessusDestination est le nom du processus destination vers lequel un objet doit migrer

// nomObjet est le nom de l'objet à faire migrer

gestionnaireMiroir récupérerLeGestionnaireMiroir (nomObjet); gestionnaireMiroir.annulerAbonnementVersRéférentiel ();

listeDesMiroirs.ôter (nomObjet); delete gestionnaireMiroir;

nouveauRéférentiel new gestionnaireRéférentiel (nomObjet); listeDesRéférentiels.ajouter (nouveauRéférentiel);

Mise en ÷uvre de la migration d'objets 119

Algorithme 5

Algorithme de l'étape 2 de la migration

// nomProcessusDestination est le nom du processus destination vers lequel un objet doit migrer

// nomObjet est le nom de l'objet à faire migrer

si

nomProcessusActuel 6=nomProcessusDestination

alors

si

nomProcessusActuel 6= nomProcessusAbritantExRéférentiel

alors

// Donc c'est un processus qui a un des miroirs du référentiel à migrer // Il faut brancher ce miroir à son nouveau référentiel

brancherMiroirVersProcessus (nomProcessusDestination);

sinon

// donc c'est un processus qui a l'ex-référentiel

// il faut le transformer en miroir puis le rebrancher à son nouveau réfé-rentiel

référentiel listeDesRéférentiels.chercher (nomObjet); transformerEnMiroir (référentiel); // voir algo. 6

brancherMiroirVersProcessus (nomProcessusDestination);

nsi

nsi

Algorithme 6

Algorithme de transformation d'un référentiel en miroir

// nomProcessusDestination est le nom du processus destination vers lequel un objet doit migrer

// nomObjet est le nom de l'objet à faire migrer

gestionnaireRéférentiel recupérerLeGestionnaireRéférentiel (nomObjet); listeDesRéférentiels.ôter (nomObjet);

delete gestionnaireRéférentiel;

nouveauMiroir new gestionnaireMiroir (nomObjet); listeDesMiroirs.ajouter (nouveauMiroir);

120 Migration