aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pleroma/migration_helper/object_id.ex26
-rw-r--r--priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs6
2 files changed, 21 insertions, 11 deletions
diff --git a/lib/pleroma/migration_helper/object_id.ex b/lib/pleroma/migration_helper/object_id.ex
index f122ff7b1..170c15666 100644
--- a/lib/pleroma/migration_helper/object_id.ex
+++ b/lib/pleroma/migration_helper/object_id.ex
@@ -19,14 +19,24 @@ defmodule Pleroma.MigrationHelper.ObjectId do
@doc "Change an object's ID including all references."
def change_id(%Object{id: old_id} = object, new_id) do
Repo.transaction(fn ->
- with {:ok, _} <- Repo.query("SET CONSTRAINTS ALL DEFERRED"),
- {:ok, _} <- update_object_fk(MessageReference, old_id, new_id),
- {:ok, _} <- update_object_fk(Delivery, old_id, new_id),
- {:ok, _} <- update_object_fk(HashtagObject, old_id, new_id),
- {:ok, _} <- update_object_fk(DataMigrationFailedId, old_id, new_id, :record_id),
- {:ok, object} <- Repo.update(change(object, id: new_id)) do
- {:ok, object}
- end
+ # Temporarily disable triggers (and by consequence, fkey constraints)
+ # https://stackoverflow.com/a/18709987
+ Repo.query!("SET session_replication_role = replica")
+
+ # Update foreign keys
+ update_object_fk(MessageReference, old_id, new_id)
+ update_object_fk(Delivery, old_id, new_id)
+ update_object_fk(HashtagObject, old_id, new_id)
+ update_object_fk(DataMigrationFailedId, old_id, new_id, :record_id)
+
+ # Update the object
+ object = Repo.update!(change(object, id: new_id))
+
+ # Re-enable triggers
+ Repo.query!("SET session_replication_role = DEFAULT")
+
+ # Return the object
+ object
end)
end
diff --git a/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs b/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs
index 1e5a76ce9..8c1172332 100644
--- a/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs
+++ b/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs
@@ -20,7 +20,7 @@ defmodule Pleroma.Repo.Migrations.ResolveActivityObjectConflicts do
activity_conflict_query()
|> Repo.stream()
- |> Stream.each(&update_object/1)
+ |> Stream.each(&update_object!/1)
|> Stream.run()
end
@@ -30,9 +30,9 @@ defmodule Pleroma.Repo.Migrations.ResolveActivityObjectConflicts do
end
# Update the object and its relations with a newly-generated ID.
- defp update_object(object) do
+ defp update_object!(object) do
new_id = ObjectId.flake_from_time(object.inserted_at)
- ObjectId.change_id(object, new_id)
+ {:ok, %Object{}} = ObjectId.change_id(object, new_id)
end
def down do