commit: f06f0bedd305706ba8dd7cc38d421e2831f43d0b
parent 29f76079107f12e14b87e58c804ff10550381478
Author: Mark Felder <feld@feld.me>
Date: Sat, 28 Jun 2025 13:14:01 -0700
Clean up ReachabilityWorker jobs and delete from Instances table when deleting all users and activities for an instance
Diffstat:
3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex
@@ -99,11 +99,7 @@ defmodule Pleroma.Instances.Instance do
|> changeset(%{unreachable_since: nil})
|> Repo.insert(on_conflict: {:replace, [:unreachable_since]}, conflict_target: :host)
- # Delete any existing reachability testing jobs for this instance
- Oban.Job
- |> Ecto.Query.where(worker: "Pleroma.Workers.ReachabilityWorker")
- |> Ecto.Query.where([j], j.args["domain"] == ^host)
- |> Oban.delete_all_jobs()
+ Pleroma.Workers.ReachabilityWorker.delete_jobs_for_host(host)
result
end
diff --git a/lib/pleroma/workers/delete_worker.ex b/lib/pleroma/workers/delete_worker.ex
@@ -14,6 +14,7 @@ defmodule Pleroma.Workers.DeleteWorker do
end
def perform(%Job{args: %{"op" => "delete_instance", "host" => host}}) do
+ # Schedule the per-user deletion jobs
Pleroma.Repo.transaction(fn ->
User.Query.build(%{nickname: "@#{host}"})
|> Pleroma.Repo.all()
@@ -22,6 +23,17 @@ defmodule Pleroma.Workers.DeleteWorker do
|> __MODULE__.new()
|> Oban.insert()
end)
+
+ # Delete the instance from the Instances table
+ case Pleroma.Repo.get_by(Pleroma.Instances.Instance, host: host) do
+ nil -> :ok
+ instance -> Pleroma.Repo.delete(instance)
+ end
+
+ # Delete any pending ReachabilityWorker jobs for this domain
+ Pleroma.Workers.ReachabilityWorker.delete_jobs_for_host(host)
+
+ :ok
end)
end
diff --git a/lib/pleroma/workers/reachability_worker.ex b/lib/pleroma/workers/reachability_worker.ex
@@ -11,6 +11,8 @@ defmodule Pleroma.Workers.ReachabilityWorker do
alias Pleroma.HTTP
alias Pleroma.Instances
+ import Ecto.Query
+
@impl true
def perform(%Oban.Job{args: %{"domain" => domain, "phase" => phase, "attempt" => attempt}}) do
case check_reachability(domain) do
@@ -43,6 +45,14 @@ defmodule Pleroma.Workers.ReachabilityWorker do
@impl true
def timeout(_job), do: :timer.seconds(5)
+ @doc "Deletes scheduled jobs to check reachability for specified instance"
+ def delete_jobs_for_host(host) do
+ Oban.Job
+ |> where(worker: "Pleroma.Workers.ReachabilityWorker")
+ |> where([j], j.args["domain"] == ^host)
+ |> Oban.delete_all_jobs()
+ end
+
defp check_reachability(domain) do
case HTTP.get("https://#{domain}/") do
{:ok, %{status: status}} when status in 200..299 ->