[分享] 极狐 GitLab 升级前怎样处理后台卡住的数据迁移任务?

我们在执行系统升级前需要确保后台数据迁移任务已完成,但在某些情况下,后台有一些任务长时间(几天甚至几个星期)始终处于未完成的状态,这种情况该如何处理呢?

首先,在 gitlab-psql 中查出这些未完成的任务:

select job_class_name, table_name, column_name, job_arguments from batched_background_migrations where status <> 3;

其次,对于状态是 queued 、已经在队列中的任务,可以尝试如下操作;

##check remaining job
sudo gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'

# Start the rails console
sudo gitlab-rails c
# Execute the following in the rails console
scheduled_queue = Sidekiq::ScheduledSet.new
pending_job_classes = scheduled_queue.select { |job| job["class"] == "BackgroundMigrationWorker" }.map { |job| job["args"].first }.uniq
pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_class) }

第三,对于卡在 pending 状态的任务,

这种情况的处理首先需要根据 特定版本的说明文档

不在特定版本的说明文档里的,可以如下处理:

##执行下面的检测命令、确认是否存在长时间 pending 、状态未变化的任务
sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigrationJob.pending.count'

##尝试重新执行数据迁移
# Start the rails console
sudo gitlab-rails c
# Execute the following in the rails console
Gitlab::Database::BackgroundMigrationJob.pending.find_each do |job|
  puts "Running pending job '#{job.class_name}' with arguments #{job.arguments}"
  result = Gitlab::BackgroundMigration.perform(job.class_name, job.arguments)
  puts "Result: #{result}"
end

您也可以参考官网文档 Batched background migrations,了解详细信息。