class SequenceServer::JobRemover
Removes expired jobs in a background thread.
Job
lifetime is provided in minutes. It can be zero in which case jobs will be deleted as soon as they are done, or it can be Infinity in which case jobs will never be deleted. Default is to delete finished jobs after 7 days.
Constants
- DEFAULT_JOB_LIFETIME
Public Class Methods
new(job_lifetime)
click to toggle source
# File lib/sequenceserver/job_remover.rb, line 12 def initialize(job_lifetime) @job_lifetime = job_lifetime || DEFAULT_JOB_LIFETIME return if @job_lifetime == 'Infinity' || @job_lifetime == Float::INFINITY @job_lifetime = Integer(@job_lifetime) * 60 spawn_cleanup end
Private Instance Methods
logid()
click to toggle source
Identifier for logs emitted by JobRemover
.
# File lib/sequenceserver/job_remover.rb, line 57 def logid @logid ||= self.class.name.split('::').last end
spawn_cleanup()
click to toggle source
# File lib/sequenceserver/job_remover.rb, line 25 def spawn_cleanup Thread.new do loop do now = Time.now finished_jobs = Job.all.select(&:done?) # Cleanup finished jobs that have lived a lifetime. expired_jobs = finished_jobs.select do |job| (job.completed_at + @job_lifetime) <= now end expired_jobs.each { |job| Job.delete job.id } logger.info "#{logid}: deleted #{expired_jobs.count} old jobs." unless expired_jobs.empty? # Decide when to cleanup next. remaining_jobs = finished_jobs - expired_jobs oldest_time = remaining_jobs.map(&:completed_at).min @next_cleanup = if oldest_time && now < (oldest_time + @job_lifetime) (oldest_time + @job_lifetime) - now else @job_lifetime end # Sleep till next cleanup. sleep @next_cleanup.ceil rescue StandardError => e logger.fatal("#{logid}: #{e.inspect}\n#{e.backtrace.join("\n")}") Thread.exit end end end