Api IStorage mi nedovoluje použít nativní atomicitu pomocí apcu_entry

h4kuna
Backer | 740
+
+1
-

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.

  1. Ří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.
  2. 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
+
0
-

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)