Connection Pool: fix LRFU implementation to not actually be LRU

The numbers of the native time unit were so small the CRF was always 1,
making it an LRU. This commit switches the time to miliseconds and changes
the time delta multiplier to the one yielding mostly highest hit rates according
to the paper
This commit is contained in:
rinpatch 2020-07-02 01:53:27 +03:00
parent 9b73c35ca8
commit a705637dcf

View file

@ -12,7 +12,7 @@ def start_link([key | _] = opts) do
def init([key, uri, opts, client_pid]) do def init([key, uri, opts, client_pid]) do
with {:ok, conn_pid} <- Gun.Conn.open(uri, opts), with {:ok, conn_pid} <- Gun.Conn.open(uri, opts),
Process.link(conn_pid) do Process.link(conn_pid) do
time = :erlang.monotonic_time() time = :erlang.monotonic_time(:millisecond)
{_, _} = {_, _} =
Registry.update_value(@registry, key, fn _ -> Registry.update_value(@registry, key, fn _ ->
@ -31,7 +31,7 @@ def init([key, uri, opts, client_pid]) do
@impl true @impl true
def handle_cast({:add_client, client_pid, send_pid_back}, %{key: key} = state) do def handle_cast({:add_client, client_pid, send_pid_back}, %{key: key} = state) do
time = :erlang.monotonic_time() time = :erlang.monotonic_time(:millisecond)
{{conn_pid, _, _, _}, _} = {{conn_pid, _, _, _}, _} =
Registry.update_value(@registry, key, fn {conn_pid, used_by, crf, last_reference} -> Registry.update_value(@registry, key, fn {conn_pid, used_by, crf, last_reference} ->
@ -116,6 +116,6 @@ def handle_info({:DOWN, _ref, :process, pid, reason}, state) do
# LRFU policy: https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.55.1478 # LRFU policy: https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.55.1478
defp crf(time_delta, prev_crf) do defp crf(time_delta, prev_crf) do
1 + :math.pow(0.5, time_delta / 100) * prev_crf 1 + :math.pow(0.5, 0.0001 * time_delta) * prev_crf
end end
end end