From 938666661083d88672090acbb1c7bca1195ef3be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Kar=C3=A9kinian?= Date: Thu, 15 Dec 2016 16:28:19 +0100 Subject: [PATCH] Add a migration runner to be able to run the script on all users... ... on as many servers as we want Set the migration key in platform for all users: User.storage_customer.each do |u| FiveAppsStore::Application.redis_remotestorage.hset( "rs:size_migration", u.username, "not_started" ) end --- migrate_storage_size_from_metadata.rb | 57 ++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/migrate_storage_size_from_metadata.rb b/migrate_storage_size_from_metadata.rb index 6d854fe..bd04bd3 100755 --- a/migrate_storage_size_from_metadata.rb +++ b/migrate_storage_size_from_metadata.rb @@ -26,14 +26,17 @@ class Migrator def migrate logger.info "Starting migration for '#{username}'" + set_container_migration_state("in_progress") begin write_storage_size_from_redis_metadata(username) rescue Exception => ex logger.error "Error setting storage size from metadata for '#{username}': #{ex}" + set_container_migration_state("not_started") # write username to file for later reference File.open('log/failed_migration.log', 'a') { |f| f.puts username } exit 1 end + delete_container_migration_state logger.info "Finished migration for '#{username}'" end @@ -79,17 +82,53 @@ class Migrator redis.eval(lua_script, ["rs:s:#{user}"], [user]) end + def set_container_migration_state(type) + redis.hset("rs:size_migration", username, type) + end + + def delete_container_migration_state + redis.hdel("rs:size_migration", username) + end + +end + +class MigrationRunner + attr_accessor :environment, :settings + + def initialize + @environment = ENV["ENVIRONMENT"] || "staging" + @settings = YAML.load(File.read('config.yml'))[@environment] + end + + def migrate + while username = pick_unmigrated_user + migrator = Migrator.new username + migrator.migrate + end + end + + def unmigrated_users + redis.hgetall("rs:size_migration").select { |_, value| + value == "not_started" + }.keys + end + + def pick_unmigrated_user + unmigrated_users.sample # pick a random user from list + end + + def redis + @redis ||= Redis.new(@settings["redis"].symbolize_keys) + end + end username = ARGV[0] -unless username - puts "No username given." - puts "Usage:" - puts "ENVIRONMENT=staging ./migrate_storage_size_from_metadata.rb " - exit 1 +if username + migrator = Migrator.new username + migrator.migrate +else + runner = MigrationRunner.new + runner.migrate end - -migrator = Migrator.new username -migrator.migrate -