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__, %{}, name: __MODULE__)
23 def enqueue(data, transport, retries \\ 0) do
24 GenServer.cast(__MODULE__, {:maybe_enqueue, data, transport, retries + 1})
27 def handle_cast({:maybe_enqueue, data, transport, retries}, state) do
28 if retries > @max_retries do
29 Logger.debug("Maximum retries reached on #{inspect(data)}")
34 {:send, data, transport, retries},
35 growth_function(retries)
42 def handle_info({:send, %{topic: topic} = data, :websub, retries}, state) do
43 Logger.debug("RetryQueue: Retrying to send object #{topic}")
45 case Websub.publish_one(data) do
50 enqueue(data, :websub, retries)
55 def handle_info({:send, %{id: id} = data, :activitypub, retries}, state) do
56 Logger.debug("RetryQueue: Retrying to send object #{id}")
58 case ActivityPub.publish_one(data) do
63 enqueue(data, :activitypub, retries)
68 def handle_info(unknown, state) do
69 Logger.debug("RetryQueue: don't know what to do with #{inspect(unknown)}, ignoring")
73 defp growth_function(retries) do
74 round(@initial_timeout * :math.pow(retries, 3))