2012-10-04 2 views
0

Je débogue mon application (sorte de suite à an earlier question), qui est essentiellement un client pair à pair. Il fonctionne comme suit:Deux envois simultanés verrouillent les deux programmes

  • Peer 1 demande un bloc (ou plusieurs blocs) de Peer 2
  • Peer 2 reçoit la demande, et envoie les blocs arrière

Et le cycle plus ou moins répète. Cela fonctionne très bien pour les fichiers plus petits, mais avec tout fichier qui doit être divisé en un plus grand nombre de morceaux (disons 250 morceaux de 512 octets), il meurt.

Exécution strace Peer 2 (celui qui reçoit les demandes) ressemble à ceci:

....  
[pid 11731] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f03d0ac9000 
[pid 11731] lseek(400, 200704, SEEK_SET) = 200704 
[pid 11731] read(400, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024 
[pid 11731] read(400, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 
[pid 11731] sendto(5, "SF\0\0\1\212\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 522, 0, NULL, 0) = 522 
[pid 11731] select(6, [4 5], NULL, NULL, NULL) = 1 (in [5]) 
[pid 11731] recvfrom(5, "BB\0\0\0\t\0\0\1\213\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, NULL) = 300 
[pid 11731] open("test.dat", O_RDONLY) = 401 
[pid 11731] fstat(401, {st_dev=makedev(8, 4), st_ino=9187328, st_mode=S_IFREG|0644, st_nlink=1, st_uid=1000, st_gid=1000, st_blksize=4096, st_blocks=20480, st_size=10485760, st_atime=2012/10/03-10:25:29, st_mtime=2012/10/03-10:25:34, st_ctime=2012/10/03-10:25:34}) = 0 
[pid 11731] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f03d0ac8000 
[pid 11731] lseek(401, 200704, SEEK_SET) = 200704 
[pid 11731] read(401, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1536) = 1536 
[pid 11731] read(401, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 
[pid 11731] sendto(5, "SF\0\0\1\213\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 522, 0, NULL, 

Et les résultats de strace sur Peer 1 (celui qui envoie les requêtes) ressemble à ceci:

.... 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\213\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\214\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\215\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\216\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\217\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\220\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0) = 300 
[pid 11741] sendto(5, "BB\0\0\0\t\0\0\5\221\0\0\2\0test.dat\0\0\0\0\0\0\0\0\0\0"..., 300, 0, NULL, 0 

Les deux meurent lors de l'envoi. Je ne suis pas entièrement sûr pourquoi. Si quelqu'un peut faire la lumière sur ce sujet, je l'apprécierais vraiment!

+1

Mourir? Bloc? Lequel est-ce? – EJP

Répondre

0

Vos envois bloquent parce que l'homologue ne les lit pas. Cela provoque le remplissage du tampon de réception de l'homologue, ce qui provoque le remplissage du tampon d'envoi des expéditeurs, ce qui provoque le blocage de send().

+0

Cela a du sens ... y a-t-il un moyen facile de vider le tampon d'envoi ou est-il préférable de simplement restructurer les choses? –

+0

@the_man_slim Vous êtes mieux à même de lire ce que le pair vous envoie, ou bien de ne pas l'envoyer du tout, et de ne pas le demander du tout si vous ne le lisez pas. Il n'y a qu'un seul 'recvrom()' dans toutes ces traces. Il devrait y avoir à peu près le même nombre de 'sendto()' s. – EJP

Questions connexes