Race Condition při testování Nette Testerem
- DefenestrationPraha
- Člen | 127
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 | 127
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()