Handle failed fetches a bit better #743

Merged
floatingghost merged 34 commits from failed-fetch-processing into develop 2024-04-19 11:25:14 +00:00
5 changed files with 20 additions and 5 deletions
Showing only changes of commit ff515c05c3 - Show all commits

View file

@ -1,2 +0,0 @@
Remote object fetch failures will prevent the object fetch job from retrying if the object has been deleted or the fetch was denied with a 403 due to instance block behavior with authorized_fetch enabled.
Skip fetching objects from unreachable instances.

View file

@ -153,7 +153,7 @@ def fetch_object_from_id(id, options \\ []) do
else else
{:allowed_depth, false} = e -> {:allowed_depth, false} = e ->
log_fetch_error(id, e) log_fetch_error(id, e)
{:error, "Max thread distance exceeded."} {:error, :allowed_depth}
{:scheme, false} -> {:scheme, false} ->
{:error, "URI Scheme Invalid"} {:error, "URI Scheme Invalid"}

View file

@ -21,6 +21,9 @@ def perform(%Job{args: %{"op" => "fetch_remote", "id" => id} = args}) do
{:error, :not_found} -> {:error, :not_found} ->
{:cancel, :not_found} {:cancel, :not_found}
{:error, :allowed_depth} ->
{:cancel, :allowed_depth}
_ -> _ ->
:error :error
end end

View file

@ -205,8 +205,7 @@ test "it works when fetching the OP actor errors out" do
test "it returns thread depth exceeded error if thread depth is exceeded" do test "it returns thread depth exceeded error if thread depth is exceeded" do
clear_config([:instance, :federation_incoming_replies_max_depth], 0) clear_config([:instance, :federation_incoming_replies_max_depth], 0)
assert {:error, "Max thread distance exceeded."} = assert {:error, :allowed_depth} = Fetcher.fetch_object_from_id(@ap_id, depth: 1)
Fetcher.fetch_object_from_id(@ap_id, depth: 1)
end end
test "it fetches object if max thread depth is restricted to 0 and depth is not specified" do test "it fetches object if max thread depth is restricted to 0 and depth is not specified" do

View file

@ -13,6 +13,7 @@ defmodule Pleroma.Workers.RemoteFetcherWorkerTest do
@deleted_object_two "https://deleted-410.example.com/" @deleted_object_two "https://deleted-410.example.com/"
@unauthorized_object "https://unauthorized.example.com/" @unauthorized_object "https://unauthorized.example.com/"
@unreachable_object "https://unreachable.example.com/" @unreachable_object "https://unreachable.example.com/"
@depth_object "https://depth.example.com/"
describe "it does not" do describe "it does not" do
setup do setup do
@ -31,6 +32,11 @@ defmodule Pleroma.Workers.RemoteFetcherWorkerTest do
%Tesla.Env{ %Tesla.Env{
status: 403 status: 403
} }
%{method: :get, url: @depth_object} ->
%Tesla.Env{
status: 200
}
end) end)
end end
@ -63,5 +69,14 @@ test "fetch an unreachable instance" do
args: %{"op" => "fetch_remote", "id" => @unreachable_object} args: %{"op" => "fetch_remote", "id" => @unreachable_object}
}) })
end end
test "requeue an object that exceeded depth" do
clear_config([:instance, :federation_incoming_replies_max_depth], 0)
assert {:cancel, _} =
RemoteFetcherWorker.perform(%Oban.Job{
args: %{"op" => "fetch_remote", "id" => @depth_object, "depth" => 1}
})
end
end end
end end