Así que tuve que salir en vivo sin esperar a que terminara el rebake completo. Después de salir en vivo, no pude ejecutar el rebake ya que mataría el servidor. Podría ejecutar el rebake en la cola predeterminada, ya que retrasaría todos los demás procesos como las notificaciones.
Así que usé este script para poner en cola todas las tareas de rebake en la cola sidekiq de prioridad ultrabaja. Lo comparto aquí por si alguien más lo necesita.
# slow_rebake_resumer_ultralow.rb
# Reanuda la puesta en cola de trabajos de rebake desde un punto específico y los envía
# directamente a la cola de prioridad :ultra_low.
# ejecutar dentro del contenedor con -> rails runner slow_rebake_resumer_ultralow.rb
# --- Configuración ---
BATCH_SIZE = 500
SLEEP_DURATION = 5
# --- Punto de inicio de tu última actualización ---
last_processed_id = 1952526
# --------------------
start_time = Time.now
total_posts = Post.count
puts "Reanudando y poniendo en cola trabajos de rebake para #{total_posts} publicaciones en la cola :ultra_low..."
puts "Comenzando después de la publicación ID #{last_processed_id}."
puts "---"
loop do
# Encuentra eficientemente el siguiente lote de publicaciones a procesar
posts_to_enqueue = Post.where("id "> ?", last_processed_id).order(id: :asc).limit(BATCH_SIZE)
# Sal del bucle si no quedan más publicaciones
break if posts_to_enqueue.empty?
posts_to_enqueue.each do |post|
begin
# Define todas las opciones en un único hash, incluida la cola de destino
options = {
post_id: post.id,
cook: true,
bypass_bump: true,
queue: :ultra_low
}
# Poner en cola el trabajo con la sintaxis correcta y verificada
Jobs.enqueue(:process_post, options)
rescue ="> e"
puts "!!! ERROR al poner en cola el trabajo para el ID de publicación #{post.id}: #{e.message}"
end
end
# Actualiza nuestra posición al último ID de publicación del lote actual
last_processed_id = posts_to_enqueue.last.id
# Obtén un recuento más preciso para el informe de progreso
enqueued_count = Post.where("id "> ?", last_processed_id).count
# --- Informes de progreso ---
percentage = (enqueued_count.to_f / total_posts * 100).round(2)
elapsed_minutes = ((Time.now - start_time) / 60).round(2)
puts "Puestas en cola hasta la publicación ID #{last_processed_id}. Total puestas en cola: ~#{enqueued_count} / #{total_posts} (#{percentage}%)"
puts "Tiempo transcurrido (esta sesión): #{elapsed_minutes} minutos."
puts "Los trabajos se envían a la cola :ultra_low."
# Pausa entre lotes para mantener la carga baja
if enqueued_count < total_posts
puts "Durmiendo durante #{SLEEP_DURATION} segundos..."
sleep(SLEEP_DURATION)
puts "---"
end
end
puts "\n¡Todos los trabajos de rebake restantes se han puesto en cola con éxito en la cola :ultra_low!"