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

Raspunde prin e-mail lui