1 defmodule Pleroma.Web.Federator.RetryQueue do
3 alias Pleroma.Web.{WebFinger, Websub}
4 alias Pleroma.Web.ActivityPub.ActivityPub
7 @websub Application.get_env(:pleroma, :websub)
8 @ostatus Application.get_env(:pleroma, :websub)
9 @httpoison Application.get_env(:pleroma, :websub)
10 @instance Application.get_env(:pleroma, :websub)
11 # initial timeout, 5 min
12 @initial_timeout 30_000
20 GenServer.start_link(__MODULE__, %{delivered: 0, dropped: 0}, name: __MODULE__)
23 def enqueue(data, transport, retries \\ 0) do
24 GenServer.cast(__MODULE__, {:maybe_enqueue, data, transport, retries + 1})
27 def get_retry_params(retries) do
28 if retries > @max_retries do
29 {:drop, "Max retries reached"}
31 {:retry, growth_function(retries)}
35 def handle_cast({:maybe_enqueue, data, transport, retries}, %{dropped: drop_count} = state) do
36 case get_retry_params(retries) do
40 {:send, data, transport, retries},
41 growth_function(retries)
48 {:noreply, %{state | dropped: drop_count + 1}}
52 def handle_info({:send, data, transport, retries}, %{delivered: delivery_count} = state) do
53 case transport.publish_one(data) do
55 {:noreply, %{state | delivered: delivery_count + 1}}
58 enqueue(data, transport, retries)
63 def handle_info(unknown, state) do
64 Logger.debug("RetryQueue: don't know what to do with #{inspect(unknown)}, ignoring")
68 defp growth_function(retries) do
69 round(@initial_timeout * :math.pow(retries, 3))