Prevent requeuing Remote Fetcher jobs that exceed thread depth
This commit is contained in:
parent
a2708f7fe3
commit
ad0a5deb67
|
@ -1 +1 @@
|
||||||
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.
|
Remote object fetch failures will prevent the object fetch job from retrying if the object request returns 403, 404, 410, or exceeds the maximum thread depth.
|
||||||
|
|
|
@ -74,7 +74,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}
|
||||||
|
|
||||||
{:containment, reason} = e ->
|
{:containment, reason} = e ->
|
||||||
log_fetch_error(id, e)
|
log_fetch_error(id, e)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -101,8 +101,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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue