Add WIP patches for better handling of received Deletes and Adds
This commit is contained in:
parent
2dbac3d4b4
commit
f8d0f8b60e
9 changed files with 410 additions and 32 deletions
|
@ -50,4 +50,10 @@ wip_20_federation-incoming-improve-link_resolve-retry-decis.patch
|
|||
wip_21_nodeinfo-lower-log-level-of-regular-actions-to-debug.patch
|
||||
wip_22_rich_media-lower-log-level-of-update.patch
|
||||
wip_23_Don-t-spam-logs-about-deleted-users.patch
|
||||
wip_24_dbg_log_receiver_crashes.patch
|
||||
wip_24_user-avoid-database-work-on-superfluous-pin.patch
|
||||
wip_25_Gracefully-ignore-Undo-activities-referring-to-unkno.patch
|
||||
wip_26_object_validators-only-query-relevant-table-for-obje.patch
|
||||
wip_27_transmogrifier-avoid-crashes-on-non-validation-Delte.patch
|
||||
wip_28_transmogrfier-be-more-selective-about-Delete-retry.patch
|
||||
wip_29_transmogrifier-gracefully-ignore-duplicated-object-d.patch
|
||||
wip_30_dbg_log_receiver_crashes.patch
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
From 5e5134d27d58801aeb33b360dbdb5048677caa4b Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Sun, 15 Dec 2024 02:50:20 +0100
|
||||
Subject: [PATCH] tmp/dbg: make sure crashes in receiver are actually logged
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Rarely (once a day or so) there’s still a ReceiverWorker excception
|
||||
showing up in prometheus stats without any corresponding log message
|
||||
---
|
||||
lib/pleroma/workers/receiver_worker.ex | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/lib/pleroma/workers/receiver_worker.ex b/lib/pleroma/workers/receiver_worker.ex
|
||||
index cffdd8584..3c24c02ac 100644
|
||||
--- a/lib/pleroma/workers/receiver_worker.ex
|
||||
+++ b/lib/pleroma/workers/receiver_worker.ex
|
||||
@@ -51,5 +51,9 @@ def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do
|
||||
Logger.error("Unexpected AP doc error: (raw) #{inspect(e)} from #{inspect(params)}")
|
||||
{:error, e}
|
||||
end
|
||||
+ rescue
|
||||
+ err ->
|
||||
+ Logger.error(Exception.format(:error, err, __STACKTRACE__))
|
||||
+ {:error, :crash}
|
||||
end
|
||||
end
|
||||
--
|
||||
2.39.5
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
From 8f0c462b1ba3963c5cd4c68bccef89339804b059 Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Tue, 17 Dec 2024 00:14:27 +0100
|
||||
Subject: [PATCH 1/7] user: avoid database work on superfluous pin
|
||||
|
||||
The only thing this does is changing the updated_at field of the user.
|
||||
Afaict this came to be because prior to pins federating this was split
|
||||
into two functions, one of which created a changeset, the other applying
|
||||
a given changeset. When this was merged the bits were just copied into
|
||||
place.
|
||||
---
|
||||
lib/pleroma/user.ex | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
|
||||
index 2f4ac1b72..697597e1b 100644
|
||||
--- a/lib/pleroma/user.ex
|
||||
+++ b/lib/pleroma/user.ex
|
||||
@@ -2581,10 +2581,10 @@ def add_pinned_object_id(%User{} = user, object_id) do
|
||||
[pinned_objects: "You have already pinned the maximum number of statuses"]
|
||||
end
|
||||
end)
|
||||
+ |> update_and_set_cache()
|
||||
else
|
||||
- change(user)
|
||||
+ {:ok, user}
|
||||
end
|
||||
- |> update_and_set_cache()
|
||||
end
|
||||
|
||||
@spec remove_pinned_object_id(User.t(), String.t()) :: {:ok, t()} | {:error, term()}
|
||||
--
|
||||
2.39.5
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
From 8c8a263f4b57064a3ff8b6bcf0979ff1ef7bd473 Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Wed, 18 Dec 2024 00:55:48 +0100
|
||||
Subject: [PATCH 2/7] Gracefully ignore Undo activities referring to unknown
|
||||
objects
|
||||
|
||||
It's quite common to receive spurious Deletes,
|
||||
so we neither want to waste resources on retrying
|
||||
nor spam "invalid AP" logs
|
||||
---
|
||||
.../web/activity_pub/transmogrifier.ex | 14 ++++++++++++++
|
||||
.../web/activity_pub/transmogrifier_test.exs | 19 +++++++++++++++++++
|
||||
2 files changed, 33 insertions(+)
|
||||
|
||||
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
index d8405bf75..0f34d0ae8 100644
|
||||
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
@@ -604,6 +604,20 @@ defp handle_incoming_normalised(
|
||||
when type in ["Like", "EmojiReact", "Announce", "Block"] do
|
||||
with {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do
|
||||
{:ok, activity}
|
||||
+ else
|
||||
+ {:error, {:validate, {:error, %Ecto.Changeset{errors: errors}}}} = e ->
|
||||
+ # If we never saw the activity being undone, no need to do anything.
|
||||
+ # Inspectinging the validation error content is a bit akward, but looking up the Activity
|
||||
+ # ahead of time here would be too costly since Activity queries are not cached
|
||||
+ # and there's no way atm to pass the retrieved result along along
|
||||
+ if errors[:object] == {"can't find object", []} do
|
||||
+ {:error, :ignore}
|
||||
+ else
|
||||
+ e
|
||||
+ end
|
||||
+
|
||||
+ e ->
|
||||
+ e
|
||||
end
|
||||
end
|
||||
|
||||
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
|
||||
index 94df25100..be07a0fe4 100644
|
||||
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
|
||||
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
|
||||
@@ -52,6 +52,25 @@ test "it works for incoming unfollows with an existing follow" do
|
||||
refute User.following?(User.get_cached_by_ap_id(data["actor"]), user)
|
||||
end
|
||||
|
||||
+ test "it ignores Undo activities for unknown objects" do
|
||||
+ undo_data = %{
|
||||
+ "id" => "https://remote.com/undo",
|
||||
+ "type" => "Undo",
|
||||
+ "actor" => "https:://remote.com/users/unknown",
|
||||
+ "object" => %{
|
||||
+ "id" => "https://remote.com/undone_activity/unknown",
|
||||
+ "type" => "Like"
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ assert {:error, :ignore} == Transmogrifier.handle_incoming(undo_data)
|
||||
+
|
||||
+ user = insert(:user, local: false, ap_id: "https://remote.com/users/known")
|
||||
+ undo_data = %{undo_data | "actor" => user.ap_id}
|
||||
+
|
||||
+ assert {:error, :ignore} == Transmogrifier.handle_incoming(undo_data)
|
||||
+ end
|
||||
+
|
||||
test "it accepts Flag activities" do
|
||||
user = insert(:user)
|
||||
other_user = insert(:user)
|
||||
--
|
||||
2.39.5
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
From f3caccf7281b5ba57970d9a3c07cdddac98cd341 Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Wed, 18 Dec 2024 01:07:31 +0100
|
||||
Subject: [PATCH 3/7] object_validators: only query relevant table for object
|
||||
|
||||
Most of them actually only accept either activities or a
|
||||
non-activity object later; querying both is then a waste
|
||||
of resources and may create false positives.
|
||||
---
|
||||
.../activity_pub/object_validators/common_validations.ex | 6 +++++-
|
||||
.../web/activity_pub/object_validators/delete_validator.ex | 5 ++++-
|
||||
.../activity_pub/object_validators/emoji_react_validator.ex | 2 +-
|
||||
.../web/activity_pub/object_validators/like_validator.ex | 2 +-
|
||||
.../web/activity_pub/object_validators/undo_validator.ex | 2 +-
|
||||
5 files changed, 12 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_validations.ex b/lib/pleroma/web/activity_pub/object_validators/common_validations.ex
|
||||
index be5074348..f28cdca92 100644
|
||||
--- a/lib/pleroma/web/activity_pub/object_validators/common_validations.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/object_validators/common_validations.ex
|
||||
@@ -54,10 +54,14 @@ def validate_actor_presence(cng, options \\ []) do
|
||||
def validate_object_presence(cng, options \\ []) do
|
||||
field_name = Keyword.get(options, :field_name, :object)
|
||||
allowed_types = Keyword.get(options, :allowed_types, false)
|
||||
+ allowed_categories = Keyword.get(options, :allowed_object_categores, [:object, :activity])
|
||||
|
||||
cng
|
||||
|> validate_change(field_name, fn field_name, object_id ->
|
||||
- object = Object.get_cached_by_ap_id(object_id) || Activity.get_by_ap_id(object_id)
|
||||
+ object =
|
||||
+ (:object in allowed_categories && Object.get_cached_by_ap_id(object_id)) ||
|
||||
+ (:activity in allowed_categories && Activity.get_by_ap_id(object_id)) ||
|
||||
+ nil
|
||||
|
||||
cond do
|
||||
!object ->
|
||||
diff --git a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
|
||||
index a08e8ebe0..2dcb9a5d6 100644
|
||||
--- a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
|
||||
@@ -61,7 +61,10 @@ defp validate_data(cng) do
|
||||
|> validate_inclusion(:type, ["Delete"])
|
||||
|> validate_delete_actor(:actor)
|
||||
|> validate_modification_rights()
|
||||
- |> validate_object_or_user_presence(allowed_types: @deletable_types)
|
||||
+ |> validate_object_or_user_presence(
|
||||
+ allowed_types: @deletable_types,
|
||||
+ allowed_object_categories: [:object]
|
||||
+ )
|
||||
|> add_deleted_activity_id()
|
||||
end
|
||||
|
||||
diff --git a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
|
||||
index bda67feee..9cafeeb14 100644
|
||||
--- a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex
|
||||
@@ -129,7 +129,7 @@ defp validate_data(data_cng) do
|
||||
|> validate_inclusion(:type, ["EmojiReact"])
|
||||
|> validate_required([:id, :type, :object, :actor, :context, :to, :cc, :content])
|
||||
|> validate_actor_presence()
|
||||
- |> validate_object_presence()
|
||||
+ |> validate_object_presence(allowed_object_categories: [:object])
|
||||
|> validate_emoji()
|
||||
|> maybe_validate_tag_presence()
|
||||
end
|
||||
diff --git a/lib/pleroma/web/activity_pub/object_validators/like_validator.ex b/lib/pleroma/web/activity_pub/object_validators/like_validator.ex
|
||||
index 35e000d72..44bb0c238 100644
|
||||
--- a/lib/pleroma/web/activity_pub/object_validators/like_validator.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/object_validators/like_validator.ex
|
||||
@@ -66,7 +66,7 @@ defp validate_data(data_cng) do
|
||||
|> validate_inclusion(:type, ["Like"])
|
||||
|> validate_required([:id, :type, :object, :actor, :context, :to, :cc])
|
||||
|> validate_actor_presence()
|
||||
- |> validate_object_presence()
|
||||
+ |> validate_object_presence(allowed_object_categories: [:object])
|
||||
|> validate_existing_like()
|
||||
end
|
||||
|
||||
diff --git a/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex b/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex
|
||||
index 703643e3f..06516f6c7 100644
|
||||
--- a/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex
|
||||
@@ -44,7 +44,7 @@ defp validate_data(data_cng) do
|
||||
|> validate_inclusion(:type, ["Undo"])
|
||||
|> validate_required([:id, :type, :object, :actor, :to, :cc])
|
||||
|> validate_undo_actor(:actor)
|
||||
- |> validate_object_presence()
|
||||
+ |> validate_object_presence(allowed_object_categories: [:activity])
|
||||
|> validate_undo_rights()
|
||||
end
|
||||
|
||||
--
|
||||
2.39.5
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
From 468c4e3cd34aa2f997fac46592667e9ff3b8bf1d Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Wed, 18 Dec 2024 01:21:56 +0100
|
||||
Subject: [PATCH 4/7] transmogrifier: avoid crashes on non-validation Delte
|
||||
errors
|
||||
|
||||
Happens e.g. for duplicated Deletes.
|
||||
The remaining tombstone object no longer has an actor,
|
||||
leading to an error response during side-effect handling.
|
||||
---
|
||||
lib/pleroma/web/activity_pub/transmogrifier.ex | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
index 0f34d0ae8..bb6e2cb0d 100644
|
||||
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
@@ -572,6 +572,12 @@ defp handle_incoming_normalised(
|
||||
else
|
||||
_ -> e
|
||||
end
|
||||
+
|
||||
+ {:error, _} = e ->
|
||||
+ e
|
||||
+
|
||||
+ e ->
|
||||
+ {:error, e}
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
2.39.5
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
From 8f3fb422e02a1795483fee9e9ecbcd2d8c7145aa Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Wed, 18 Dec 2024 01:27:32 +0100
|
||||
Subject: [PATCH 5/7] transmogrfier: be more selective about Delete retry
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
If something else renders the Delete invalid,
|
||||
there’s no point in retrying anyway
|
||||
---
|
||||
.../web/activity_pub/transmogrifier.ex | 26 ++++++++++++-------
|
||||
1 file changed, 16 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
index bb6e2cb0d..7954d979c 100644
|
||||
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
@@ -560,17 +560,23 @@ defp handle_incoming_normalised(
|
||||
Pipeline.common_pipeline(data, local: false) do
|
||||
{:ok, activity}
|
||||
else
|
||||
- {:error, {:validate, _}} = e ->
|
||||
- # Check if we have a create activity for this
|
||||
- with {:ok, object_id} <- ObjectValidators.ObjectID.cast(data["object"]),
|
||||
- %Activity{data: %{"actor" => actor}} <-
|
||||
- Activity.create_by_object_ap_id(object_id) |> Repo.one(),
|
||||
- # We have one, insert a tombstone and retry
|
||||
- {:ok, tombstone_data, _} <- Builder.tombstone(actor, object_id),
|
||||
- {:ok, _tombstone} <- Object.create(tombstone_data) do
|
||||
- handle_incoming(data)
|
||||
+ {:error, {:validate, {:error, %Ecto.Changeset{errors: errors}}}} = e ->
|
||||
+ if errors[:object] == {"can't find object", []} do
|
||||
+ # Check if we have a create activity for this
|
||||
+ # (e.g. from a db prune without --prune-activities)
|
||||
+ # We'd still like to process side effects so insert a tombstone and retry
|
||||
+ with {:ok, object_id} <- ObjectValidators.ObjectID.cast(data["object"]),
|
||||
+ %Activity{data: %{"actor" => actor}} <-
|
||||
+ Activity.create_by_object_ap_id(object_id) |> Repo.one(),
|
||||
+ # We have one, insert a tombstone and retry
|
||||
+ {:ok, tombstone_data, _} <- Builder.tombstone(actor, object_id),
|
||||
+ {:ok, _tombstone} <- Object.create(tombstone_data) do
|
||||
+ handle_incoming(data)
|
||||
+ else
|
||||
+ _ -> e
|
||||
+ end
|
||||
else
|
||||
- _ -> e
|
||||
+ e
|
||||
end
|
||||
|
||||
{:error, _} = e ->
|
||||
--
|
||||
2.39.5
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
From fa3f0457a777a5a49a2217e07357c6e7cabd16fb Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Wed, 18 Dec 2024 01:34:33 +0100
|
||||
Subject: [PATCH 6/7] transmogrifier: gracefully ignore duplicated object
|
||||
deletes
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The object lookup is later repeated in the validator, but due to
|
||||
caching shouldn't incur any noticeable performance impact.
|
||||
It’s actually preferable to check here, since it avoids the otherwise
|
||||
occuring user lookup and overhead from starting and aborting a
|
||||
transaction
|
||||
---
|
||||
lib/pleroma/object.ex | 5 +++++
|
||||
lib/pleroma/web/activity_pub/transmogrifier.ex | 18 ++++++++++++++----
|
||||
2 files changed, 19 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex
|
||||
index 379b361f8..f5797867c 100644
|
||||
--- a/lib/pleroma/object.ex
|
||||
+++ b/lib/pleroma/object.ex
|
||||
@@ -216,6 +216,11 @@ def get_cached_by_ap_id(ap_id) do
|
||||
end
|
||||
end
|
||||
|
||||
+ # Intentionally accepts non-Object arguments!
|
||||
+ @spec is_tombstone_object?(term()) :: boolean()
|
||||
+ def is_tombstone_object?(%Object{data: %{"type" => "Tombstone"}}), do: true
|
||||
+ def is_tombstone_object?(_), do: false
|
||||
+
|
||||
def make_tombstone(%Object{data: %{"id" => id, "type" => type}}, deleted \\ DateTime.utc_now()) do
|
||||
%ObjectTombstone{
|
||||
id: id,
|
||||
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
index 7954d979c..b890f573d 100644
|
||||
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
|
||||
@@ -556,19 +556,29 @@ defp handle_incoming_normalised(
|
||||
%{"type" => "Delete"} = data,
|
||||
_options
|
||||
) do
|
||||
- with {:ok, activity, _} <-
|
||||
- Pipeline.common_pipeline(data, local: false) do
|
||||
+ oid_result = ObjectValidators.ObjectID.cast(data["object"])
|
||||
+
|
||||
+ with {_, {:ok, object_id}} <- {:object_id, oid_result},
|
||||
+ object <- Object.get_cached_by_ap_id(object_id),
|
||||
+ {_, false} <- {:tombstone, Object.is_tombstone_object?(object) && !data["actor"]},
|
||||
+ {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do
|
||||
{:ok, activity}
|
||||
else
|
||||
+ {:object_id, _} ->
|
||||
+ {:error, {:validate, "Invalid object id: #{data["object"]}"}}
|
||||
+
|
||||
+ {:tombstone, true} ->
|
||||
+ {:error, :ignore}
|
||||
+
|
||||
{:error, {:validate, {:error, %Ecto.Changeset{errors: errors}}}} = e ->
|
||||
if errors[:object] == {"can't find object", []} do
|
||||
# Check if we have a create activity for this
|
||||
# (e.g. from a db prune without --prune-activities)
|
||||
- # We'd still like to process side effects so insert a tombstone and retry
|
||||
+ # We'd still like to process side effects so insert a fake tombstone and retry
|
||||
+ # (real tombstones from Object.delete do not have an actor field)
|
||||
with {:ok, object_id} <- ObjectValidators.ObjectID.cast(data["object"]),
|
||||
%Activity{data: %{"actor" => actor}} <-
|
||||
Activity.create_by_object_ap_id(object_id) |> Repo.one(),
|
||||
- # We have one, insert a tombstone and retry
|
||||
{:ok, tombstone_data, _} <- Builder.tombstone(actor, object_id),
|
||||
{:ok, _tombstone} <- Object.create(tombstone_data) do
|
||||
handle_incoming(data)
|
||||
--
|
||||
2.39.5
|
||||
|
39
patches/wip_30_dbg_log_receiver_crashes.patch
Normal file
39
patches/wip_30_dbg_log_receiver_crashes.patch
Normal file
|
@ -0,0 +1,39 @@
|
|||
From 2af623e81b3a84ff658ff3dba4f534f59468f563 Mon Sep 17 00:00:00 2001
|
||||
From: Oneric <oneric@oneric.stub>
|
||||
Date: Sun, 15 Dec 2024 02:50:20 +0100
|
||||
Subject: [PATCH 7/7] tmp/dbg: make sure crashes in receiver are actually
|
||||
logged
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Rarely (once a day or so) there’s still a ReceiverWorker excception
|
||||
showing up in prometheus stats without any corresponding log message
|
||||
---
|
||||
lib/pleroma/workers/receiver_worker.ex | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/pleroma/workers/receiver_worker.ex b/lib/pleroma/workers/receiver_worker.ex
|
||||
index cffdd8584..61f3ce7f1 100644
|
||||
--- a/lib/pleroma/workers/receiver_worker.ex
|
||||
+++ b/lib/pleroma/workers/receiver_worker.ex
|
||||
@@ -48,8 +48,15 @@ def perform(%Job{args: %{"op" => "incoming_ap_doc", "params" => params}}) do
|
||||
e
|
||||
|
||||
e ->
|
||||
- Logger.error("Unexpected AP doc error: (raw) #{inspect(e)} from #{inspect(params)}")
|
||||
+ Logger.error("Unexpected AP doc error: #{inspect(e)} from #{inspect(params)}")
|
||||
{:error, e}
|
||||
end
|
||||
+ rescue
|
||||
+ err ->
|
||||
+ Logger.error(
|
||||
+ "Receiver worker CRASH on #{params} with: #{Exception.format(:error, err, __STACKTRACE__)}"
|
||||
+ )
|
||||
+
|
||||
+ {:error, :crash}
|
||||
end
|
||||
end
|
||||
--
|
||||
2.39.5
|
||||
|
Loading…
Reference in a new issue