Nedaří se mi nastavit lock() pro paralelní DB tesy
- fary
- Člen | 155
Mám 4 jednoduché testy. V každém mám nastavený lock, ale přesto mi to vhazuje chyby.
Pokud testy spustím pouze s jedním vláknem pomocí přepínače -j 1, tak vše jede v dobře, ale jakmile je to vícevláknové, jsou tam chyby. Myslím, že problém je v tom, kde ten lock používám. Bohužel ale nevím přesně, jak vám to co nejjednodušeji vysvětlit, takže sem nejspíše překopíruji kousek jednoho toho testu.
<?php
/**
* Test: My\Database\Table\Repository::findBy
*
* @author John Doe
* @dataProvider? ../databases.ini
*/
use Tester\Assert;
require __DIR__ . '/../connect.inc.php'; // create $connection
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/../files/mysql-my_test1.sql');
Tester\Environment::lock('database.lock.1', TEMP_DIR);
class Repository extends My\Database\Table\Repository
{
}
test(function() use ($context) {
$repository = new Repository('user', $context);
$res = $repository->findBy(array('name' => 'James Bond'));
$isInstanceOf = $res instanceof Nette\Database\Table\Selection;
Assert::true($isInstanceOf);
$row = $res->fetch();
$isInstanceOf = $row instanceof Nette\Database\Table\ActiveRow;
Assert::true($isInstanceOf);
Assert::same('James Bond', $row->name);
});
Třída My\Database\Table\Repository je abstraktní, proto vytvářím
podtřídu. Cesty, které jsou uváděny k různým souborům, jako
connect.inc.php
by měly být správně, protože pokud testy
spustím s přepínačem -j 1, jede vše dobře.
Pokud testy spustím ve více vláknech, tak se mi provede úspěšně vždy
až ten úplně poslední test, ale u ostatních se vypíše hláška:
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'my_test.user' doesn't exist
.
Každý test by si měl DB sám nejprve dropnout a pak znovuvytvořit (tak to
mám zapsáno v SQL souboru). Problém je tedy asi s tím pararelním
spouštěním. Už se s tím morduju od rána a pořád nedokážu přijít na
správné řešení.
- Jan Tvrdík
- Nette guru | 2595
Není problém v tom, že každý test má vlastní zámek?
Tester\Environment::lock('database.lock', TEMP_DIR);
- fary
- Člen | 155
Teď jsem si všiml, že v adresáři tmp
, kam se mám zámky
nasměřované se vytvářejí samostatné adresáře kde je vždy jeden
lock-*
soubor, např. tmp/12345/lock-*
, ale zároveň
je v tom stejném adresáři tmp
soubor lock-*
,
který není v žádném číselném adresáři, ale přímo v adresáři
tmp
takto tmp/lock-*
. Myslel jsem, že je to je kopie
posledního zámku z nějakého z těch číselných adresářů, ale jeho
název se s žádným takovým v těch číselných neshoduje.
- fary
- Člen | 155
Mám to vyřešené. Přesunul jsem ten lock do connect.inc.php
a 2. argument TEMP_DIR
jsem předal takto
dirname(TEMP_DIR)
.
Ostatně asi právě předání toho druhého parametru bylo to, co dělalo
problémy, protože když ten zámek z connect.inc.php
odstraním a
jednotlivě jej vložím do těch testů ve formátu
dirname(TEMP_DIR)
, tak to taky funguje.
:-)