Nedaří se mi nastavit lock() pro paralelní DB tesy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
fary
Člen | 155
+
0
-

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
+
0
-

Není problém v tom, že každý test má vlastní zámek?

Tester\Environment::lock('database.lock', TEMP_DIR);
fary
Člen | 155
+
0
-

Bohužel. U všech testů jsem přepsal database.lock.<číslo> na database.lock, ale pořád to hlásí stejnou chybu.

fary
Člen | 155
+
0
-

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.

uestla
Backer | 799
+
0
-

Neměl bys nejprve zamknout a pak pouštět ten SQL skript?

fary
Člen | 155
+
0
-

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.

:-)