diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex index fb0b9d7f0..620544134 100644 --- 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 index ed536c55c..354ba139a 100644 --- 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