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 lesite 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éerun 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) = nomProcessusDestinationalors
// 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 = nomProcessusDestinationalors
// 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=nomProcessusDestinationalors
si
nomProcessusActuel 6= nomProcessusAbritantExRéférentielalors
// 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