2022-07-16 23:28:13 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Gitlab
|
|
|
|
module BackgroundMigration
|
|
|
|
# Fixes notes with NULL discussion_ids due to a bug when importing from GitHub
|
|
|
|
# Bug was fixed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76517
|
|
|
|
class BackfillNoteDiscussionId
|
|
|
|
SUB_BATCH_SIZE = 300
|
|
|
|
|
|
|
|
# Migration only version of notes model
|
|
|
|
class Note < ApplicationRecord
|
|
|
|
include EachBatch
|
|
|
|
|
|
|
|
self.table_name = 'notes'
|
|
|
|
|
|
|
|
# Based on https://gitlab.com/gitlab-org/gitlab/blob/117c14d0c79403e169cf52922b48f69d1dcf6a85/app/models/discussion.rb#L62-74
|
|
|
|
def generate_discussion_id
|
|
|
|
Digest::SHA1.hexdigest(
|
|
|
|
[:discussion, noteable_type.try(:underscore), noteable_id || commit_id, SecureRandom.hex].join('-')
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def perform(start_id, stop_id)
|
|
|
|
notes = Note.select(:id, :noteable_type, :noteable_id, :commit_id)
|
|
|
|
.where(discussion_id: nil, id: start_id..stop_id)
|
|
|
|
|
|
|
|
notes.each_batch(of: SUB_BATCH_SIZE) do |relation|
|
|
|
|
update_discussion_ids(relation)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def update_discussion_ids(notes)
|
2023-03-04 22:38:38 +05:30
|
|
|
mapping = notes.index_with do |note|
|
|
|
|
{ discussion_id: note.generate_discussion_id }
|
2022-07-16 23:28:13 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
Gitlab::Database::BulkUpdate.execute(%i(discussion_id), mapping)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|