Prune old Update activities
Some checks failed
ci/woodpecker/pr/lint Pipeline was successful
ci/woodpecker/pr/test Pipeline failed
ci/woodpecker/pr/build-arm64 unknown status
ci/woodpecker/pr/build-amd64 unknown status
ci/woodpecker/pr/docs unknown status

Once processed they serve no purpose anymore afaict.
Therefor, lets prune them like other transient activities
to not unnecessarily bloat the table.
This commit is contained in:
Oneric 2024-02-09 23:26:23 +01:00
parent 1ef8b967d2
commit 1a7839eaf2
4 changed files with 95 additions and 4 deletions

View file

@ -26,6 +26,15 @@ def prune_undos do
|> Repo.delete_all(timeout: :infinity) |> Repo.delete_all(timeout: :infinity)
end end
def prune_updates do
before_time = cutoff()
from(a in Activity,
where: fragment("?->>'type' = ?", a.data, "Update") and a.inserted_at < ^before_time
)
|> Repo.delete_all(timeout: :infinity)
end
def prune_removes do def prune_removes do
before_time = cutoff() before_time = cutoff()

View file

@ -21,6 +21,9 @@ def perform(_job) do
Logger.info("Pruning old undos") Logger.info("Pruning old undos")
ActivityPruner.prune_undos() ActivityPruner.prune_undos()
Logger.info("Pruning old updates")
ActivityPruner.prune_updates()
Logger.info("Pruning old removes") Logger.info("Pruning old removes")
ActivityPruner.prune_removes() ActivityPruner.prune_removes()

View file

@ -6,22 +6,52 @@ defmodule Pleroma.Activity.PrunerTest do
import Pleroma.Factory import Pleroma.Factory
describe "prune_deletes" do describe "prune_transient_activities" do
test "it prunes old delete objects" do test "it prunes old transient activities" do
user = insert(:user) user = insert(:user)
old_time = DateTime.utc_now() |> DateTime.add(-31 * 24, :hour)
new_delete = insert(:delete_activity, type: "Delete", user: user) new_delete = insert(:delete_activity, type: "Delete", user: user)
old_delete = old_delete =
insert(:delete_activity, insert(:delete_activity,
type: "Delete",
user: user, user: user,
inserted_at: DateTime.utc_now() |> DateTime.add(-31 * 24, :hour) inserted_at: old_time
) )
new_update = insert(:update_activity, type: "Update", user: user)
old_update =
insert(:update_activity,
type: "Update",
user: user,
inserted_at: old_time
)
new_undo = insert(:undo_activity)
old_undo = insert(:undo_activity, inserted_at: old_time)
new_remove = insert(:remove_activity)
old_remove = insert(:remove_activity, inserted_at: old_time)
Pruner.prune_deletes() Pruner.prune_deletes()
Pruner.prune_updates()
Pruner.prune_undos()
Pruner.prune_removes()
assert Activity.get_by_id(new_delete.id) assert Activity.get_by_id(new_delete.id)
refute Activity.get_by_id(old_delete.id) refute Activity.get_by_id(old_delete.id)
assert Activity.get_by_id(new_update.id)
refute Activity.get_by_id(old_update.id)
assert Activity.get_by_id(new_undo.id)
refute Activity.get_by_id(old_undo.id)
assert Activity.get_by_id(new_remove.id)
refute Activity.get_by_id(old_remove.id)
end end
end end

View file

@ -9,6 +9,7 @@ defmodule Pleroma.Factory do
alias Pleroma.Object alias Pleroma.Object
alias Pleroma.User alias Pleroma.User
alias Pleroma.Web.ActivityPub.UserView
@rsa_keys [ @rsa_keys [
"test/fixtures/rsa_keys/key_1.pem", "test/fixtures/rsa_keys/key_1.pem",
@ -554,6 +555,54 @@ def delete_activity_factory(attrs \\ %{}) do
|> Map.merge(attrs) |> Map.merge(attrs)
end end
def undo_activity_factory(attrs \\ %{}) do
like_activity = attrs[:like_activity] || insert(:like_activity)
attrs = Map.drop(attrs, [:like_activity])
data =
%{
"id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(),
"type" => "Undo",
"actor" => like_activity.data["actor"],
"to" => like_activity.data["to"],
"object" => like_activity.data["id"],
"published" => DateTime.utc_now() |> DateTime.to_iso8601(),
"context" => like_activity.data["context"]
}
%Pleroma.Activity{
data: data,
actor: data["actor"],
recipients: data["to"]
}
|> Map.merge(attrs)
end
def update_activity_factory(attrs \\ %{}) do
user = attrs[:user] || insert(:user, nickname: "testuser")
attrs = Map.drop(attrs, [:user])
user_data =
UserView.render("user.json", %{user: user})
|> Map.merge(%{"name" => "new display name"})
data = %{
"type" => "Update",
"to" => [
user_data["followers"],
"https://www.w3.org/ns/activitystreams#Public"
],
"actor" => user_data["id"],
"object" => user_data
}
%Pleroma.Activity{
actor: user_data["id"],
data: data
}
|> Map.merge(attrs)
end
def oauth_app_factory do def oauth_app_factory do
%Pleroma.Web.OAuth.App{ %Pleroma.Web.OAuth.App{
client_name: sequence(:client_name, &"Some client #{&1}"), client_name: sequence(:client_name, &"Some client #{&1}"),