[so] [Tema5][Lin] - Nelamurire

Adrian Stanciu adrian.stanciu.pub at gmail.com
Tue May 26 16:36:48 EEST 2015


2015-05-26 15:45 GMT+03:00 Constantin Neagu via so <so at cursuri.cs.pub.ro>:
> 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


More information about the so mailing list