From 9fa864448ee345272d0eb62cac553bc2caab7c28 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Mon, 26 Jun 2023 10:24:52 +0200 Subject: [PATCH] add tasks / job to migrate pjs under namespace --- app/jobs/pjs_migration_job.rb | 31 +++++++++++++++++++++++++++++++ lib/tasks/pjs.rake | 25 +++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 app/jobs/pjs_migration_job.rb create mode 100644 lib/tasks/pjs.rake diff --git a/app/jobs/pjs_migration_job.rb b/app/jobs/pjs_migration_job.rb new file mode 100644 index 000000000..eff8b5014 --- /dev/null +++ b/app/jobs/pjs_migration_job.rb @@ -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 diff --git a/lib/tasks/pjs.rake b/lib/tasks/pjs.rake new file mode 100644 index 000000000..6b52198fc --- /dev/null +++ b/lib/tasks/pjs.rake @@ -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