From 990f98c0441888f0e999377cadb6544feced517b Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 1 Jan 2022 21:38:44 -0600 Subject: ResolveActivityObjectConflicts: fix the foreign key error (temporarily disable triggers) --- lib/pleroma/migration_helper/object_id.ex | 26 +++++++++++++++------- ...218181640_resolve_activity_object_conflicts.exs | 6 ++--- 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 -- cgit v1.2.3