lib/good_job.rb in good_job-3.15.1 vs lib/good_job.rb in good_job-3.15.2
- old
+ new
@@ -160,25 +160,36 @@
# analyze or inspect job performance.
# If you are preserving job records this way, use this method regularly to
# destroy old records and preserve space in your database.
# @param older_than [nil,Numeric,ActiveSupport::Duration] Jobs older than this will be destroyed (default: +86400+).
# @return [Integer] Number of job execution records and batches that were destroyed.
- def self.cleanup_preserved_jobs(older_than: nil)
+ def self.cleanup_preserved_jobs(older_than: nil, in_batches_of: 1_000)
older_than ||= GoodJob.configuration.cleanup_preserved_jobs_before_seconds_ago
timestamp = Time.current - older_than
include_discarded = GoodJob.configuration.cleanup_discarded_jobs?
ActiveSupport::Notifications.instrument("cleanup_preserved_jobs.good_job", { older_than: older_than, timestamp: timestamp }) do |payload|
- old_jobs = GoodJob::Job.where('finished_at <= ?', timestamp)
- old_jobs = old_jobs.succeeded unless include_discarded
- deleted_executions_count = GoodJob::Execution.where(job: old_jobs).delete_all
+ deleted_executions_count = 0
+ deleted_batches_count = 0
+ jobs_query = GoodJob::Job.where('finished_at <= ?', timestamp).order(finished_at: :asc).limit(in_batches_of)
+ jobs_query = jobs_query.succeeded unless include_discarded
+ loop do
+ deleted = GoodJob::Execution.where(job: jobs_query).delete_all
+ break if deleted.zero?
+
+ deleted_executions_count += deleted
+ end
+
if GoodJob::BatchRecord.migrated?
- old_batches = GoodJob::BatchRecord.where('finished_at <= ?', timestamp)
- old_batches = old_batches.succeeded unless include_discarded
- deleted_batches_count = old_batches.delete_all
- else
- deleted_batches_count = 0
+ batches_query = GoodJob::BatchRecord.where('finished_at <= ?', timestamp).limit(in_batches_of)
+ batches_query = batches_query.succeeded unless include_discarded
+ loop do
+ deleted = batches_query.delete_all
+ break if deleted.zero?
+
+ deleted_batches_count += deleted
+ end
end
payload[:destroyed_executions_count] = deleted_executions_count
payload[:destroyed_batches_count] = deleted_batches_count
payload[:destroyed_records_count] = deleted_executions_count + deleted_batches_count