2015-05-26 15:45 GMT+03:00 Constantin Neagu via so <[email protected]>: > Buna ziua, > > Trimit un fragment din Readme-ul meu pentru aceasta tema. > Intrebarea este daca problema si solutia expusa este pertinenta. > > [... Implementarea temei a mers bine pana cand ...] > Asta pana am ajuns pe serverul de test. > Unde nimic nu mai mergea. > Am testat pe 3 masini diferite (Intel si AMD) de la AMD E450 pana la > i7 Hasswell. > Una dintre masini a fost imaginea pusa la dispozitie de echipa SO. > Nimic, la mine merge, pe server nu. > Am decis sa fac Debug direct pe server-ul de test. > Pentru a realiza acest lucru, am adaugat in arhiva temei si o versiune > modificata a tester-ului pus la dispozitie. > Modificarea a constat in redirectarea output-ului aws din log-uri catre > stdout. > Din make am compilat si testele mele, am rulat initializarea, si > testul de care am avut nevoie. > Am tot facut asta pana cand am blocat vmchecker pentru ca am uitat sa > fac cleanup. > Imi cer inca odata scuze. > > Totusi am reusit sa descopar ce nu mergea: > - recv pe socket citeste numai 20 de bytes => nu citeam toata calea > fisierului. > Am observat ca datele sunt totusi acolo, un al doilea recv imediat > dupa primul citeste si restul. > Problema rezolvata prin folosirea read in loc de recv.
Trebuie folosit recv() pentru citirea de pe sockeți. > Avand in vedere ca socket-ul este setat ca non-blocant, respect cerinta > temei. > Am incercat sa imi dau seama de unde vine limitarea, > dar bufferele de recv si snd ale socket-ului sunt in regula, iar in > alta parte nu stiu unde sa ma uit. > - sendfile si send scriu pe buffer doar jumatate din dimensiunea specificata. > > Pe asta nu am inteles-o si mi-am dat seama din intamplare, vazand un > hint din eclipse, cum ca sendfile > verifica dimensiunea si daca este mai mare de 32 o imparte cu 2. > Doar ca la runtime, pe sistemele mele, totul merge perfect si > trimiterea se face corect. > Din nou, nu am gasit nici o justificare pentru acest comportament. > Am setat buffer-ele socket-ului manual, > in speranta ca de acolo este problema. But to no avail :(. Apelurile recv(), send() și sendfile() sunt suprascrise de către checker, folosind mecanismul de library preloading (vezi _test/sockop_preload.c și folosirea LD_PRELOAD la pornirea server-ului). recv()/send() nu vor citi/scrie toate datele dintr-un singur apel. > > Solutia a fost sa introduc AWS_WEIRD_MULTIPLIER prin care sa > specific la pre-compilare o valoare (1 sau 2) > pe care apoi sa o inmultesc cu dimensiunea transferului pentru > sendfile si send. > It worked brilliantly. Este un hack și nu se acceptă. Adrian _______________________________________________ http://ocw.cs.pub.ro/courses/so/info/lista-discutii
