diff --git a/README.md b/README.md index f44d538b..c2364ce7 100644 --- a/README.md +++ b/README.md @@ -298,7 +298,7 @@ There are several settings that control how Solid Queue works that you can set a - `silence_polling`: whether to silence Active Record logs emitted when polling for both workers and dispatchers—defaults to `true`. - `supervisor_pidfile`: path to a pidfile that the supervisor will create when booting to prevent running more than one supervisor in the same host, or in case you want to use it for a health check. It's `nil` by default. - `preserve_finished_jobs`: whether to keep finished jobs in the `solid_queue_jobs` table—defaults to `true`. -- `clear_finished_jobs_after`: period to keep finished jobs around, in case `preserve_finished_jobs` is true—defaults to 1 day. **Note:** Right now, there's no automatic cleanup of finished jobs. You'd need to do this by periodically invoking `SolidQueue::Job.clear_finished_in_batches`, but this will happen automatically in the near future. +- `clear_finished_jobs_after`: period to keep finished jobs around, in case `preserve_finished_jobs` is true—defaults to 1 day. **Note:** Right now, there's no automatic cleanup of finished jobs. You'd need to do this by periodically invoking `SolidQueue::Job.clear_finished_in_batches`, which can be configured as [a recurring task](#recurring-tasks). - `default_concurrency_control_period`: the value to be used as the default for the `duration` parameter in [concurrency controls](#concurrency-controls). It defaults to 3 minutes. diff --git a/app/models/solid_queue/job/clearable.rb b/app/models/solid_queue/job/clearable.rb index cc954d69..555026a6 100644 --- a/app/models/solid_queue/job/clearable.rb +++ b/app/models/solid_queue/job/clearable.rb @@ -10,9 +10,10 @@ module Clearable end class_methods do - def clear_finished_in_batches(batch_size: 500, finished_before: SolidQueue.clear_finished_jobs_after.ago, class_name: nil) + def clear_finished_in_batches(batch_size: 500, finished_before: SolidQueue.clear_finished_jobs_after.ago, class_name: nil, sleep_between_batches: 0) loop do records_deleted = clearable(finished_before: finished_before, class_name: class_name).limit(batch_size).delete_all + sleep(sleep_between_batches) if sleep_between_batches > 0 break if records_deleted == 0 end end