2018-11-09 18:39:43 +00:00
# frozen_string_literal: true
2018-05-15 09:35:00 +00:00
module Gitlab
module HashedStorage
module RakeHelper
def self . batch_size
ENV . fetch ( 'BATCH' , 200 ) . to_i
end
2018-05-21 16:40:27 +00:00
def self . listing_limit
ENV . fetch ( 'LIMIT' , 500 ) . to_i
end
2018-06-07 15:40:44 +00:00
def self . range_from
ENV [ 'ID_FROM' ]
end
def self . range_to
ENV [ 'ID_TO' ]
end
def self . range_single_item?
! range_from . nil? && range_from == range_to
end
2018-08-27 15:31:01 +00:00
# rubocop: disable CodeReuse/ActiveRecord
2019-01-23 02:40:05 +00:00
def self . project_id_batches_migration ( & block )
2018-06-07 15:40:44 +00:00
Project . with_unmigrated_storage . in_batches ( of : batch_size , start : range_from , finish : range_to ) do | relation | # rubocop: disable Cop/InBatches
2018-05-15 09:35:00 +00:00
ids = relation . pluck ( :id )
yield ids . min , ids . max
end
end
2018-08-27 15:31:01 +00:00
# rubocop: enable CodeReuse/ActiveRecord
2018-05-15 09:35:00 +00:00
2018-08-27 15:31:01 +00:00
# rubocop: disable CodeReuse/ActiveRecord
2019-01-23 02:40:05 +00:00
def self . project_id_batches_rollback ( & block )
Project . with_storage_feature ( :repository ) . in_batches ( of : batch_size , start : range_from , finish : range_to ) do | relation | # rubocop: disable Cop/InBatches
ids = relation . pluck ( :id )
yield ids . min , ids . max
end
end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
2018-05-15 09:35:00 +00:00
def self . legacy_attachments_relation
Upload . joins ( << ~ SQL ) . where ( 'projects.storage_version < :version OR projects.storage_version IS NULL' , version : Project :: HASHED_STORAGE_FEATURES [ :attachments ] )
2018-05-21 16:40:27 +00:00
JOIN projects
ON ( uploads . model_type = 'Project' AND uploads . model_id = projects . id )
2018-05-15 09:35:00 +00:00
SQL
end
2018-08-27 15:31:01 +00:00
# rubocop: enable CodeReuse/ActiveRecord
2018-05-15 09:35:00 +00:00
2018-08-27 15:31:01 +00:00
# rubocop: disable CodeReuse/ActiveRecord
2018-05-15 09:35:00 +00:00
def self . hashed_attachments_relation
Upload . joins ( << ~ SQL ) . where ( 'projects.storage_version >= :version' , version : Project :: HASHED_STORAGE_FEATURES [ :attachments ] )
2018-05-21 16:40:27 +00:00
JOIN projects
ON ( uploads . model_type = 'Project' AND uploads . model_id = projects . id )
2018-05-15 09:35:00 +00:00
SQL
end
2018-08-27 15:31:01 +00:00
# rubocop: enable CodeReuse/ActiveRecord
2018-05-15 09:35:00 +00:00
def self . relation_summary ( relation_name , relation )
relation_count = relation . count
$stdout . puts " * Found #{ relation_count } #{ relation_name } " . color ( :green )
relation_count
end
def self . projects_list ( relation_name , relation )
2018-05-22 02:14:27 +00:00
listing ( relation_name , relation . with_route ) do | project |
2018-05-21 16:40:27 +00:00
$stdout . puts " - #{ project . full_path } (id: #{ project . id } ) " . color ( :red )
2018-05-15 09:35:00 +00:00
end
end
def self . attachments_list ( relation_name , relation )
2018-05-22 02:14:27 +00:00
listing ( relation_name , relation ) do | upload |
$stdout . puts " - #{ upload . path } (id: #{ upload . id } ) " . color ( :red )
end
end
2018-08-27 15:31:01 +00:00
# rubocop: disable CodeReuse/ActiveRecord
2018-05-22 02:14:27 +00:00
def self . listing ( relation_name , relation )
2018-05-15 09:35:00 +00:00
relation_count = relation_summary ( relation_name , relation )
return unless relation_count > 0
2018-05-21 16:40:27 +00:00
limit = listing_limit
2018-05-15 09:35:00 +00:00
2018-05-22 02:14:27 +00:00
if relation_count > limit
$stdout . puts " ! Displaying first #{ limit } #{ relation_name } ... "
end
2018-05-15 09:35:00 +00:00
2018-05-22 02:14:27 +00:00
relation . find_each ( batch_size : batch_size ) . with_index do | element , index |
yield element
2018-05-15 09:35:00 +00:00
2018-05-21 16:40:27 +00:00
break if index + 1 > = limit
2018-05-15 09:35:00 +00:00
end
end
2018-08-27 15:31:01 +00:00
# rubocop: enable CodeReuse/ActiveRecord
2018-05-15 09:35:00 +00:00
end
end
end