client | | V serveur [CACHE] (numéro RPC = 1234563) | | V serveur [FIABLE] (numéro RPC = 1234562) | | V serveur [REPARTI] (numéro RPC = 1234561) | | V serveur [STOCKAGE] (numéro RPC = 1234560)Mettez bien une trace dans vos différents serveurs pour voir ce qu'ils font.
Le client fonctionne de la même manière (même protocole) quelque soit le serveur auxquel il s'adresse. Il n'a pas à connaître le type du serveur.
#define TAILLE_NOM 8 /* Longueur du nom de variable */ #define TAILLE_VALEUR 10000 /* Taille d'une valeur */ #define MAXIMUM_DE_VARIABLES 100 /* Nombre maximum de variables */ struct variable { char nom[TAILLE_NOM] ; /* Nom variable ("" si libre) */ char valeur[TAILLE_VALEUR] ; /* Valeur de la variable */ int version ; /* Nombre de modifications de la valeur */ } variables[MAXIMUM_DE_VARIABLES] ;
client MachineA 1234560 STOCKE toto 10 client MachineA 1234560 STOCKE titi 11 client MachineA 1234560 STOCKE tata 12 client MachineA 1234560 RECUPERE tata # Affiche 12 client MachineA 1234560 RECUPERE titi # Affiche 11 client MachineA 1234560 RECUPERE toto # Affiche 10 client MachineA 1234560 DETRUIRE titi client MachineA 1234560 RECUPERE tata # Affiche 12 client MachineA 1234560 RECUPERE toto # Affiche 10 client MachineA 1234560 STOCKE tata 167 client MachineA 1234560 RECUPERE tata # Affiche 167 client MachineA 1234560 RECUPERE toto # Affiche 10 # Tuez le serveur [STOCKAGE] (avec ^C ou un kill) client MachineA 1234560 RECUPERE toto # Sort une erreur
Le serveur [REPARTI] dirigera la fonction que l'on veut exécuter vers le bon serveur [STOCKAGE]
Il choisit le serveur sur lequel il exécute la fonction avec la formule suivante : (somme des caractères du nom de la variable) modulo (le nombre de serveurs)
Attention, a capacité de stockage du serveur répartie est presque celle de la somme des serveurs de stockage.
Il faudra tuer les 3 serveurs [STOCKAGE] au lieu d'un seul dans l'exemple d'utilisation du serveur [STOCKAGE].
Le test doit donner le même résultat.
Ce serveur stocke la données plusieurs fois afin de résister aux pannes des serveurs [STOCKAGE]. Voici comment les fonctions fiables vont réagir:
ON NE DOIT LANCER QU'UN SEUL SERVEUR [FIABLE] SINON IL Y AURA DES INCOHERENCES.
Il faut qu'elle puisse être stockée au moins deux fois sans erreur sinon on boucle en essayant de la stocker.
On relit ensuite les deux ou trois données, si elles ne sont pas identiques, on recommence le stockage.... (au fait, dites moi pourquoi on fait ca)
Attention, a capacité de stockage du serveur fiable est égale à celle du serveur réparti.
client MachineF 1234562 STOCKE toto 10 client MachineF 1234562 STOCKE titi 11 client MachineF 1234562 STOCKE tata 12 # tuer le serveur [STOCKAGE] de Machine1 client MachineF 1234562 RECUPERE toto # Affiche 10 client MachineF 1234562 RECUPERE titi # Affiche 11 client MachineF 1234562 RECUPERE tata # Affiche 12 # tuer le serveur [STOCKAGE] de Machine2 client MachineF 1234562 RECUPERE toto # Affiche 10 client MachineF 1234562 RECUPERE titi # Affiche 11 client MachineF 1234562 RECUPERE tata # Affiche 12 # Relancer le serveur [STOCKAGE] sur Machine1 client MachineF 1234562 STOCKE toto 110 client MachineF 1234562 STOCKE titi 111 client MachineF 1234562 STOCKE tata 112 client MachineF 1234562 RECUPERE toto # Affiche 110 client MachineF 1234562 RECUPERE titi # Affiche 111 client MachineF 1234562 RECUPERE tata # Affiche 112 # Relancer le serveur [STOCKAGE] sur Machine2 client MachineF 1234562 RECUPERE toto # Affiche 110 client MachineF 1234562 RECUPERE titi # Affiche 111 client MachineF 1234562 RECUPERE tata # Affiche 112Vérifier bien que les dernières lectures peuvent déclencher des écritures dans certains cas.
C'est le cache le plus simple, si la donnée a été modifiée depuis la dernière fois, on la recopie.
La structure de donnée utilisée par le cache est la même que pour le serveur de stockage.
Si la version n'a pas changé par rapport à la dernière lecture, il retourne la donnée lue la dernière fois.
Si elle a changé, il récupère la donnée, et la stocke localement ainsi que le nouveau numéro de version. (il doit libérer de la mémoire si nécessaire. Pourquoi ?)
Relancer le test précédent pour vérifier qu'il fonctionne toujours (cette fois en utilisant le cache).