Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									6cd5b7dbfa
								
							
						
					
					
						commit
						26804e91d9
					
				|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Sync issuables state_id with null values | ||||
| merge_request: 16480 | ||||
| author: | ||||
| type: other | ||||
|  | @ -0,0 +1,79 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| # Sync remaining records for issues/merge_requests tables where state_id | ||||
| # is still null. | ||||
| # For more information check: https://gitlab.com/gitlab-org/gitlab-ee/issues/26823 | ||||
| # It creates a temporary index before performing the UPDATES to sync values. | ||||
| # | ||||
| # In 09-11-2019 we have the following numbers for records with state_id == nil: | ||||
| # | ||||
| # 1348 issues - default batch size for each update 67 | ||||
| # 10247 merge requests - default batch size for each update 511 | ||||
| 
 | ||||
| class SyncIssuablesStateId < ActiveRecord::Migration[5.2] | ||||
|   include Gitlab::Database::MigrationHelpers | ||||
| 
 | ||||
|   DOWNTIME = false | ||||
| 
 | ||||
|   disable_ddl_transaction! | ||||
| 
 | ||||
|   def up | ||||
|     %i(issues merge_requests).each do |table| | ||||
|       temp_index_name = index_name_for(table) | ||||
| 
 | ||||
|       add_concurrent_index( | ||||
|         table, | ||||
|         'id', | ||||
|         name: temp_index_name, | ||||
|         where: 'state_id IS NULL' | ||||
|       ) | ||||
| 
 | ||||
|       update_value = update_condition_for(table) | ||||
| 
 | ||||
|       update_column_in_batches(table, :state_id, update_value) do |table, query| | ||||
|         query.where(table[:state_id].eq(nil)) | ||||
|       end | ||||
|     ensure | ||||
|       remove_concurrent_index_by_name(table, temp_index_name) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def down | ||||
|     # NO OP | ||||
|   end | ||||
| 
 | ||||
|   def update_condition_for(table) | ||||
|     value_expresson = | ||||
|       if table == :issues | ||||
|         issues_state_id_condition | ||||
|       else | ||||
|         merge_requests_state_id_condition | ||||
|       end | ||||
| 
 | ||||
|     Arel.sql(value_expresson) | ||||
|   end | ||||
| 
 | ||||
|   def index_name_for(table) | ||||
|     "idx_tmp_on_#{table}_where_state_id_is_null" | ||||
|   end | ||||
| 
 | ||||
|   def issues_state_id_condition | ||||
|     <<~SQL | ||||
|       CASE state | ||||
|       WHEN 'opened' THEN 1 | ||||
|       WHEN 'closed' THEN 2 | ||||
|       END | ||||
|     SQL | ||||
|   end | ||||
| 
 | ||||
|   def merge_requests_state_id_condition | ||||
|     <<~SQL | ||||
|       CASE state | ||||
|       WHEN 'opened' THEN 1 | ||||
|       WHEN 'closed' THEN 2 | ||||
|       WHEN 'merged' THEN 3 | ||||
|       WHEN 'locked' THEN 4 | ||||
|       END | ||||
|     SQL | ||||
|   end | ||||
| end | ||||
|  | @ -0,0 +1,37 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| require 'spec_helper' | ||||
| require Rails.root.join('db', 'post_migrate', '20190911251732_sync_issuables_state_id') | ||||
| 
 | ||||
| describe SyncIssuablesStateId, :migration, :sidekiq do | ||||
|   let(:migration) { described_class.new } | ||||
| 
 | ||||
|   describe '#up' do | ||||
|     let(:issues) { table(:issues) } | ||||
|     let(:namespaces) { table(:namespaces) } | ||||
|     let(:projects) { table(:projects) } | ||||
|     let(:merge_requests) { table(:merge_requests) } | ||||
|     let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') } | ||||
|     let(:project) { projects.create!(namespace_id: group.id) } | ||||
|     # These state_ids should be the same defined on Issue/MergeRequest models | ||||
|     let(:state_ids) { { opened: 1, closed: 2, merged: 3, locked: 4 } } | ||||
| 
 | ||||
|     it 'migrates state column to state_id as integer' do | ||||
|       opened_issue = issues.create!(description: 'first', state: 'opened') | ||||
|       closed_issue = issues.create!(description: 'second', state: 'closed') | ||||
|       opened_merge_request = merge_requests.create!(state: 'opened', target_project_id: project.id, target_branch: 'feature1', source_branch: 'master') | ||||
|       closed_merge_request = merge_requests.create!(state: 'closed', target_project_id: project.id, target_branch: 'feature2', source_branch: 'master') | ||||
|       merged_merge_request = merge_requests.create!(state: 'merged', target_project_id: project.id, target_branch: 'feature3', source_branch: 'master') | ||||
|       locked_merge_request = merge_requests.create!(state: 'locked', target_project_id: project.id, target_branch: 'feature4', source_branch: 'master') | ||||
| 
 | ||||
|       migrate! | ||||
| 
 | ||||
|       expect(opened_issue.reload.state_id).to eq(state_ids[:opened]) | ||||
|       expect(closed_issue.reload.state_id).to eq(state_ids[:closed]) | ||||
|       expect(opened_merge_request.reload.state_id).to eq(state_ids[:opened]) | ||||
|       expect(closed_merge_request.reload.state_id).to eq(state_ids[:closed]) | ||||
|       expect(merged_merge_request.reload.state_id).to eq(state_ids[:merged]) | ||||
|       expect(locked_merge_request.reload.state_id).to eq(state_ids[:locked]) | ||||
|     end | ||||
|   end | ||||
| end | ||||
		Loading…
	
		Reference in New Issue