From fc5b3a8fa51a4cbc116cc7e702602dd03cb726e1 Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Fri, 10 Jun 2016 17:33:23 +0200 Subject: [PATCH] Fix MySQL migration, obtain lock the right way As suggested by @yorrickpeterse in https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/4581#note_12373882 the locking of the MySQL database wasn't correct. --- ...82152_convert_award_note_to_emoji_award.rb | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb b/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb index b523f17417..3906ab7939 100644 --- a/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb +++ b/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb @@ -20,20 +20,21 @@ class ConvertAwardNoteToEmojiAward < ActiveRecord::Migration def migrate_postgresql connection.transaction do execute 'LOCK notes IN EXCLUSIVE' - migrate_notes + execute "INSERT INTO award_emoji (awardable_type, awardable_id, user_id, name, created_at, updated_at) (SELECT noteable_type, noteable_id, author_id, note, created_at, updated_at FROM notes WHERE is_award = true)" + execute "DELETE FROM notes WHERE is_award = true" + remove_column :notes, :is_award, :boolean end end def migrate_mysql - execute 'LOCK TABLES notes WRITE' - migrate_notes + execute <<-EOF + lock tables notes WRITE, award_emoji WRITE; + INSERT INTO award_emoji (awardable_type, awardable_id, user_id, name, created_at, updated_at) (SELECT noteable_type, noteable_id, author_id, note, created_at, updated_at FROM notes WHERE is_award = true); + EOF + + execute "DELETE FROM notes WHERE is_award = true" + remove_column :notes, :is_award, :boolean ensure execute 'UNLOCK TABLES' end - - def migrate_notes - execute "INSERT INTO award_emoji (awardable_type, awardable_id, user_id, name, created_at, updated_at) (SELECT noteable_type, noteable_id, author_id, note, created_at, updated_at FROM notes WHERE is_award = true)" - execute "DELETE FROM notes WHERE is_award = true" - remove_column :notes, :is_award, :boolean - end end