add tasks / job to migrate pjs under namespace

This commit is contained in:
simon lehericey 2023-06-26 10:24:52 +02:00
parent 7ce7a3f62c
commit 9fa864448e
2 changed files with 56 additions and 0 deletions

View file

@ -0,0 +1,31 @@
class PjsMigrationJob < ApplicationJob
queue_as :pj_migration_jobs
def perform(blob_id)
blob = Blob.find(blob_id)
return if already_moved?(blob)
service = blob.service
client = service.client
container = service.container
old_key = blob.key
new_key = "#{blob.created_at.year}/#{old_key[0..1]}/#{old_key[2..3]}/#{old_key}"
excon_response = client.copy_object(container,
old_key,
container,
new_key,
{ "Content-Type" => blob.content_type })
if excon_response.status == 201
blob.update_columns(key: new_key)
client.delete_object(container, old_key)
end
rescue Fog::OpenStack::Storage::NotFound
end
def already_moved?(blob)
blob.key.include?('/')
end
end

25
lib/tasks/pjs.rake Normal file
View file

@ -0,0 +1,25 @@
namespace :pjs do
task stats: :environment do
end
desc <<~EOD
bin/rake 'pjs:migrate['aa']'
bin/rake 'pjs:migrate['aa-ab-ac']'
EOD
task :migrate, [:prefixes] => :environment do |_t, args|
# [a-b] => "key LIKE 'a%' or key LIKE 'b%'"
prefix_like_query = args[:prefixes]
.split('-')
.map { "key LIKE '#{_1}%'" }
.join(' or ')
blobs = ActiveStorage::Blob
.where(prefix_like_query)
.where.not("key LIKE '%/%'") # do not touch already moved blob
blobs_count = blobs.count
rake_puts "targeted prefix: #{args[:prefixes]}, #{blobs_count} blobs"
blobs.in_batches { |batch| batch.ids.each { |id| PjsMigrationJob.perform_later(id) } }
end
end