Race Condition při testování Nette Testerem

DefenestrationPraha
Člen | 120
+
0
-

Doplňuji si teď testy do své baterie testů v Nette Testeru a narazil jsem na dvě race conditions související s tím, jak testy běží ve více vláknech.

První je v Contributte Translatoru, který když si vytváří cache překladů, může se „srazit sám se sebou“. To jsem vyřešil tím, že 1× zavolám metodu Translate už v setup scriptu (volaném pomocí příkazové volby –setup), u nějž je jisté, že běží sám. Pak už se překlady nemění, takže všechny testy sahají do jedné cache Translatoru v režimu čtení. To mě tedy tolik nepálí…

Co mě ale pálí, je thread unsafety u FileCache. Ta se realizuje pomocí SQLite databáze a v momentě, kdy nějaký prezentér v různých akcích cachuje data na disk (např. nějaká data o aktuálně přihlášených uživatelích), tak u paralelního běhu testů tohoto prezentéru je víceméně garantováno, že se dva požadavky na zápis do téže cache srazí.

Toto se asi může v praxi stát i na běžícím produkčním serveru, nebo ne? Dorazí-li dva požadavky opravdu naráz.

DefenestrationPraha
Člen | 120
+
0
-

Exited with error code 255 (expected 0)
PDOException: SQLSTATE[HY000]: General error: 5 database is locked

in Caching\Storages\SQLiteJournal.php(44)
in Caching\Storages\SQLiteJournal.php(44) PDO->exec()
in Caching\Storages\SQLiteJournal.php(67) Nette\Caching\Storages\SQLiteJournal->open()
in Caching\Storages\FileStorage.php(180) Nette\Caching\Storages\SQLiteJournal->write()