class OnlineMigrations::BackgroundMigrations::MigrationJobRunner

@private

Attributes

migration_job[R]

Public Class Methods

new(migration_job) click to toggle source
# File lib/online_migrations/background_migrations/migration_job_runner.rb, line 12
def initialize(migration_job)
  @migration_job = migration_job
end

Public Instance Methods

run() click to toggle source
# File lib/online_migrations/background_migrations/migration_job_runner.rb, line 16
def run
  job_payload = { background_migration_job: migration_job }
  if migration_job.attempts >= 1
    ActiveSupport::Notifications.instrument("retried.background_migrations", job_payload)
  end

  migration_job.update!(
    attempts: attempts + 1,
    status: :running,
    started_at: Time.current,
    finished_at: nil,
    error_class: nil,
    error_message: nil,
    backtrace: nil
  )

  ActiveSupport::Notifications.instrument("process_batch.background_migrations", job_payload) do
    run_batch
  end

  migration_job.update!(status: :succeeded, finished_at: Time.current)
rescue Exception => e # rubocop:disable Lint/RescueException
  backtrace_cleaner = ::OnlineMigrations.config.background_migrations.backtrace_cleaner

  migration_job.update!(
    status: :failed,
    finished_at: Time.current,
    error_class: e.class.name,
    error_message: e.message,
    backtrace: backtrace_cleaner ? backtrace_cleaner.clean(e.backtrace) : e.backtrace
  )

  ::OnlineMigrations.config.background_migrations.error_handler.call(e, migration_job)
end

Private Instance Methods

run_batch() click to toggle source
# File lib/online_migrations/background_migrations/migration_job_runner.rb, line 52
def run_batch
  iterator = ::OnlineMigrations::BatchIterator.new(migration_relation)

  iterator.each_batch(of: sub_batch_size, column: batch_column_name,
                      start: min_value, finish: max_value) do |sub_batch|
    migration_object.process_batch(sub_batch)
    sleep(pause_ms * 0.001) if pause_ms > 0
  end
end