logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/
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:

Mlib/pleroma/instances/instance.ex17++++++++++++++---
Mtest/pleroma/instances/instance_test.exs26++++++++++++++++++++++++++
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