Autor Téma: tFileStream - podivne chovani  (Přečteno 144 krát)

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
tFileStream - podivne chovani
« kdy: 20-04-2017, 17:19:18 »
Zdar a silu,

nasel jsem prapodivne chovani FileStream v linuxu (na woknech nevim). Situace se ma tak, ze pres tprocess spustim externi aplikaci, jejimz vysledkem je soubor na disku. Po ukonceni teto aplikace tento soubor potrebuju nacist a tak nejak nekdy odeslat pres tcp.

Vtipne je chovani dvou variant programu kde :

RunCmd('aaa'); - vygeneruje soubor xyz.txt
tFileStream.Create(xyz.txt); - snazi se otevrit xyz.txt

funguje ok. stejne tak jako misto tFileStream dat treba FileExists.

Ovsem:

RunCmd('aaa');
RunInThread(loadandsendfile); - kde jde fyzicky o totez jen se stream otevira v jinem vlakne.

Kde je ta legrace ? legrace je v tom, ze v druhem pripade je soubor pristupny pro cteni nekdy ihned, nekdy az po treba 20s od spusteni - jinak Unable to open file.
FileExists tvrdi vzdy ze soubor existuje, ale otevrit v jinem vlakne proste nejde - zkousim to co 1s celkem 60 * a vicemene se to stihne (z cca 1000 pokusu jednou ne).

Mate nekdo tuseni, kde by mohl byt problem ? Je to nejaka zalezitost fs, kde jine vlakno musi pockat zatimco stejne vlakno si muze cist co chce ? (Neco jako threadvar cache probuh) ??
A mate nekdo tuseni, co poladit na systemu, aby tohle nedelalo ?

Ubuntu 17.04, ext4, FPC 3.0.0. Lazarus 1.6.3 - cross compile z Win64.

Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline oxo

  • Guru
  • *****
  • Příspěvků: 668
  • Karma: 37
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:tFileStream - podivne chovani
« Odpověď #1 kdy: 20-04-2017, 19:41:44 »
Není spíš problém v tom, že než se ten thread k tomu souboru ke čtení dostane, tak main thread ho zase začne přepisovat?

Linux nemá atomické exkluzivní otevírání souboru - uzamčení souboru pro čtení/zápis není atomické (t.j. v jednom kroku otevřu soubor a pak ho zablokuju; ale když někdo jiný mezitím soubor otevřel, dostane se k němu a kradou si přístup a bůhví co se děje).

Právě v threadech je to na pytel a nedá se to pořádně ošetřit...
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:tFileStream - podivne chovani
« Odpověď #2 kdy: 20-04-2017, 21:17:22 »
Nene, kazdej ten soubor ma unikatni jmeno dle casoveho razitka (a je to jednou za skoro deset vterin) - a nikdo jinej by s nim nemel pracovat (ja urcite ne, kdo vi jestli treba system nebo tak neco, to nevim, ale lswhich (ci jak se jmenuje ten programek na koukani zamku) neukazoval nic. Stejne tak puvodni aplikace je uz zavrena (zkontrolovano pres PS, jestli nevisi apod). Proste thread kde doslo k vytvoreni jde hned, jinej thread za 0 - cca 30s. Prijde mi to podobne jako obcasne chovani samby, kdy file na disku je, ale v sambe rpes sit se objevi nekdy taky az za chvili. tady ovsem fileexists = true akorat nejde otevrit.. Co chci zkusit, tak otevrit stream a az ten predat do vlakna. Bohuzel to hlavni vlakno ma pak jinou praci, ktera nepocka, a naopak odeslani toho souboru klido chvili pockat muze (nevadi ani tech 30s, ale proste je mi to zahadou (vcera to totiz z timeout 10s vzrostlo a tudiz me to zaclo zajimat).
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:tFileStream - podivne chovani
« Odpověď #3 kdy: 21-04-2017, 18:43:31 »
Tak otevreni souboru v hlavnim vlakne a predani streamu do zpracujiciho vlakna funguje. Je to kazdopadne velmi zvlastni chovani.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: