38 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| namespace :gitlab do
 | |
|   namespace :external_diffs do
 | |
|     desc "Override external diffs in file storage to be in object storage instead. This does not change the actual location of the data"
 | |
|     task force_object_storage: :environment do |t, args|
 | |
|       ansi = Gitlab::Utils.to_boolean(ENV.fetch('ANSI', true))
 | |
|       batch = ENV.fetch('BATCH_SIZE', 1000)
 | |
|       start_id = ENV.fetch('START_ID', nil)
 | |
|       end_id = ENV.fetch('END_ID', nil)
 | |
|       update_delay = args.fetch('UPDATE_DELAY', 1)
 | |
| 
 | |
|       # Use ANSI codes to overwrite the same line repeatedly if supported
 | |
|       newline = ansi ? "\x1B8\x1B[2K" : "\n"
 | |
| 
 | |
|       total = 0
 | |
| 
 | |
|       # The only useful index on the table is by id, so scan through the whole
 | |
|       # table by that and filter out those we don't want on each relation
 | |
|       MergeRequestDiff.in_batches(of: batch, start: start_id, finish: end_id) do |relation| # rubocop:disable Cop/InBatches
 | |
|         count = relation
 | |
|           .except(:order)
 | |
|           .where(stored_externally: true, external_diff_store: ExternalDiffUploader::Store::LOCAL)
 | |
|           .update_all(external_diff_store: ExternalDiffUploader::Store::REMOTE)
 | |
| 
 | |
|         total += count
 | |
| 
 | |
|         if count > 0
 | |
|           print "#{newline}#{total} updated..."
 | |
|           sleep(update_delay) if update_delay > 0
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       puts "done!"
 | |
|     end
 | |
|   end
 | |
| end
 |