Api IStorage mi nedovoluje použít nativní atomicitu pomocí apcu_entry
- h4kuna
- Backer | 740
Ahoj,
mám implementovanou ApcuStorage pomocí
IStorage, ale nejde mi implementovat tak, abych mohl použít
metodu apcu_entry.
Metoda apcu_entry je atomická. A tím jak je udělané api Cache a IStorage, tak jsem nepřišel na to jak to použít, aby to dobře fungovalo. Callback se mi do storage nikdy nedostane.
Pokud si storage umí řešit zámky sama, není potřeba, aby to řešila třída Cache::save().
Klidně připravím PR.
- Říkal jsem si, že by se udělal ještě jeden interface např: ISelfLock::entry() a pokud by ho storage implementoval, tak Cache by na to reagovala, něco podobného jako je IBulkReader.
- Nebo změnit Api IStorage, což by byl BC break. A k tomu chování Cache.
Co na to komunita?
Editoval h4kuna (12. 5. 2019 14:58)
- h4kuna
- Backer | 740
Takovou bouřlivou reakci jsem nečekal. Asi jsem to blbě popsal.
Vyrobil jsem ukázkový skript, který jde spustit jen v prohlížeči, APCU v řádce nefunguje.
V prohlížeči je potřeba otevřít čtyři taby během 4s a v nich
spustit soubor run.php
. Implementace je taková že procesy
čekají před zámkem dokud se neotevře a pak teprve spustí callback pro
získání dat. Takže pokud jsou data v keši, která jsou validní, není
mechanismus, který by to ověřil a prostě se callback spustí znovu. Celkem
bych očekával že správný výsledek, který bych měl v záložkách vidět
je číslo 1.
Tzn stávající chování s použitím FileStorage je následující:
tab 1
- uspí se na 5s
- zapíše do keše 1
tab 2
- tab 1 skončil
- uspí se na 5s
- zapíše do keše 2
tab 3
- tab 2 skončil
- uspí se na 5s
- zapíše do keše 3
tab 4
- tab 3 skončil
- uspí se na 5s
- zapíše do keše 4
celkový čas trvání cca 20s
To čeho bych rád docílil je, aby mi callback došel do storage a použil
se zamykací a ověřovací mechanismus dané storage v tomto případě APCU.
Zase je potřeba otevřít 4 záložky a spustit run.php?apcu=1
během 4s.
Chování bude následující
tab 1
- uspí se na 5s
- zapíše do keše 1
tab 2
- přečte z keše 1
tab 3
- přečte z keše 1
tab 4
- přečte z keše 1
celkový čas trvání cca 5s
Tady je komit
co bylo potřeba změnit
Stejný problém je s redisem, který má taky svoje zamykání.
@DavidGrudl @DavidMatějka @chemix @Majkl578 @Milo
Editoval h4kuna (20. 5. 2019 9:52)