diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-03 21:07:42 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-06-03 21:07:42 +0300 |
commit | ccf3e9f2e2dca5cae6dc90083f15fef69833a79c (patch) | |
tree | 5a148c84767a3c90ff79fa38482216bb2c4f2e85 /config | |
parent | cd4685432eff18f4c829ff44a8ac990ddaf8971b (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'config')
-rw-r--r-- | config/feature_flags/ops/reset_column_information_on_statement_invalid.yml | 8 | ||||
-rw-r--r-- | config/initializers/active_record_relation_union_reset.rb | 36 |
2 files changed, 44 insertions, 0 deletions
diff --git a/config/feature_flags/ops/reset_column_information_on_statement_invalid.yml b/config/feature_flags/ops/reset_column_information_on_statement_invalid.yml new file mode 100644 index 00000000000..a2bbfaefafd --- /dev/null +++ b/config/feature_flags/ops/reset_column_information_on_statement_invalid.yml @@ -0,0 +1,8 @@ +--- +name: reset_column_information_on_statement_invalid +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121957 +rollout_issue_url: +milestone: '16.1' +type: ops +group: group::tenant scale +default_enabled: true diff --git a/config/initializers/active_record_relation_union_reset.rb b/config/initializers/active_record_relation_union_reset.rb new file mode 100644 index 00000000000..b8b3d634a61 --- /dev/null +++ b/config/initializers/active_record_relation_union_reset.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module ActiveRecordRelationUnionReset + MAX_RESET_PERIOD = 10.minutes + + def exec_queries + super + rescue ActiveRecord::StatementInvalid => e + if reset_on_statement_invalid?(e) + class_to_be_reset = klass.base_class + + class_to_be_reset.reset_column_information + Gitlab::ErrorTracking.log_exception(e, { reset_model_name: class_to_be_reset.name }) + + class_to_be_reset.previous_reset_columns_from_error = Time.now + end + + raise + end + + private + + def reset_on_statement_invalid?(exception) + return false unless exception.message.include?("each UNION query must have the same number of columns") + + return false if klass.base_class.previous_reset_columns_from_error? && + klass.base_class.previous_reset_columns_from_error > MAX_RESET_PERIOD.ago + + Feature.enabled?(:reset_column_information_on_statement_invalid, type: :ops) + end +end + +ActiveSupport.on_load(:active_record) do + ActiveRecord::Base.class_attribute :previous_reset_columns_from_error + ActiveRecord::Relation.prepend(ActiveRecordRelationUnionReset) +end |