Class: Spotlight::ReindexExhibitJob

Inherits:
ApplicationJob show all
Includes:
JobTracking, LimitConcurrency
Defined in:
app/jobs/spotlight/reindex_exhibit_job.rb

Overview

Reindex an exhibit by parallelizing resource indexing into multiple batches of reindex jobs

Constant Summary

Constants included from LimitConcurrency

LimitConcurrency::VALIDITY_TOKEN_PARAMETER

Instance Method Summary collapse

Methods included from JobTracking

#finalize_job_tracker!, #initialize_job_tracker!, #job_tracker, #mark_job_as_failed!

Instance Method Details

#perform(exhibit, batch_size: Spotlight::Engine.config.reindexing_batch_size, batch_count: Spotlight::Engine.config.reindexing_batch_count) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'app/jobs/spotlight/reindex_exhibit_job.rb', line 12

def perform(exhibit, batch_size: Spotlight::Engine.config.reindexing_batch_size, batch_count: Spotlight::Engine.config.reindexing_batch_count, **)
  count = exhibit.resources.count

  # Use the provided batch size, or calculate a reasonable default
  batch_count = (count.to_f / batch_size).ceil if batch_size
  batch_count ||= 1 + Math.log(count).round # e.g. 10 => 3, 100 => 6, 1000 => 8

  return Spotlight::ReindexJob.perform_now(exhibit, reports_on: job_tracker) if batch_count == 1

  batch_size ||= (count.to_f / batch_count).ceil

  perform_later_in_batches(exhibit, of: batch_size)

  # mark the job as 'pending' and let the UpdateJobTrackersJob finalize this status after the ReindexJobs finish
  job_tracker.update(status: 'pending')
end

#perform_later_in_batches(exhibit, of:) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'app/jobs/spotlight/reindex_exhibit_job.rb', line 29

def perform_later_in_batches(exhibit, of:)
  last = 0
  exhibit.resources.select(:id).in_batches(of: of) do |batch|
    last = batch.last.id
    Spotlight::ReindexJob.perform_later(exhibit, reports_on: job_tracker, start: batch.first.id, finish: batch.last.id)
  end

  Spotlight::ReindexJob.perform_later(exhibit, reports_on: job_tracker, start: last)
end