Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-06-03 21:07:42 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-06-03 21:07:42 +0300
commitccf3e9f2e2dca5cae6dc90083f15fef69833a79c (patch)
tree5a148c84767a3c90ff79fa38482216bb2c4f2e85 /config
parentcd4685432eff18f4c829ff44a8ac990ddaf8971b (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.yml8
-rw-r--r--config/initializers/active_record_relation_union_reset.rb36
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