blob: c69289fb91fb6c208d6fd9b9fd05f9c6d2d46f36 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
# A job to set namespaces.traversal_ids in sub-batches, of all namespaces
# without a parent and not already set.
# rubocop:disable Style/Documentation
class BackfillNamespaceTraversalIdsRoots
class Namespace < ActiveRecord::Base
include ::EachBatch
self.table_name = 'namespaces'
scope :base_query, -> { where(parent_id: nil) }
end
PAUSE_SECONDS = 0.1
def perform(start_id, end_id, sub_batch_size)
ranged_query = Namespace.base_query
.where(id: start_id..end_id)
.where("traversal_ids = '{}'")
ranged_query.each_batch(of: sub_batch_size) do |sub_batch|
first, last = sub_batch.pick(Arel.sql('min(id), max(id)'))
# The query need to be reconstructed because .each_batch modifies the default scope
# See: https://gitlab.com/gitlab-org/gitlab/-/issues/330510
Namespace.unscoped
.base_query
.where(id: first..last)
.where("traversal_ids = '{}'")
.update_all('traversal_ids = ARRAY[id]')
sleep PAUSE_SECONDS
end
mark_job_as_succeeded(start_id, end_id, sub_batch_size)
end
private
def mark_job_as_succeeded(*arguments)
Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
'BackfillNamespaceTraversalIdsRoots',
arguments
)
end
end
end
end
|