41 lines
1.2 KiB
Ruby
41 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Database
|
|
module QueryAnalyzers
|
|
module Ci
|
|
# The purpose of this analyzer is to detect queries not going through a partitioning routing table
|
|
class PartitioningAnalyzer < Database::QueryAnalyzers::Base
|
|
RoutingTableNotUsedError = Class.new(QueryAnalyzerError)
|
|
|
|
ENABLED_TABLES = %w[
|
|
ci_builds_metadata
|
|
].freeze
|
|
|
|
class << self
|
|
def enabled?
|
|
::Feature::FlipperFeature.table_exists? &&
|
|
::Feature.enabled?(:ci_partitioning_analyze_queries, type: :ops)
|
|
end
|
|
|
|
def analyze(parsed)
|
|
analyze_legacy_tables_usage(parsed)
|
|
end
|
|
|
|
private
|
|
|
|
def analyze_legacy_tables_usage(parsed)
|
|
detected = ENABLED_TABLES & (parsed.pg.dml_tables + parsed.pg.select_tables)
|
|
|
|
return if detected.none?
|
|
|
|
::Gitlab::ErrorTracking.track_and_raise_for_dev_exception(
|
|
RoutingTableNotUsedError.new("Detected non-partitioned table use #{detected.inspect}: #{parsed.sql}")
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|