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:
commit
d6f5f4db18
2 changed files with 40 additions and 1 deletions
|
@ -7,7 +7,24 @@ defmodule Pleroma.Workers.ReceiverWorker do
|
|||
|
||||
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
|
||||
def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do
|
||||
|
|
|
@ -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
|
Loading…
Reference in a new issue