Class: AuthorizedProjectUpdate::PeriodicRecalculateService

Inherits:
Object
  • Object
show all
Defined in:
app/services/authorized_project_update/periodic_recalculate_service.rb

Constant Summary collapse

BATCH_SIZE =
450
DELAY_INTERVAL =
50.seconds.to_i

Instance Method Summary collapse

Instance Method Details

#executeObject



8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'app/services/authorized_project_update/periodic_recalculate_service.rb', line 8

def execute
  # Using this approach (instead of eg. User.each_batch) keeps the arguments
  # the same for AuthorizedProjectUpdate::UserRefreshOverUserRangeWorker
  # even if the user list changes, so we can deduplicate these jobs.

  # Since UserRefreshOverUserRangeWorker has set data_consistency to delayed,
  # a job enqueued without a delay could fail because the replica could not catch up with the primary.
  # To prevent this, we start the index from `1` instead of `0` so as to ensure that
  # no UserRefreshOverUserRangeWorker job is enqueued without a delay.
  (1..User.maximum(:id)).each_slice(BATCH_SIZE).with_index(1) do |batch, index|
    delay = DELAY_INTERVAL * index
    AuthorizedProjectUpdate::UserRefreshOverUserRangeWorker.perform_in(delay, *batch.minmax)
  end
end