diff options
Diffstat (limited to 'db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb')
-rw-r--r-- | db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb b/db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb new file mode 100644 index 00000000000..c1f4b7e42ab --- /dev/null +++ b/db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class FixAnyApproverRuleForProjects < ActiveRecord::Migration[5.2] + DOWNTIME = false + BATCH_SIZE = 1000 + + disable_ddl_transaction! + + class ApprovalProjectRule < ActiveRecord::Base + NON_EXISTENT_RULE_TYPE = 4 + ANY_APPROVER_RULE_TYPE = 3 + + include EachBatch + + self.table_name = 'approval_project_rules' + + scope :any_approver, -> { where(rule_type: ANY_APPROVER_RULE_TYPE) } + scope :non_existent_rule_type, -> { where(rule_type: NON_EXISTENT_RULE_TYPE) } + end + + def up + return unless Gitlab.ee? + + # Remove approval project rule with rule type 4 if the project has a rule with rule_type 3 + # + # Currently, there is no projects on gitlab.com which have both rules with 3 and 4 rule type + # There's a code-level validation for a rule, which doesn't allow to create rules with the same names + # + # But in order to avoid failing the update query due to uniqueness constraint + # Let's run the delete query to be sure + project_ids = FixAnyApproverRuleForProjects::ApprovalProjectRule.any_approver.select(:project_id) + FixAnyApproverRuleForProjects::ApprovalProjectRule + .non_existent_rule_type + .where(project_id: project_ids) + .delete_all + + # Set approval project rule types to 3 + # Currently there are 18_445 records to be updated + FixAnyApproverRuleForProjects::ApprovalProjectRule.non_existent_rule_type.each_batch(of: BATCH_SIZE) do |rules| + rules.update_all(rule_type: FixAnyApproverRuleForProjects::ApprovalProjectRule::ANY_APPROVER_RULE_TYPE) + end + end + + def down + # The migration doesn't leave the database in an inconsistent state + # And can be run multiple times + end +end |