Le but de ce TP est de concevoir une bibliothèque de détection de pannes (mort ou blocage), utilisable sur n'importe quel processus.
Il possède les caractéristiques suivantes :
Cet exercice a été entièrement réalisé par Glenn ROLLAND <glenux@fr.st> à l'occasion de travaux pratiques du cours de Programmation Répartie du Master 2 Ingénierie Informatique - Systèmes, Réseaux et Internet.
Cet exercice nécessite un système GNU/Linux, ainsi que l'utilisation de GNU GCC (version ≥ 2.95) et de GNU Make.
Vous pouvez télécharger la dernière archive des sources, ou bien directement leur version la plus récente sur le dépôt Subversion du projet.
Elle est disponible à l'adresse :
http://glenux2.free.fr/pub/projets/ProgRepartieTP4/Archives/
Afin d'obtenir les sources les plus à jour, vous pouvez utiliser le logiciel de contrôle de sources Subversion
$ svn
checkout \
http://repository.glenux.ath.cx/svn/Cours/M2/Prog_Repartie/TP4/ \
prog-repartie-tp4
Il n'y a pas de mot de passe, il suffit donc de presser la touche "Entrée" pour l'utilisateur "anonymous", si ce dernier vous est demandé.
Si vous avez choisi l'archive, commencez par la décompressez.
$ tar -xzvf prog-repartie-tp4.tar.gz
Rendez vous ensuite dans le dossier qui vient d'être créé lors de la décompression.
$ cd prog-repartie-tp4
Puis lancez la compilation du logiciel avec les paramètres souhaités..
Il s'agit d'écrire un détecteur de pannes, utilisant deux threads: une pour le programme principal, et une pour le détecteur. La thread du détecteur se connecte via une socket INET à un serveur chez qui elle "s'enregistre" pour être ensuite surveillée.
Pour utiliser les logiciels, il faut avoir défini les variables d'environnement DETECTOR_HOSTNAME et DETECTOR_PORT sur chacune des machines faisant partie du système de détection de pannes.
Avant de lancer les programmes à surveiller, il faut d'abord lancer le programme serveur qui vérifiera la vivacité des processus enregistrés.
Il s'agit du programme serveur.
Pour le compiler, taper:
$ make server
Pour l'executer (sur un shell bash):
$ export DETECTOR_PORT=2345
$ ./detector-server
On obtient alors:
Lookup for localhost...
Host found
Bind on port 2345 of 127.0.0.1
Ready to accept connexions.
[\] Select...done
Lorsque qu'un processus se connecte, puis s'enregistre, les lignes suivantes apparaissent:
Got new connection at 4
[-] Select...done
Registering client : 13331@djeke
[\] Select...done
Puis, tant que le programme est en fonctionnement:
Requesting liveness for '13331@djeke'
[/] Select...done
Requesting liveness for '13331@djeke'
[-] Select...done
...
Requesting liveness for '13331@djeke'
[\] Select...done
Enfin, lorsque le programme plante (ou quitte), on voit:
[|] Select...done
Requesting liveness for '13442@djeke'
Select...done
Client '13442@djeke' has disconnected !
Il s'agit du détecteur de pannes invoqué depuis le main du programme à surveiller et lié statiquement.
Pour compiler les exemples, taper:
$ make worm_inc
Puis, pour lancer les exemples:
$ export DETECTOR_HOSTNAME=localhost
$ export DETECTOR_PORT=2345
$ ./worms_mod
ce qui affiche:
... (puis on voit des vers qui se baladent sur le terminal)
ou bien :
$ export DETECTOR_HOSTNAME=localhost
$ export DETECTOR_PORT=2345
$ ./test_mod
ce qui affiche:
HOST (localhost) PORT (2345)
Thread launched
Lookup for localhost...
Host found
Thread connected
Loooooping
Loooooping
Loooooping
Loooooping
[ ... ]
Il s'agit du détecteur de pannes invoqué depuis le main du programme à surveiller et lié dynamiquement.
Pour compiler les exemples, taper:
$ make worm_shared
Puis, pour lancer les exemples:
$ export DETECTOR_HOSTNAME=localhost
$ export DETECTOR_PORT=2345
$ LD_LIBRARY_PATH="." ./worms_mod
ou bien :
$ export DETECTOR_HOSTNAME=localhost
$ export DETECTOR_PORT=2345
$ LD_LIBRARY_PATH="." ./test_mod
Il s'agit du détecteur de pannes, dans une bibliothèque liée dynamiquement, mais sans aucune modification au code source du programme original.
Pour compiler les exemples, taper:
$ make worm_inc
Puis, pour lancer les exemples:
$ export DETECTOR_HOSTNAME=localhost
$ export DETECTOR_PORT=2345
$ LD_LIBRARY_PATH="." LD_PRELOAD=libdetect.so ./worms
ou bien :
$ export DETECTOR_HOSTNAME=localhost
$ export DETECTOR_PORT=2345
$ LD_LIBRARY_PATH="." LD_PRELOAD=libdetect.so ./test