Merge pull request 'receiver_worker: prevent duplicate jobs' (#886) from Oneric/akkoma:receive_dedupe into develop

Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/886
This commit is contained in:
Oneric 2025-05-09 19:13:14 +00:00
commit d6f5f4db18
2 changed files with 40 additions and 1 deletions

View file

@ -7,7 +7,24 @@ defmodule Pleroma.Workers.ReceiverWorker do
alias Pleroma.Web.Federator alias Pleroma.Web.Federator
use Pleroma.Workers.WorkerHelper, queue: "federator_incoming" use Pleroma.Workers.WorkerHelper,
queue: "federator_incoming",
unique: [
keys: [:op, :id],
# all states except :discarded
states: [:scheduled, :available, :executing, :retryable, :completed, :cancelled]
]
def enqueue(op, %{"id" => _} = params, worker_args), do: do_enqueue(op, params, worker_args)
def enqueue(op, %{"params" => %{"id" => id}} = params, worker_args) when is_binary(id) do
do_enqueue(op, Map.put(params, "id", id), worker_args)
end
def enqueue(op, params, worker_args) do
# should be rare if it happens at all (transient activity)
do_enqueue(op, Map.put(params, "id", Ecto.UUID.generate()), worker_args)
end
@impl Oban.Worker @impl Oban.Worker
def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do

View file

@ -0,0 +1,22 @@
defmodule Pleroma.Repo.Migrations.ReceiverWorkerIdKey do
use Ecto.Migration
def up() do
# since we currently still support PostgreSQL 12 and 13, do NOT use the args['id'] snytax!
"""
UPDATE public.oban_jobs
SET args = jsonb_set(
args,
'{id}',
to_jsonb(COALESCE(args#>>'{params,id}', id::text))
)
WHERE worker = 'Pleroma.Workers.ReceiverWorker';
"""
|> Pleroma.Repo.query!([], timeout: :infinity)
end
def down() do
# no action needed
:ok
end
end