Packages
kujira
0.1.35
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Elixir interfaces to Kujira dApps, for building indexers, APIs and bots
Current section
Files
Jump to
Current section
Files
lib/kujira/cache_strategy.ex
defmodule Kujira.CacheStrategy do
@moduledoc """
A Cache Strategy for Memoize that doesn't cache {:error, _} patterns.
Useful to protect against gRPC connection failures and temporary errors getting permanently cached
```
config :memoize, cache_strategy: Kujira.CacheStrategy
```
"""
@behaviour Memoize.CacheStrategy
@ets_tab __MODULE__
def init(opts) do
:ets.new(@ets_tab, [:public, :set, :named_table, {:read_concurrency, true}])
# Default global settings
#
# config :memoize, Memoize.CacheStrategy.Default,
# expires_in: 1000
expires_in =
Application.get_env(:memoize, __MODULE__, []) |> Keyword.get(:expires_in, :infinity)
opts = Keyword.put(opts, :expires_in, expires_in)
opts
end
def tab(_key) do
@ets_tab
end
def cache(_key, _value, opts) do
expires_in = Keyword.get(opts, :expires_in, Memoize.Config.opts().expires_in)
expired_at =
case expires_in do
:infinity -> :infinity
value -> System.monotonic_time(:millisecond) + value
end
expired_at
end
def read(key, {:error, _}, _) do
invalidate(key)
:ok
end
def read(key, _value, expired_at) do
if expired_at != :infinity && System.monotonic_time(:millisecond) > expired_at do
invalidate(key)
:retry
else
:ok
end
end
def invalidate() do
:ets.select_delete(@ets_tab, [{{:_, {:completed, :_, :_}}, [], [true]}])
end
def invalidate(key) do
:ets.select_delete(@ets_tab, [{{key, {:completed, :_, :_}}, [], [true]}])
end
def garbage_collect() do
expired_at = System.monotonic_time(:millisecond)
:ets.select_delete(@ets_tab, [
{{:_, {:completed, :_, :"$1"}},
[{:andalso, {:"/=", :"$1", :infinity}, {:<, :"$1", {:const, expired_at}}}], [true]}
])
end
end