51 lines
1.4 KiB
Ruby
51 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ResetOnColumnErrors
|
|
extend ActiveSupport::Concern
|
|
|
|
MAX_RESET_PERIOD = 10.minutes
|
|
|
|
included do |base|
|
|
base.rescue_from ActiveRecord::StatementInvalid, with: :reset_on_union_error
|
|
base.rescue_from ActiveModel::UnknownAttributeError, with: :reset_on_unknown_attribute_error
|
|
|
|
base.class_attribute :previous_reset_columns_from_error
|
|
end
|
|
|
|
class_methods do
|
|
def do_reset(exception)
|
|
class_to_be_reset = base_class
|
|
|
|
class_to_be_reset.reset_column_information
|
|
Gitlab::ErrorTracking.log_exception(exception, { reset_model_name: class_to_be_reset.name })
|
|
|
|
class_to_be_reset.previous_reset_columns_from_error = Time.current
|
|
end
|
|
|
|
def reset_on_union_error(exception)
|
|
if exception.message.include?("each UNION query must have the same number of columns") && should_reset?
|
|
do_reset(exception)
|
|
end
|
|
|
|
raise
|
|
end
|
|
|
|
def should_reset?
|
|
return false if base_class.previous_reset_columns_from_error? &&
|
|
base_class.previous_reset_columns_from_error > MAX_RESET_PERIOD.ago
|
|
|
|
Feature.enabled?(:reset_column_information_on_statement_invalid, type: :ops)
|
|
end
|
|
end
|
|
|
|
def reset_on_union_error(exception)
|
|
self.class.reset_on_union_error(exception)
|
|
end
|
|
|
|
def reset_on_unknown_attribute_error(exception)
|
|
self.class.do_reset(exception) if self.class.should_reset?
|
|
|
|
raise
|
|
end
|
|
end
|