summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@vanlanduyt.co>2018-02-08 09:11:00 +0100
committerBob Van Landuyt <bob@vanlanduyt.co>2018-02-08 09:44:58 +0100
commit0478ff7cd44d291e931436b8fcd4c5c53b249741 (patch)
tree2af589d99a37a5875cac3ccbcfaae01dc4888c3a
parent7e00adcc71877677637a8ebe0680f1d38176e7c8 (diff)
downloadgitlab-ce-0478ff7cd44d291e931436b8fcd4c5c53b249741.tar.gz
Handle uniqueness on fork_network_member creation
Since the migration might be queued already and be rescheduled when it fails on a uniqueness error, this should help clearing the background migration queue faster.
-rw-r--r--lib/gitlab/background_migration/create_fork_network_memberships_range.rb15
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/gitlab/background_migration/create_fork_network_memberships_range.rb b/lib/gitlab/background_migration/create_fork_network_memberships_range.rb
index 03b17b319fa..1b4a9e8a194 100644
--- a/lib/gitlab/background_migration/create_fork_network_memberships_range.rb
+++ b/lib/gitlab/background_migration/create_fork_network_memberships_range.rb
@@ -14,6 +14,14 @@ module Gitlab
def perform(start_id, end_id)
log("Creating memberships for forks: #{start_id} - #{end_id}")
+ insert_members(start_id, end_id)
+
+ if missing_members?(start_id, end_id)
+ BackgroundMigrationWorker.perform_in(RESCHEDULE_DELAY, "CreateForkNetworkMembershipsRange", [start_id, end_id])
+ end
+ end
+
+ def insert_members(start_id, end_id)
ActiveRecord::Base.connection.execute <<~INSERT_MEMBERS
INSERT INTO fork_network_members (fork_network_id, project_id, forked_from_project_id)
@@ -33,10 +41,9 @@ module Gitlab
WHERE existing_members.project_id = forked_project_links.forked_to_project_id
)
INSERT_MEMBERS
-
- if missing_members?(start_id, end_id)
- BackgroundMigrationWorker.perform_in(RESCHEDULE_DELAY, "CreateForkNetworkMembershipsRange", [start_id, end_id])
- end
+ rescue ActiveRecord::RecordNotUnique => e
+ # `fork_network_member` was created concurrently in another migration
+ log(e.message)
end
def missing_members?(start_id, end_id)