Prune old Update activities

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)
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
before_time = cutoff()

View file

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

View file

@ -6,22 +6,52 @@ defmodule Pleroma.Activity.PrunerTest do
import Pleroma.Factory
describe "prune_deletes" do
test "it prunes old delete objects" do
describe "prune_transient_activities" do
test "it prunes old transient activities" do
user = insert(:user)
old_time = DateTime.utc_now() |> DateTime.add(-31 * 24, :hour)
new_delete = insert(:delete_activity, type: "Delete", user: user)
old_delete =
insert(:delete_activity,
type: "Delete",
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_updates()
Pruner.prune_undos()
Pruner.prune_removes()
assert Activity.get_by_id(new_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

View file

@ -9,6 +9,7 @@ defmodule Pleroma.Factory do
alias Pleroma.Object
alias Pleroma.User
alias Pleroma.Web.ActivityPub.UserView
@rsa_keys [
"test/fixtures/rsa_keys/key_1.pem",
@ -554,6 +555,54 @@ def delete_activity_factory(attrs \\ %{}) do
|> Map.merge(attrs)
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
%Pleroma.Web.OAuth.App{
client_name: sequence(:client_name, &"Some client #{&1}"),