Programmation répartie - TP4

1. Description

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 :

1.1. Auteurs

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.

2. Pré-requis

Cet exercice nécessite un système GNU/Linux, ainsi que l'utilisation de GNU GCC (version ≥ 2.95) et de GNU Make.

3. Se procurer le sources

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.

3.1. L'archive compressée

Elle est disponible à l'adresse :
http://glenux2.free.fr/pub/projets/ProgRepartie/TP4/Archives/

3.2. Le dépôt Subversion

Afin d'obtenir les sources les plus à jour, vous pouvez utiliser le logiciel de contrôle de sources Subversion

$ svn checkout \
  http://websvn.glenux.ath.cx/svn/Cours/M2/Programmation_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é.

4. Utiliser le logiciel

4.1. Compilation

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..

4.2. Exercices

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.

4.2.1. Exercice 1

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 !

4.2.1. Exercice 2

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
[ ... ]

4.2.2. Exercice 2 

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

4.2.3. Exercice 3

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