Jak správně smazat Configurator cache po deployi?

Thomas
Člen | 22
+
+1
-

Asi je to hloupá otázka, ale jaký je správný způsob promazávání cache Configuratoru a RobotLoaderu na produkčním prostředí? Po deployi nové verze aplikace je potřeba ty staré promazat, aby se vygenerovaly nové a projevily se tak změny.

Aktuálně ty složky jednoduše natvrdo promažu, což funguje pěkně do chvíle, než se občas proces zasekne na uzamčeném souboru při generování nového konfigurátoru, na což postupně narazí všechny procesy a server jde do kytek. Předpokládám, že to nějak souvisí s tím promazáním?

0 flock <internal>:-1
1 Nette\Caching\Storages\FileStorage::readMetaAndLock /cesta/k/projektu/vendor/nette/caching/src/Caching/Storages/FileStorage.php:296
2 Nette\Caching\Storages\FileStorage::read /cesta/k/projektu/vendor/nette/caching/src/Caching/Storages/FileStorage.php:73
3 Nette\Caching\Cache::load /cesta/k/projektu/vendor/nette/caching/src/Caching/Cache.php:114
4 App\Router\RouterFactory::createRouter /cesta/k/projektu/app/router/RouterFactory.php:103
5 Container_213bb75836::createServiceRouter /cesta/k/projektu/temp/nazev_projektu/cache/nette.configurator/Container_213bb75836.php:9196
6 Nette\DI\Container::Nette\DI\{closure} /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:229
7 Nette\DI\Container::preventDeadLock /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:324
8 Nette\DI\Container::createService /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:220
9 Nette\DI\Container::getService /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:145
10 Container_213bb75836::createServiceApplication__application /cesta/k/projektu/temp/nazev_projektu/cache/nette.configurator/Container_213bb75836.php:7650
11 Nette\DI\Container::Nette\DI\{closure} /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:229
12 Nette\DI\Container::preventDeadLock /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:324
13 Nette\DI\Container::createService /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:220
14 Nette\DI\Container::getService /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:145
15 Nette\DI\Container::getByType /cesta/k/projektu/vendor/nette/di/src/DI/Container.php:253
16 <main> /cesta/k/projektu/nazev_projektu/index.php:1

Jak na to tedy správně? Díky.

F.Vesely
Člen | 368
+
+1
-

My to děláme tak, že nová verze jde do jiné složky, pak provedeme composer install, migrace, atd. a nakonec se přehodí link.

Thomas
Člen | 22
+
0
-

F.Vesely napsal(a):

My to děláme tak, že nová verze jde do jiné složky, pak provedeme composer install, migrace, atd. a nakonec se přehodí link.

Díky, tomu bych se ale rád vyhnul, ten proces už je pak dost zdlouhavý a ohledně aktualizace composeru to máme nastavené trochu jinak.

Každopádně to vypadá, že to ve výsledku s configuratorem nesouvisí, špatně jsem si to vyložil. Schválně jsem včera to automatické promazávání zrušil a chyba se objevila znovu. Ale hlavně ve chvíli, kdy neprobíhal žádný deploy.

Vždy to zřejmě nastává při načítání cache, která má nastavenou expiraci na 5 minut. Na disku je pak zamčený prázdný cache soubor… Opravdu mi nejde do hlavy, co by to mohlo mít za příčinu.

Pavel Kravčík
Člen | 1182
+
0
-

Používáme oba způsoby (ať nahrání do nové složky nebo přemazání rovnou v produkci přes CI). Ruční mazání je taky cesta pro menší projekty. Tam ten problém nebude bych řekl.

Jestli je to možné – zkus upgrade na vyšší verze. U většího partnera se nám tohle dělo nárazově na Nette2.4 párkrát za měsíc. V Nette3 bez problémů.

Zbytek bude asi spíš na server-mastera.

Thomas
Člen | 22
+
0
-

Pavel Kravčík napsal(a):

Jestli je to možné – zkus upgrade na vyšší verze. U většího partnera se nám tohle dělo nárazově na Nette2.4 párkrát za měsíc. V Nette3 bez problémů.

Je to jak píšete – dříve se to asi stávalo třeba jednou do měsíce. To mě tolik netrápilo, protože se o to postaral autoscaling a škody byly zanedbatelné. Nyní se to ale začalo z ničeho nic dít prakticky každý den, což už je docela problém. Na Nette 3 ale jedeme. Čeká nás nyní větší aktualizace vč. PHP 8.3, tak si to třeba sedne.

Marek Bartoš
Nette Blogger | 1177
+
0
-

Když se invaliduje cache, tak se vytvoří zámek a všechny requesty požadující danou cache čekají, než ji request, který vytvořil zámek vygeneruje.
To při velkém množství requestů může aplikaci zasekat.
Zkuste cache udělat permanentní a místo při requestu ji aktualizovat skrze cron job.

Thomas
Člen | 22
+
0
-

Marek Bartoš napsal(a):

Když se invaliduje cache, tak se vytvoří zámek a všechny requesty požadující danou cache čekají, než ji request, který vytvořil zámek vygeneruje.
To při velkém množství requestů může aplikaci zasekat.
Zkuste cache udělat permanentní a místo při requestu ji aktualizovat skrze cron job.

Jasně, zasekat bych pochopil. Tady ale něco selhává úplně, protože se to cache nevytvoří vůbec, ale všechny procesy na to donekonečna čekají. Navíc, v tomto případě to cache v zásadě obaluje asi 3 dotazy na databázi, které zjišťují nastavení projektu před generováním rout, což je otázka max několika milisekund. Tj. nejedná se o nic, co by ty requesty mělo blokovat dlouho.

A nemyslím, že by problém měl být v kódu, jedná se o standardní cache load:

$value = $cache->load($key, function (&$dependencies) {
	$dependencies[Cache::Expire] = '5 minutes';
	...
});

Naivně předpokládám, že i kdyby došlo k erroru v tom kódu při generování cache, tak se proces ukončí, flock se tím automaticky uvolní a pokusí se ji vygenerovat další proces v pořadí (což se neděje).

Každopádně děkuji všem za pomoc při odhalení viníka, po odstranění této cache se to zatím zdá být v pořádku.