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
|
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
|
||||||
|
|
|
@ -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