commit: ff5f88aae314a61f4c766762056094216e00b89d
parent 13db730659c7abd902cd7d59aecaf1bb36ab58d2
Author: Mark Felder <feld@feld.me>
Date: Fri, 27 Jun 2025 18:07:46 -0700
Instance.set_reachable/1 should delete any existing ReachabilityWorker jobs for that instance
Diffstat:
2 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex
@@ -92,9 +92,20 @@ defmodule Pleroma.Instances.Instance do
def reachable?(url_or_host) when is_binary(url_or_host), do: true
def set_reachable(url_or_host) when is_binary(url_or_host) do
- %Instance{host: host(url_or_host)}
- |> changeset(%{unreachable_since: nil})
- |> Repo.insert(on_conflict: {:replace, [:unreachable_since]}, conflict_target: :host)
+ host = host(url_or_host)
+
+ result =
+ %Instance{host: host}
+ |> 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()
+
+ result
end
def set_reachable(_), do: {:error, nil}
diff --git a/test/pleroma/instances/instance_test.exs b/test/pleroma/instances/instance_test.exs
@@ -27,6 +27,32 @@ defmodule Pleroma.Instances.InstanceTest do
assert {:ok, instance} = Instance.set_reachable(instance.host)
refute instance.unreachable_since
end
+
+ test "cancels all ReachabilityWorker jobs for the domain" do
+ domain = "cancelme.example.org"
+ insert(:instance, host: domain, unreachable_since: NaiveDateTime.utc_now())
+
+ # Insert a ReachabilityWorker job for this domain, scheduled 5 minutes in the future
+ scheduled_at = DateTime.add(DateTime.utc_now(), 300, :second)
+
+ {:ok, job} =
+ Pleroma.Workers.ReachabilityWorker.new(
+ %{"domain" => domain, "phase" => "phase_1min", "attempt" => 1},
+ scheduled_at: scheduled_at
+ )
+ |> Oban.insert()
+
+ # Ensure the job is present
+ job = Pleroma.Repo.get(Oban.Job, job.id)
+ assert job
+
+ # Call set_reachable, which should delete the job
+ assert {:ok, _} = Instance.set_reachable(domain)
+
+ # Reload the job and assert it is deleted
+ job = Pleroma.Repo.get(Oban.Job, job.id)
+ refute job
+ end
end
describe "set_unreachable/1" do