[so2] [Tema4] Race condition la scrierea în fişiere...

Florin-Alexandru Stancu niflostancu at gmail.com
Mon May 13 16:58:30 EEST 2013


Salut,

Tot eu.
Probabil iar va urma un monolog tipic (şi spam :D ), dar poate are cineva
idee...

Ei bine, după cum am scris şi în subiect, am un race condition pe undeva
prin cod.
Câte-odată îmi ia toate testele, alteori îmi diferă fişierele cu vreo 30-40
bytes (nu la size ci la conţinut, comparat manual :D ).

Exemplu:
*test 633: check lots_of_files/file21 data.........................failed
  -- diff /tmp/pitix.mnt/lots_of_files/file21 /tmp/
pitix.rw//lots_of_files/file21*

Chestia asta se întâmplă random, pe fişiere random.
Şi am mai observat un pattern: MEREU (din 5 rulări buguite), diferă doar 36
de caractere pe la mijlocul fişierului; în fişierul din pitix.rw am 36
NULL-uri consecutive iar în pitix.mnt am, în locul lor, 36 de caractere
binare random.
Repet: mereu 36 NULL-uri consecutive, mereu sunt copiate greşit.
Dimensiunile fişierelor sunt identice.
Şi am mai încercat să îl pun cu dd (şi cu cp), manual, şi se copiază
perfect fişierul cu cele 36 de NULL-uri.
WTF? :D

Am protejat structurile data_blocks a inode-ului cu spin_lock-uri. Tot aşa
face.
Am pus printk-uri de ENTER functie() şi EXIT funcţie() la *truncate()* şi
la *get_block()*.
Nu se apelează niciodată intercalate. Dar, dacă nu e de aici, atunci nu am
nicio idee ce se întâmplă...
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20130513/a4b2aa55/attachment.html>


More information about the so2 mailing list