Connection Pool: fix LRFU implementation to not actually be LRU
authorrinpatch <rinpatch@sdf.org>
Wed, 1 Jul 2020 22:53:27 +0000 (01:53 +0300)
committerrinpatch <rinpatch@sdf.org>
Wed, 15 Jul 2020 12:26:35 +0000 (15:26 +0300)
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

lib/pleroma/gun/connection_pool/worker.ex

index 418cb18c19642f36d35cae0d9d284aa2436d5ed1..ec050262159b40428b48e84f941eae1a4ab978a0 100644 (file)
@@ -12,7 +12,7 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do
   def init([key, uri, opts, client_pid]) do
     with {:ok, conn_pid} <- Gun.Conn.open(uri, opts),
          Process.link(conn_pid) do
-      time = :erlang.monotonic_time()
+      time = :erlang.monotonic_time(:millisecond)
 
       {_, _} =
         Registry.update_value(@registry, key, fn _ ->
@@ -31,7 +31,7 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do
 
   @impl true
   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, _, _, _}, _} =
       Registry.update_value(@registry, key, fn {conn_pid, used_by, crf, last_reference} ->
@@ -116,6 +116,6 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do
 
   # LRFU policy: https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.55.1478
   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