36 lines
862 B
Ruby
36 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
|