Home

RAPPORT DE STAGE :

image

Contents

1. else return 1 41 Annexe F Initialiseur F 1 start join int total_order_channel start_join char data int size header head amp cmd_buf head head cmdheader cmdpt amp cmd_buf head chead on teste savoir si on est concern i e si on est le premier de la liste int test for int i 0 i lt MAX MEMBER i if cur_get gt status i UNDEF test i break if test my_ident cout lt lt je suis le premier de la liste lt lt endl if cmd_to_send 0 amp amp init_flag 0 head gt sender my_ident head gt num_phase 1 head gt type CMD head gt size CMDHEADSZ cmdpt gt type JOIN 42 cmdpt gt ident 0 cmdpt gt nodeid int data cmdpt gt port int datatsizeof int cmd_message size head gt size cmd_to_send 1 init_flag 1 else cout lt lt start join aborted lt lt my_ident lt lt x lt lt endl else cout lt lt Je NE suis PAS le premier de la liste lt lt endl 43 Annexe G Envois de messages G 1 broadcast int multicast_channel broadcast char ch int sz la socket d mission est d j ouverte if sendto sdw ch sz 0 struct sockaddr amp sock_w sizeof sock w lt 0 perror sendto exit 1 44 Annexe H Fonctionnement du programme H 1 En tant qu initiateur j Mbits n 2 s send buffer advance new me a u phase
2. k sock r sizeof sock r lt 0 085 086 perror bind 087 exit 1 088 089 090 DROBO KEKE 091 092 int gration au groupe 093 094 struct ip_mreq imr 095 096 imr imr multiaddr s addr inet _addr GROUP 097 imr imr_interface s_addr htonl INADDR_ANY 098 099 if setsockopt sdr IPPROTO_IP IP_ADD_MEMBERSHIP void amp imr sizeof struct ip_mreq lt 0 100 101 perror setsockopt IP_ADD_MEMBERSHIP 102 exit 1 103 104 105 DROBO E E E E E E EE KR kk k 27 106 107 108 109 110 cr ation du thread de r ception int int tlle ret pthread_create amp read_thread 0 recept void amp tlle 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 if ret perror no prop printf erreur th create d n ret if ret ENOMEM printf ENOMEM n if ret EINVAL printf EINVAL n if ret EPERM printf EPERM n exit 0 ekk kk kok k k kk k k kk OO OK Kk k kok k a Kk K k Kk suppression de l auto bouclage loopback unsigned char loop 0 if r setsockopt sdw IPPROTO_IP IP_MULTICAST_LOOP amp loop sizeof loop perror setsockopt IP_MULTICAST_LOOP envois des nbmess messages char buffer 300 char message buffer unsigned char tt1 18 if setsockopt sdw IPPROTO_IP IP_MULTIC
3. dire il renseigne la famille des sockets leurs adresses et leur num ro de port et calcule leur taille Les deux sockets font partie de la famille AF INET leur port est celui du groupe multicast la diff rence se situe au niveau de l adresse IP celle de la socket d mission est celle du groupe mais celle de la socket de r ception est une adresse par d faut INADDR ANY Pour cette derni re il doit en plus faire un bind avec son descripteur Ensuite afin de pouvoir recevoir les messages du groupe il s ins crit au groupe multicast en modifiant option IP ADD MEMBERSHIP de 14 la socket de r ception Il modifie aussi le TTL de la socket d mission afin d tendre le champ de communication Apr s cela il fait deux boucles une pour mettre et l autre pour recevoir les messages La premi re se fait sur le nombre de messages mis La seconde quant elle est une boucle infini 4 2 2 Tests Dans un premier temps j ai test avec un seul membre tout se passe bien sauf qu cause de la boucle infinie on est oblig de crasher le processus pour pouvoir le terminer Pour rem dier cela il suffirait de mettre un timout la fin Mais hormis cela tous les messages sont bien mis et re us Si on ajoute maintenant un nouveau membre alors que le premier a envoy et re u tous ses messages tout va bien il re oit tous les messages du nouvel arrivant En revanche si on lance plusieurs processus en m me temps un tr
4. phase code m timeout handler fault handler action mber init unicast Fic H 1 D roulement du programme pour un initiateur 45 L gende code modifi m thode de Ca multicas_channel CJ m thode de total order channel thread utilisateur thread de phase cS thread de reception H 2 En tant que suiveur recept_INIT receive_INIT L gende code modifi m thode de multicas_channel C m thode de total order channel od thread utilisateur thread de phase SS thread de reception Fic H 2 Comportement du programme pour un suiveur 46
5. chitecture des syst mes du CNRS Toulouse dans le groupe de recherche tol rance aux fautes et suret de fonctionnement informatique Employant entre 500 et 530 personnes le LAAS est le plus gros laboratoire du CNRS en raison de ses nombreux partenariats dans l industrie notamment il est galement tourn vers les applications Ses activit s sont tr s diversifi es il comprend en effet quatre principaux p les de recherche le p le Micro et nano syst mes MINAS le p le Mod lisation Optimisation et Conduite de Syst mes MO COSY le p le Robots et Syst mes Autonomes ROSA le p le Syst mes et informatiques Critiques SINC Mon stage a consist adapter au protocole multicast interface r seau d un logiciel d appartenance de groupe et de diffusion ordre total tol rant aux fautes en cours d laboration Pour cela j ai d me familiariser avec le programme d j existant comprendre son fonctionnement sa mani pulation les diff rentes notions informatiques utilis es ne serait ce que le langage de programmation et enfin acqu rir des connaissances suffisantes en multicast afin de pouvoir l impl menter Il s est ensuite agi d tudier et de pr voir l ensemble des modifications n cessaires puis d impl menter ces modifications dans le code Et enfin il fallu tester le programme pour voir s il correspondait bien aux attentes Chapitre 2 Protocole de groupe et de
6. grer int gre le nouvel arrivant en lui attribuant un identificateur qui sera le m me pour tous les membres du groupe car les messages sont d livr s dans le m me ordre et en dehors de la phase lui envoie un message de type INIT lui transmettant ainsi Videntificateur qu il lui a attribu et les donn es du groupe Ensuite la phase suivante tout le monde a mis le groupe jour et en a la m me vision On peut diviser le programme en deux classes C et une application le programme principal cf fig 3 1 qui ont chacun une tache bien sp cifique appli qui comme son nom l indique est l application dans laquelle l utilisateur peut joindre un groupe puis communiquer avec les autres membres de ce groupe dans un chat par exemple la classe total_order_channel qui est la plus grosse partie du code et du processus Elle contient notamment les m thodes deliver et phase_code qui g rent respectivement les messages sortants pour l un et les messages entrants et les r actions du syst me en pr sence d un message pour l autre la classe no_prop_channel qui est quant elle la couche la plus proche du r seau elle g re l acc s au r seau c est dire l initialisation l envoi et la r ception de messages Par ailleurs ce programme se compose de trois threads un thread tant un flux de calcul un thread utilisateur qui est le thread parent celui de d part partir de celui l on cr e un thread
7. x my_ident atoi ipnum status START remplissage de la liste de membres if init_from_file file cout lt lt error opening lt lt file lt lt endl exit 0 status RUN net new multicast_channel this my_ident file my group 33 Annexe D Initiateur D 1 Constructeur multicast channel appropri multicast_channel multicast_channel total_order_channel pt int id char file group admin gpt cout lt lt start multicast channel O from file lt lt endl paaa aaoo AS k kk kk kk kk kk k initialisation my_user pt my_group gpt my_ident id my_port my_group gt port_number my_ident char IPgp my group gt get gp IP int port my group gt get gp port x cr ation et initialisation de la socket d mission sdw socket PF_INET SOCK_DGRAM 0 if sdw lt 0 1 perror socket exit 1 34 memset amp sock_w 0 sizeof sock_w sock_w sin_family AF_INET sock_w sin_port htons port sock w sin addr s addr inet addr IPgp unsigned char loop 0 int r setsockopt sdw IPPROTO IP IP MULTICAST LOOP amp loop sizeof loop if r 1 perror setsockopt IP MULTICAST LO0P initialisation du TTL unsigned char tt1 18 if setsockopt sdw IPPROTO IP IP_MULTICAST_TTL amp ttl sizeof tt1 1 perror setsockopt IP_MULTICAST_TTL initialise input socket and start reading thread x int ret pthread_creat
8. 1 group admin easa ew euh mue as 4 3 2 Int gration au groupe 4 3 3 Envoi de messages lt lt lt lt lt lt lt AA Divers Jao As LL Le eM va 4 4 Fonctionnement et tests lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt 44 1 Fonctionnement BALD OSS ah eu da B ta Se he age Lam 5 Conclusion A Programme test multicast Classe group admin B D ins ney yd Goon NAME En hale ty AOE rok A C total order channel D Initiateur D 1 Constructeur multicast channel appropri D 2 read socket E Suiveur Bel souvesock ANIE e te par Lines Pla me hd E2 init membership s 74 danses Le amp ede Aa B oa Se Ba recept INET ase G6 este 9 en ae S ae eA A d d BA receive INITE rand 2 pad PS RU a BAe i F Initialiseur B Start JOIN ee eta a i ee EEA Oe BR i te ie G Envois de messages Gil broadcast 38534802 BB ARS HOUSE SAS A H Fonctionnement du programme H 1 En tant qu initiateur H 2 En tant que suiveur 1 25 26 31 31 31 33 34 34 39 38 38 39 40 40 42 42 A4 44 le code donn en annexe n est pas exhaustif seules les parties les plus int ressantes des m thodes pr sentant r ellement un int r t sont pr sentes Chapitre 1 Introduction Vai fait mon stage au sein du LAAS Laboratoire d Analyse et d Ar
9. 1 de d calage avec notre phase courante sauf s il s agit d un NACK auquel cas on renvoie le message qu on a envoy lors de la phase pr c dente s il provient de la phase courante alors on trie selon le type du message et on remplit en cons quence le buffer de phase de la phase courante c est dire l tat de chaque membre du groupe le message qu il a envoy s il en a envoy un et le nombre de message de chaque type re us Si le message vient de la phase suivante on stocke le message et on remplit donc le buffer de phase de la phase suivante Les seuls types de messages diff renci s sont le NEW et l INIT si on re oit un NEW on fait appel la m thode start_join qui r dige un CMD de type JOIN qui sera envoy l ensemble du groupe pour ce qui est de PINIT on n en tient compte que si on a le statut PRERUN c est dire qu on a envoy un NEW mais qu on n a pas encore re u le message d initialisation on n est donc pas encore dans le groupe Auquel cas en recevant l INIT on appelle new member init qui fait Vinitialisation gr ce aux donn es contenues dans le message 3 1 4 Le thread de phase Ce thread se compose principalement d une m thode phase_code qui comme son nom l indique g re la phase c est dire les r actions aux mes sages les timeouts et l envoi des messages phase_code se d roule ainsi cf fig 3 2 envoi d un message en attente suiva
10. appelait le constructeur de no_prop_channel qui prenait en entr e un pointeur sur un objet de type total_order_channel construit pr c demment gr ce la m thode init_data qui initialise toutes les donn es Videntificateur un nom de fichier donn afin de distinguer les deux constructeurs l adresse IP et enfin le groupe de l individu Cette m thode initialise les donn es de no_prop_channel cr e le thread de r ception qui appelle read_socket qui ouvre la socket UDP de r ception et l initialise puis qui re oit les messages et les transmet deliver Ensuite on cr e le thread de phase mais tout cela reste identique Maintenant le sch ma d action est le m me except que le constructeur de multicast_channel n est plus le m me il prend toujours les m mes arguments except que l adresse IP transmise n est plus celle de l individu mais celle du groupe et il fait toujours les m mes choses mais en plus il ouvre une socket d mission multicast qu il initialise et qui restera ouverte toute la dur e du programme cela vite d avoir en cr er une chaque fois qu on envoi un message puisque de toute mani re on utilise toujours la m me de m me la socket cr e dans le thread de r ception n est plus une socket UDP mais une socket multicast 17 Avant Maintenant appel de l application initialisation de total_order channel appel de l application initialisation de tot
11. de r ception qui est charg de recevoir les messages et de les analyser gr ce la m thode deliver et si besoin est de r agir si il s agit d un NEW ou d un INIT et ensuite on cr e un thread de phase gui comme son nom l indique g re la phase c est dire les r actions en fonction du comportement du groupe et les timeouts 3 1 2 L utilisateur Il appelle le constructeur de la classe total_order_channel qui r agit de mani re diff rente selon que Von est initiateur ou suiveur Il initialise les donn es de l utilisateur son adresse IP son num ro de port et son groupe Pour cela il appelle le constructeur de la classe no_property_channel ainsi que les diff rentes m thodes correspondantes Dans no_property_channel il cr e galement le thread de r ception Enfin de retour dans total_order_ channel il cr e le thread de phase 3 1 3 Le thread de r ception Ce thread commence par la m thode read_socket qui ouvre une socket UDP de r ception qui reste en permanence a V coute et permet d appeler la m thode deliver d s qu elle re oit un message D taillons maintenant la m thode deliver qui est le processus d analyse des messages re us par la socket d coute Les messages re us sont dans un premier temps tri s selon la phase de l exp diteur puis selon le type du message Si le message provient de la phase pr c dente on l ignore tout comme si par accident il venait d une phase ayant plus de
12. diffusion 2 1 Pr sentation g n rale Il s agit l d un programme de protocole de groupe et de diffusion ordre total tol rant aux fautes Ces notions seront d taill es un peu plus loin mais on peut dire en r sum qu il permet de s inscrire un groupe ou d en constituer un et de communiquer avec ses membres de mani re maintenir un tat commun la composition du groupe et ou la valeur d une variable par exemple et qu il est tol rant aux fautes c est dire aux pannes ou crash de processus Il est utile aux applications coop ratives distribu es qui s affranchissent de plus en plus d un contr le centralis en faveur d un contr le distribu permettant de pallier plus facilement aux pannes du contr leur ou du r seau de communication d viter les probl mes de congestion etc Qui plus est ce programme pr sente l avantage d tre compact il est donc tr s portable Et son d coupage modulaire lui permet galement de s adapter facilement diff rentes interfaces r seau Pour comprendre ce logiciel et son int r t deux choses sont d finir le membership ou protocole de groupe et l atomic broadcast autrement appel diffusion ordre total qui sont les deux principes de base du pro gramme 2 1 1 Protocole de groupe Un protocole de groupe permet entre autre de s inscrire un groupe ou le cr er s il n existe pas communiquer avec les autres membres envoyer
13. et recevoir des mes sages conna tre la composition du groupe et enfin quitter le groupe Parmi les propri t s recherch es nous avons tous les processus d un m me groupe ont la m me vision du groupe les messages de modification du groupe sont d livr s dans le m me ordre tous les membres du groupe les messages de modification du groupe se situent au m me endroit dans le flux des messages pour tous les membres du groupe Ces propri t s sont intimement li es car elles s impliquent mutuellement 2 1 2 Diffusion ordre total L atomic broadcast a entre autre comme propri t s les plus int ressantes dans notre cas si un processus re oit un message m cela implique que tous les processus re oivent m si deux processus re oivent deux messages m1 et m2 alors ils les rece vront dans le m me ordre 2 1 3 R sistance aux fautes Ce logiciel ayant pour but d tre r sistant aux fautes cela signifie qu on veut donc en plus int grer des pannes de sites et de r seau ce qui en vertu de travaux dans ce domaine est impossible r aliser sans restreindre les hypoth ses En effet on rencontre sinon des probl mes d ind cidabilit en cas de pannes de pertes de messages et ou de crash de machines dans un contexte o une borne au d lai de transmission des messages ne peut tre assur e ce qui est le cas ici puisque le programme utilise un protocole UDP qui ne garantit pas la d liv
14. la cr ation du thread ainsi que le test qui l accompagne la ligne 109 int tlle int ret pthread_create amp read_thread 0 recept void amp tlle if ret 15 perror no prop printf erreur th create d n ret if ret ENOMEM printf ENOMEM n if ret EINVAL printf EINVAL n if ret EPERM printf EPERM n exit 0 Ensuite on place la temporisation dans la boucle d mission lignes 143 144 ici on fait une temporisation tous les 10 messages gr ce un modulo que l on peut modifier selon le nombre de messages que l on souhaite envoyer On fait galement une troisi me modification dans les options de la socket d mission on retire l auto bouclage ce qui permet de ne pas recevoir ses propres messages En effet une copie automatique des messages mis tant faite dans le programme on n a pas besoin de les recevoir ce serait redondant Pour pouvoir utiliser une adresse IP pour plusieurs membres d un m me groupe on doit faire int reuse 1 if setsockopt sdr SOL_SOCKET SO_REUSEADDR int amp kreuse sizeof reuse 1 perror setsockopt SO_REUSEADDR et dans ce cas il s av re qu il faut laisser l auto bouclage sinon les membres utilisant la m me adresse IP ne pourront pas communiquer entre eux 4 3 Modification du code Les modifications concernent le protocole r seau elles s op rent sur tout au niveau de no_prop_channel qui d
15. no_prop_channel qui ouvre et initialise une socket UDP d mission envoie le message l adresse indiqu e dans le fichier puis referme la socket Ensuite l utilisateur a le statut PRERUN jusqu ce qu il recoive un INIT 18 Maintenant On utilise maintenant des sockets multicast pour la plupart des commu nications on n a donc plus besoin des coordonn es d un membre du groupe pour pouvoir le joindre on envoie un NEW via la socket multicast ce qui se passe du c t de l interlocuteur sera d taill plus loin et on attend la r ponse sur une socket particuli re qui elle est une socket UDP en effet la r ponse ne sera pas envoy e via le multicast Cela se passe ainsi appel du constructeur de multicast_channel appropri qui prend tou jours les m mes choses en entr e dans ce cas l adresse IP reste celle de l utilisateur et elle fait toujours les m mes choses except que la socket de r ception cr e dans le thread du m me nom est une socket multicast et non plus UDP appel ouv_sock_INIT qui est une m thode de multicast_channel qui ouvre une socket de r ception UDP temporaire ayant pour seul but de recevoir le message d initialisation appel de start_net_init qui r dige un message de type NEW conte nant ses donn es personnelles adresse IP et num ro de port permet tant son interlocuteur de lui renvoyer VINIT via une socket UDP et le transmet ainsi que les coordonn es du grou
16. sz 0 struct sockaddr amp sock_w sizeof sock_w sz cout lt lt erreur sendto sz lt lt sz lt lt res lt lt test lt lt endl return 3 on laisse la socket ouverte de mani re ne pas avoir l ouvrir en permanence return 0 39 E 3 recept INIT int multicast channel recept INIT char IPgp int port r ception de 1 INIT int size type fromlen ret struct sockaddr_in client char message 64000 char pt pt message fromlen sizeof client int res 1 do ret recvfrom sdr_tp pt 64000 0 struct sockaddr amp client amp fromlen if ret 1 cout lt lt erreur recvfrom start read socket lt lt endl return 3 cout lt lt INIT recu lt lt endl res my_user gt receive_INIT IPgp port pt ret Jwhile res 0 close sdr tp E 4 receive INIT int total order channel receive INIT char IPgp int port char data int size int ret int sender mess phase type mess size int indent faulty header head header data 40 sender head gt sender type head gt type mess_phase head gt size mess_size head gt size if mess_size size HEADSZ cout lt lt Problem of message size got lt lt size HEADSZ lt lt expected lt lt mess_size lt lt endl char datapt data HEADSZ if type INIT init_from_net IPgp port datapt mess_size status RUN return 0
17. AST_TTL amp tt1 sizeof ttl 1 perror setsockopt IP_MULTICAST_TTL for int i 0 i lt nbmess i sprintf message message no d de d x i id int j strlen message if i410 sleep 1 if sendto sdw message j 0 struct sockaddr amp sock_w len_w lt 0 146 28 147 perror sendto 148 exit 1 149 150 cout lt lt envoi message lt lt i lt lt OK lt lt endl 151 152 153 kkkkk k k k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk 154 155 sleep 20 156 157 quitter le groupe 158 if setsockopt sdr IPPROTO_IP IP DROP MEMBERSHIP amp imr sizeof imr 1 159 perror setsockopt IP_DROP_MEMBERSHIP 160 161 close sdr 162 close sdw 163 164 return 0 165 166 167 RRC AO k k kk 168 RAR ARR ARR AR AR AR AO AO AAA OA AO AR OR k kk 169 170 void recept void tlle 171 172 r ception des messages du groupe 173 cout lt lt r ception lt lt endl 174 char buffer 300 175 char mess_r buffer 176 int t 0 177 while 1 178 179 int cnt 180 cnt recvfrom sdr mess_r sizeof buffer 0 struct sockaddr amp sock_r amp len_r 181 if cnt lt 0 182 183 perror recvfrom 184 exit 1 185 186 else if cnt 0 fin de transmission 187 break 188 t t 1 29 cout lt lt message lt lt t lt lt 30 lt lt mess r lt lt endl Annexe B Classe gro
18. RAPPORT DE STAGE Adaptation au multicast d un logiciel d appartenance de groupe et de diffusion ordre total tol rant aux fautes Alexandra COPP mai juin 2006 Table des mati res 1 Introduction 2 Protocole de groupe et de diffusion 2 1 Pr sentation g n rale 2 1 1 Protocole de groupe 2 1 2 Diffusion ordre total 2 1 3 R sistance aux fautes lt lt lt lt lt lt lt 2 2 Pr sentation de l algorithme 3 Pr sentation du programme 3 1 Explication du fonctionnement et du code du programme 3 1 1 Int gration au groupe 3 1 2 L utilisateur lt lt lt lt lt lt lt 4 a 3 1 3 Le thread de r ception 3 1 4 Le thread de phase 3 2 Les threads 34 z V888 0 ak einige Goh mu Me qui Aou AE 3 3 Adresses IP et sockets 3 4 Participation personnelle 4 Protocole r seau Multicast 4 1 Pr sentation du multicast et int r t dans notre cas 4 1 1 Pr sentation 41 2 Int r t 42 1Cod Test ies 88 eles of ROH ae a BBA ed aya ES me fee QUE we 4 421 Code initial che eere ches eae n vas pa als amp BD D gt ests aun ga ie dus 8 UE da is he AMES Lu 42 3 Modifications et cons quences 4 3 Modification du code 4 3
19. al_order channel x initialisation du groupe partir d un fichier initialisation des buffers de phase initialisation de multicast_channel ouverture de la socket d mission multicast cr ation du thread de reception initialisation du groupe partir d un fichier initialisation des buffers de phase initialisation de no_property_channel cr ation du thread de reception J cr ation du thread de phase cr ation du thread de phase Fic 4 1 Modification du comportement d un initiateur Le constructeur de multicast_channel et read_socket sont en annexe D Suiveur Avant Le nouveau membre r cup rait dans un fichier l adresse IP et le num ro de port d un membre du groupe qui il envoyait un message de type NEW et il attendait la r ponse l INIT sur la socket UDP de r ception Cela se traduisait ainsi appel au constructeur de no_prop_channel appropri qui prend en en tr e un pointeur sur un objet de type total_order_channel l adresse IP de Vutilisateur et son groupe Il initialise les donn es de mani re temporaire puis cr e le thread de r ception qui ouvrira la socket UDP de r ception appel la m thode start_net_init qui prend en entr e le nom d un fichier qui contient l adresse IP et le num ro de port d un membre du groupe Il cr e un message type NEW qu il transmet avec le nom du fichier la m thode init_membership de
20. ck_r amp fromlen cout lt lt message recu lt lt endl if ret 1 cout lt lt erreur recvfrom start read socket lt lt endl return 3 my_user gt deliver pt ret return 0 37 Annexe E Suiveur E 1 ouv sock INIT int multicast channel ouv sock INIT cr ation de la socket de r ception UDP temporaire cout lt lt r ception de 1 INIT lt lt endl if my_port 1 my_port BASEPORT if sdr tp socket AF INET S0CK DGRAM 0 lt 0 cr ation d une socket UDP cout lt lt erreur socket start read socket lt lt endl return 1 sock_r_tp sin_family AF_INET sock_r_tp sin_port htons my port sock_r_tp sin_addr s_addr htonl INADDR_ANY int iter 1 do if bind sdr_tp struct sockaddr amp sock_r_tp sizeof sock_r_tp 1 my_port 38 sock_r_tp sin_port htons my port iter continue else break while iter lt 10 if iter 10 cout lt lt erreur start read socket lt lt endl exit 2 return 0 E 2 init membership int multicast_channel init_membership char gpIP int gpPort char ch int sz FILE f int ret test int sock host port char ip 15 struct sockaddr_in nom struct hostent hp ouverture de la socket d mission voir code de multicast_channel de l initiateur on envoie le message if test sendto sdw ch
21. correction de cet algorithme est qu il n y a pas deux phases cons cutives avec des erreurs En effet il a t montr que s il y a eu n phases avec des membres fautifs il ne peut y avoir consensus qu la n 1 e phase C est cette hypoth se qui permet de pallier partiellement au probl me d ind cidabilit Chapitre 3 Pr sentation du programme application channel_user total_order_channel L gende thread utilisateur broadcast no_prop_channel RSE thread de phase Fic 3 1 Sch ma du programme thread de reception 3 1 Explication du fonctionnement et du code du programme 3 1 1 Int gration au groupe Pour int grer un groupe il y a deux proc dures possibles selon que le groupe existe ou non si le groupe n existe pas alors on est initiateur On doit donc cr er le groupe partir d un fichier dans lequel on trouve son identificateur son adresse IP et son num ro de port Ensuite le fait d tre le seul membre du groupe ne pose pas de probl me au bon d roulement du programme si le groupe existe d j toute personne qui souhaite Vint grer doit envoyer un message de type NEW un membre dont il a r cup r les coordonn es dans un fichier Ce dernier la phase suivante envoie un message de type JOIN l ensemble du groupe En r action chaque membre augmente le timeout de sa phase afin de laisser au nouveau venu le temps de s int
22. de application initialisation de total_order channel initialisation de _cr ation du thread de reception no_property_channel cr ation du thread de reception sur lequel on attend INIT ouverture de la socket UDP pour la reception de INIT r daction du NEW i r daction du NEW AUTRE d une socket cr ation de la socket d emission d emission UDP multicast envoi du message envoi du NEW fermeture de la socket cr ation du thread de phase reception de I INIT initialisation des donn es fermeture de la socket UDP i cr ation du thread de phase Fic 4 2 Modification du comportement d un suiveur Des parties de init_membership ouv_sock_INIT init_membership init_membership recept_INIT et de receive_INIT sont en annexe E Initialiseur Il s agit de la r action d un membre du groupe face l arriv e d un nou veau membre Avant Le nouveau membre envoyait un NEW un membre du groupe qui en voyait son tour un JOIN l ensemble du groupe afin de faire savoir l arriv e d un nouveau membre afin que chacun mette son groupe jour et attribue le m me identificateur et envoie un INIT au nouveau venu Maintenant L ensemble du groupe re oit le NEW via le multicast mais afin que tout le monde lui attribue le m me identificateur un membre doit se d signer gr ce un test pour envoyer un JOIN au groupe et e
23. e kread thread O start thread void this if ret perror no prop printf erreur th create d n ret if ret ENOMEM printf ENOMEM n if ret EINVAL printf EINVAL n if ret EPERM printf EPERM n exit 0 D 2 read socket int multicast channel read socket int ret size type fromlen struct sockaddr_in client 39 int port my_group gt get_gp_port char IPgp my group gt get gp IP char message 64000 char pt pt message if my port 1 my port BASEPORT if sdr socket PF INET S0CK DGRAM 0 lt 0 cout lt lt erreur socket start read socket lt lt endl return 1 memset amp sock_r 0 sizeof sock_r sock_r sin_family AF_INET sock_r sin_port htons port sock_r sin_addr s_addr htonl INADDR_ANY if bind sdr struct sockaddr amp sock_r sizeof sock_r lt 0 perror bind exit 1 integration au groupe imr imr multiaddr s addr inet addr const char IPgp imr imr interface s addr htonl INADDR ANY cout lt lt imr initialise lt lt endl if setsockopt sdr IPPROTO IP IP ADD MEMBERSHIP void amp imr sizeof struct ip mreg lt 0 perror setsockopt IP_ADD_MEMBERSHIP exit 1 fromlen sizeof sock_r cout lt lt int gration au groupe multicast OK lt lt endl 36 fore ret recvfrom sdr pt 64000 0 struct sockaddr amp so
24. es threads partageant certaines zones m moire on doit utiliser des s maphores ou mutex pour g rer cela Dans notre cas l envoi et la r ception de messages sont respectivement communs aux threads phase et utilisateur et aux threads phase et r ception Les mutex fonctionnent ainsi ils permettent de bloquer une zone m moire afin d em p cher deux routines de lire ou d crire dessus au m me moment Le mutex peut prendre deux valeurs 0 ou 1 s il est 0 cela signifie qu il est libre et donc inversement s il est 1 alors il est occup On manipule les mutex ainsi on commence par demander le mutex s il est 1 alors on attend qu il passe 0 c est dire qu il soit lib r d s qu il est 0 on le met 1 pour le bloquer on fait ce qu on a faire puis on le lib re c est dire qu on remet sa valeur 0 11 3 3 Adresses IP et sockets Ici la manipulation des adresses IP et des sockets se fait via un protocole UDP qui ne garantit ni l int grit ni l ordre des messages Les sockets quant elles sont les interfaces avec le r seau elles permettent l envoi et la r ception de messages gr ce une adresse IP et un num ro de port La manipulation des sockets se limite louverture Vinitialisation et la fermeture 3 4 Participation personnelle Ma participation V laboration de ce programme a consist modifier la partie interface avec le r seau de mani re ce qu elle
25. evient d ailleurs par l m me multicast_channel mais galement au niveau de Vint gration d un nou veau membre de la classe group_admin et de la communication broadcast 4 3 1 group admin On doit modifier la classe group_admin En effet la nature du groupe a chang il s agit maintenant d un groupe multicast il prend donc en compte deux attributs de plus que sont l adresse IP et le num ro de port Le pre mier tant un pointeur sur une cha ne de caract re et le second un entier ces deux attributs correspondent donc des m thodes qui sont un nou veau constructeur prenant en arguments l adresse IP et le num ro de port deux m thodes permettant de r cup rer ces attributs ainsi que deux autres permettant de les initialiser Les nouveaux attributs et m thodes cette classe sont en annexe B 16 4 3 2 Int gration au groupe Pour modifier l int gration au groupe on est oblig de modifier la fois multicas_channel et total_order_channel on modifie les m thodes d j existantes mais on en cr e aussi de nouvelles Pour montrer ces modifica tions voyons pour chaque cas l ancien processus et le nouveau Pour avoir une vision d ensemble de l initialisation suivant que l on est initiateur ou suiveur une partie du code du constructeur de total_order_ channel est en annexe C Initiateur Tout se passe comme avant jusqu l appel du constructeur de multicast channel appropri Avant on
26. fois si un CMD a t re u si c est un JOIN parcourt de tout le groupe jusqu au premier identificateur ind fini rencontr qui est alors d clar alors comme tant un nouveau membre et est renseign avec les donn es du JOIN si c est un QUIT suppression du membre concern parcourt de la liste une derni re fois s il y a des nouveaux membres appel de la m thode new member init qui r dige un message de type INIT qui est envoy au nouveau membre et ensuite modification de son statut de mani re l identifier comme tant int gr retour dans phase_code appel de la m thode phase_update qui met jour les buffers de phase pour passer la phase suivante 10 lock phase mutex d clencheur de phase rien faire O actions en attente phase_update mise jour de la phase broadcast C4 timeout O0 envois de NACK timeout trylock phase mutex all received fault handler analyse des fautifs phase actions prise de d cision et analyse des messages F1G 3 2 D roulement d une phase 3 2 Les threads Les threads comme dit pr c demment sont des flux de calcul ils per mettent de mener plusieurs activit s diff rentes de mani re simultan e Ils s organisent de mani re filiale c est dire qu on a un thread parent qui en gendre les autres il faut noter que si le thread parent meurt les threads descendants feront de m me L
27. i augment progressivement le nombre de processus pour voir si les crash taient bien d tect s et si le consensus se passait bien Puis enfin j ai lanc un grand nombre de processus en alternant les crash et les demande d inscriptions pour tester les limites du programme voir son comportement dans des conditions limites 24 Chapitre 5 Conclusion Ce stage m a beaucoup apport tant au niveau personnel qu au niveau de mes connaissances Au niveau des connaissances j ai pu atteindre mon but qui tait d approfondir mes connaissances en informatique je suis m me all e au del de mes attentes car j ai d couvert des domaines qui m taient totalement inconnus le protocole r seau et la programmation multi thread e Cela m a galement permis de mieux voir les applications de l informatique et les probl mes que l on peut rencontrer au del de ce qu on a vu en cours M me si je n ai pas particuli rement approfondi un domaine cela m a permis d en aborder plusieurs ce qui me semble plus int ressant Au niveau personnel ce stage m a prouv que je pouvais m adapter un domaine que je ne maitrisais pas cela m a mise en confiance Et le fait de r aliser une t che qui ait une utilit et une application est quelque chose de particuli rement valorisant et motivant Ce stage tant pr vu comme stage de DEA le d veloppement de ce lo giciel est loin d tre termin et d autres perfectionnement
28. ion d un identificateur 4 y haque participant envoie un INIT au nouveau membre hors de la phase 4 F1G 4 3 Modification de l initialisation d un nouveau membre start join est en annexe F 4 3 3 Envoi de messages Avant Il y avait avant trois types d envoi de message le broadcast qui permettait d envoyer l ensemble du groupe en fai sant une boucle sur le nombre de membre dans laquelle on envoyait le 21 message chaque membre s par ment le multicast qui permettait d envoyer le message une liste de membre utilis pour l envoi de NACK mais qui fonctionnait sur le m me prin cipe que le broadcast enfin l unicast qui permettait d envoyer une seule personne il est notamment utilis pour l entr e d un nouveau membre Ces types d envois ont en commun de cr er une socket temporaire chaque fois qu ils sont appel s Maintenant Le multicast permet d envoyer les m me message plusieurs destinataires en l envoyant une seule adresse l adresse multicast Pour cette raison on modifie les proc dures d envoi on n en conserve plus que deux le broadcast et le multicast le broadcast utilise la socket multicast d j cr e cette m thode se contente donc d envoyer le message l adresse multicast Il est utilis pour quasiment tous les envois sauf pour Vinitialisation d un nouveau me
29. les proc dures d envoi et de r ception L adresse multicast est une adresse IP classe D il s agit d une adresse immat rielle dite adresse de groupe elle est comprise dans la gamme allant de 224 0 0 0 239 255 255 255 mais pour des causes de r servations il faut restreindre cette gamme de 224 0 0 255 239 0 0 0 en effet les autres adresses sont d j utilis es Ensuite on se rejoint ou on quitte le groupe gr ce une option de la socket de r ception que l on modifie grace la commande setsockopt Cette commande permet gale ment de modifier les options d une socket Notamment le TTL time to live qui permet de restreindre ou d tendre le champs d mission des messages Ensuite V change de message se fait comme pour un protocole UDP unicast gr ce sendto et recvfrom la seule chose qui change r side donc dans Vinitialisation des sockets et dans les options 13 4 1 2 Int r t Le multicast permet donc d envoyer un m me message plusieurs uti lisateurs tout en n ayant manipuler et donc conna tre qu une adresse IP et un num ro de port ceux du groupe multicast On n a donc plus be soin de conna tre et donc de stocker les adresses IP et les num ros de port individuels des membres du groupe J ai choisi de les conserver afin de ne pas trop modifier total order_channel et ainsi conserver la modularit du programme mais ils ne sont plus utiles Le seul moment o on manipule ce genre de don
30. mbre l unicast se fait gr ce une socket UDP on doit donc cr er une socket UDP temporaire pour l envoi du message que l on ferme juste apr s broadcast est en annexe G 4 3 4 Divers Les autres modifications sont des modifications mineures qui r sultent de celles d crites pr c demment Notamment au niveau des arguments de certaines fonctions On a galement modifi l g rement le deliver on en a retir l analyse des INIT en effet il n est pas re u sur la m me socket on a pr f r le distinguer et l int grer au processus d int gration 22 4 4 Fonctionnement et tests 4 4 1 Fonctionnement Le d roulement entier du code est en annexe H En tant qu initiateur total order channel ini from fi le L gende nw m thodes modifi es m thodes de total_order_channel m thodes de multicast channel F1G 4 4 D roulement de Vint gration pour un initiateur En tant que suiveur 2 L gende m thodes modifi es 8 9 m thodes de x 5 GO total order channel oup admin is m thodes de 6 multicast channel ouv sock INIT F1G 4 5 Comportement de l int gration pour un suiveur init from net init membership Mode d emploi Pour manipuler le programme on doit r diger une application appli qui nous permettra de le tester Ce programme prend en entr e l option 0 si on est initiateur 1 si on est suiveu
31. n es personnelles est lors de l envoi d un unicast ce qui n a lieu que lors de l initialisation d un nouveau membre et dans ce cas on transmet ces donn es partir du JOIN re u Le multicast simplifie aussi l int gration au groupe en effet on n a plus conna tre les coordonn es d un membre il suffit de conna tre celle du groupe on peut envisager d attribuer au groupe un identifiant permettant ainsi de r cup rer ses coordonn es dans un fichier Le broadcast est galement simplifi puisqu on n a plus envoyer les messages chaque destinataire un par un le processus est donc plus rapide 4 2 Code test Avant de modifier le code pour comprendre le multicast j ai r dig un programme test tr s basique qui a juste pour but de tester le multicast et de me familiariser avec son codage Afin de pouvoir ensuite l appliquer notre cas 4 2 1 Code initial Le programme est tr s simple Il est constitu d un main et prend en entr e le num ro de port le nombre de messages que l on souhaite envoyer et un identificateur qui aidera mieux analyser les affichages obtenus lors des tests L adresse IP et le num ro de port du multicast sont eux en dur dans le programme pour plus de facilit Le programme commence par ouvrir deux sockets permettant de com muniquer avec le r seau une socket d mission pour envoyer des messages et une socket d coute pour en recevoir Ensuite il les initialise c est
32. n utilise plus un pro tocole UDP mais multicast afin de simplifier et de clarifier l int grations un groupe et les changes En raison de la division en classe cela s est essen tiellement r sum remplacer la classe no_prop_channel par une nouvelle classe baptis e multicast_channel qui n utilise plus un protocole UDP mais un protocole multicast les modifications faire dans total_order_channel furent mineures cela r sultant de la modularit du programme Il s est donc agi de remplacer une interface r seau par une autre 12 Chapitre 4 Protocole r seau Multicast 4 1 Pr sentation du multicast et int r t dans notre cas 4 1 1 Pr sentation Dans le cas du protocole UPD unicast les messages sont envoy s direc tement au destinataire on a donc besoin d une adresse IP et d un num ro de port pour chaque destinataire et si on doit envoyer un message identique plusieurs processus on doit l envoyer chacun s par ment Le protocole multicast quant lui est un protocole UDP particulier car il simplifie le pro cessus au lieu d envoyer plusieurs versions du message on envoie un seul message l adresse du groupe multicast et c est le protocole r seau qui se charge de transmettre le message l ensemble des membres Pour recevoir les messages on doit d abord s inscrire au groupe multicast ce qui n est pas n cessaire pour envoyer des messages aux membres inscrits Cela simplifie donc
33. nsuite la proc dure reste la m me qu avant Cela se passe ainsi 20 le NEW est transmis deliver par la socket de r ception une fois identifi comme tant un NEW deliver appelle la m thode start join start_join fait le test qui dans notre cas consiste voir qui est le premier membre de la liste et voir si on est ce premier membre Auquel cas on r dige un JOIN s il n y pas eu d erreur la phase pr c dente le CMD tant le second dans l ordre de priorit des message envoyer dans phase code on broadcast le JOIN la phase suivante tous les membres re oivent le JOIN dans le m me ordre ils int grent le nouveau groupe en lui attribuant un identificateur et r digent un INIT qu ils envoient via unicast hors phase il n y a pas de modification dans cette derni re partie du processus c est la raison pour laquelle elle n est pas d taill e plus que cela ici Avant Maintenant tout le monde recoit un NEW un participant recoit un NEW test pour designer le participant qui en tiendra compte ce participant envoie un JOIN l ensemble du groupe y chaque participant recoit le JOIN int gration du nouveau membre attribution d un identificateur haque participant envoie un INIT au nouveau membre hors de la phase ce participant envoie un JOIN l ensemble du groupe i chaque participant recoit le JOIN int gration du nouveau membre attribut
34. nt le type si message de type FAULT message contenant l ensemble des pro cessus d clar s fautifs c est dire ceux dont on n a pas re u de message la phase pr c dente envoi de ce message sinon si message de type CMD JOIN ou QUIT message indiquant une demande d adh sion ou de r siliation d un membre envoi de ce message sinon si message de type MESS message de l application envoi de ce message sinon si message de type ACK message vide signifiant simplement l acquittement de la phase pr c dente envoi de ce message si on n a pas re u tous les messages de la phase courante et que le timeout arrive ch ance appel de la m thode timeout_handler pour envoyer un NACK message de non r ception aux membres dont on n a pas re u de message si on a re u tous les messages de la phase ou que le troisi me timeout est coul on sort de la phase Si le timeout est coul c est 4 dire qu on n a pas recu tous les messages attendus appel de la m thode fault_handler elle supprime les membres pour lesquels on est toujours en attente et r dige un message de type FAULT qui sera envoy a la phase suivante appel de la m thode phase_actions elle analyse le buffer de phase et r agit en fonction parcourt de la liste des membres si un membre a t d clar fautif il est supprim du buffer de phase suivant et du groupe parcourt de la liste un seconde
35. pe multicast la m thode init_membership de multicast_channel Cette derni re ouvre une socket d mission multicast qui restera ouverte puisque ce sera celle utilis e par la suite puis elle envoie le NEW au groupe multicast Ensuite une fois revenu dans le constructeur on initialise le statut PRERUN ce qui vite de tenir compte des messages re us sur la socket de r ception multicast appel de recept_INIT qui est une m thode de multicast_channel qui attend gr ce une boucle infinie la r ception d un INIT et qui trans met les messages re us la m thode receive_INIT de total_order_ channel avant de fermer la socket de r ception temporaire d s qu un message de type INIT a t re u receive_INIT analyse le message v rifie qu il s agit bien d un INIT et auquel cas elle les transmet la m thode init_from_ net et elle initialise le statut RUN Si le mes sage et bien un INIT elle renvoie 0 ce qui permet de sortir de la boucle de recept_INIT et de fermer la socket sinon elle renvoie 1 init from net initialise les donn es de l utilisateur gr ce l identi ficateur transmis par le groupe les donn es du groupe et les buffers de phase Ensuite l initialisation est termin e l utilisateur fait partie du groupe et il n est plus distinguable des autres 19 Avant Maintenant appel de l application initialisation de total_order channel initialisation de multicast_channel appel
36. r l adresse IP individuelle si on est suiveur ou l identifiant si on est initiateur le nom d un fichier ou si on est utilisateur 23 on r cup re la liste des membres le nombre n de messages que l on souhaite envoyer et enfin l adresse IP et le num ro de port multicast du groupe On lance le programme en appelant le constructeur de total_order_channel puis on fait une boucle qui permet de r diger n messages de l application Pour appeler cette application on fera donc selon si on est respectivement initiateur ou suiveur appli O 1 voisini dat 100 238 1 6 6 55501 appli 1 140 93 0 13 voisini dat 100 238 1 6 6 55501 4 4 2 Tests Hormis les tests de debuggage permettant de v rifier que le programme fait bien ce qu on attend de lui c est dire mettre recevoir des messages d tecter et d clarer un processus fautif en accord avec les autres membres du groupe il faut galement tester la r sistance du groupe Pour tout cela j ai r alis diff rents tests me permettant de modifier et corriger le code de mani re ce qu il r ponde mieux aux attentes J ai commenc par lancer un seul processus afin de voir si il ouvrait correctement les sockets si son initialisation se passait correctement et s il communiquait bien m me si ce n est qu avec lui m me Puis j ai lanc deux processus ensemble pour tester l initialisation en tant que suiveur et pour voir si la communication se passait bien Ensuite j a
37. rance des messages 2 2 Pr sentation de l algorithme Le fonctionnement du logiciel est bas sur la notion de phase Au cours d une phase les participants s changent des messages et ils ne sortent de la phase que lorsque tous les messages de cette phase ont t re us De cela il d coule une propri t qui veut que m me si tous les participants ne sont pas dans la m me phase au m me moment il y a au plus une phase de diff rence entre deux d entre eux c est dire qu un instant donn quel qu il soit il n existe que deux types de phase i et i 1 des requ tes peuvent galement tre envoy es aux membres dont le message n a pas encore t d livr elles r sultent de l arriv e ch ance d un timeout et elles permettent de pallier le probl me de possible perte de messages d l utilisation d un protocole UDP Il y a donc une deuxi me fa on de sortir de la phase l arriv e a ch ance du timeout global ce qui traduit l existence de processus fautifs les participants prennent une d cision sur l tat du groupe la phase pr c dente partir des messages re us la phase courante ceux ci tant en effet les bilans de la phase pr c dente faits par chaque membre Si les hypoth ses de correction du protocole sont satisfaites tous les membres prennent la m me d cision quant l tat du groupe ils ont donc la m me vision du groupe L hypoth se de
38. s grand nombre de messages sont perdus D ailleurs plus on augmente le nombre de messages mis plus la proportion de messages perdus augmente On explique cela par la rapidit du processus et le chevauchement des t ches et des informations On observe par exemple que si un processus re oit des messages d un nouveau membre alors qu il est en train de recevoir les siens il abandonne la r ception de ses propres messages au profit de ceux du nouvel arrivant De m me les processus ont tendance ne pas recevoir les derniers messages qu ils ont envoy s alors qu ils sont re us par les autres processus Pour rem dier tout cela j ai temporis l envoi des messages en ins rant des sleep avec un certain intervalle J ai galement s par l mission de la r ception en cr ant un thread de r ception 4 2 3 Modifications et cons quences La quasi int gralit du code final est en annexe A La premi re modification est la cr ation du thread de r ception On laisse l ouverture et Vinitialisation de la socket de r ception dans le main mais on doit sortir la boucle de r ception pour la mettre dans une fonction s par e qui prend obligatoirement un void en entr e Pour cette raison on met en entr e un argument qui ne sera pas utilis par la suite On met galement en dehors des fonctions toutes les variables concernant les sockets afin de pouvoir les manipuler aussi bien dans le main que dans la fonction On ins re donc
39. s sont donc envisa geables 25 Annexe A Programme test multicast 020 021 022 023 024 025 026 027 028 029 void recept void thread routine thread_t read_thread int sdr sdw sockaddr_in sock_r sock_w int len_r len_w ke kok kok skok GOO 2k 2k KK Kk kok skok LL Kk k k J Ak k k k k k kk RG OO KK OK kok skok skok KK k k l adresse IP le num ro de port de la machine et l identificateur sont donnes en arguments 030 031 032 044 045 046 047 048 049 050 052 053 int main int argc char argv int noport nbmess id r cup ration des donn es dans argv CTT IE kok kok kok kok EEE kok EEK ouverture de la socket de r ception sdw socket PF_INET SOCK_DGRAM 0 if sdw lt 0 perror socket exit 1 de m me ouverture de la socket d coute 26 DOO kok k k skok k k kk k OK k k kk kok kk kk kk k 065 066 initialisation de la socket d mission 067 068 memset amp sock_w 0 sizeof sock_w 069 sock_w sin_family AF_INET 070 sock_w sin_port htons PORT O71 sock_w sin_addr s_addr inet_addr GROUP 072 073 len_w sizeof sock_w 074 075 initialisation de la socket d coute 076 O77 memset amp sock_r 0 sizeof sock_r 078 sock_r sin_family AF_INET 079 sock_r sin_port htons PORT 080 sock_r sin_addr s_addr hton1 INADDR_ANY 081 082 len r sizeof sock r 083 084 if bind sdr struct sockaddr
40. up admin B 1 Le h class group_admin public arguments int port char nolP m thodes constructeur avec num ro port et adresse IP group_admin int char void set_gp_port int void set_gp_IP char retrouver le num ro de port partir d un identifiant int get_gp_port char get_gp_IP retrouver le no IP du gpe define MEMBSZ sizeof struct member B 2 Le cpp group_admin group_admin int no_port char addr_IP groupsize 0 port no_port nolP addr_IP 31 for int i 0 i lt MAX MEMBER i members_list i ident UNDEF DEO OOOO OOOO GO I SLT k kk int group admin get gp port return port void group_admin set_gp_port int pt port pt ke kok kok skok skok ak ak kok skok 2k k ak 2k kok kok skok kok kok kok skok 2k 2K 2K k Fk Kk kok okokokokokokokokokok char group admin get gp IPO freturn noIP void group admin set gp IP char IP noIP IP 32 Annexe C total order channel total_order_channel total_order_channel int flag char file char ipnum char ipgp char port if flag 1 following member strcpy ipadd ipnum status START initialisation net new multicast channel this ipnum my group int ouv net gt ouv_sock_INIT cr ation de la socket d mission et envoi du NEW start net init gpIP port gp status PRERUN ouv net gt recept INIT gpIP port gp else if flag 0 first member

Download Pdf Manuals

image

Related Search

Related Contents

Download: HM_saw_generic_manual_en  Le télécharger  Samsung HT-DS610 Manuel de l'utilisateur  Projecta HD Fast-Fold Deluxe Adjustable Skirt Bar 373 x 640  Netra CP2040 Technical Reference and Installation Manual  Bedienungsanleitung Schaltgerät Aqualift Comfort 230V Mono/Duo  Service Manual  User`s Manual  Filiera Cerealicola: Principali fattori di rischio 1. Introduzione  Ringer 3050 Instructions / Assembly  

Copyright © All rights reserved.
Failed to retrieve file