37 lines
862 B
Ruby
37 lines
862 B
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Database
|
||
|
module Reindexing
|
||
|
class IndexSelection
|
||
|
include Enumerable
|
||
|
|
||
|
delegate :each, to: :indexes
|
||
|
|
||
|
def initialize(candidates)
|
||
|
@candidates = candidates
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :candidates
|
||
|
|
||
|
def indexes
|
||
|
# This is an explicit N+1 query:
|
||
|
# Bloat estimates are generally available through a view
|
||
|
# for all indexes. However, estimating bloat for all
|
||
|
# indexes at once is an expensive operation. Therefore,
|
||
|
# we force a N+1 pattern here and estimate bloat on a per-index
|
||
|
# basis.
|
||
|
|
||
|
@indexes ||= filter_candidates.sort_by(&:bloat_size).reverse
|
||
|
end
|
||
|
|
||
|
def filter_candidates
|
||
|
candidates.not_recently_reindexed
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|