Skip to content

Commit

Permalink
Delete finished jobs by default, when they're executed
Browse files Browse the repository at this point in the history
  • Loading branch information
rosa committed Nov 20, 2023
1 parent 0bbe559 commit 1a5074a
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 12 deletions.
2 changes: 1 addition & 1 deletion app/models/solid_queue/claimed_execution.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def execute

def finished
transaction do
job.finished
job.finished!
destroy!
end

Expand Down
14 changes: 12 additions & 2 deletions app/models/solid_queue/job/executable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ module Job::Executable
has_one :scheduled_execution, dependent: :destroy

after_create :prepare_for_execution

scope :finished, -> { where.not(finished_at: nil) }
end

STATUSES = %w[ ready claimed failed scheduled ]
Expand All @@ -26,8 +28,12 @@ def prepare_for_execution
end
end

def finished
touch(:finished_at)
def finished!
if delete_finished_jobs?
destroy!
else
touch(:finished_at)
end
end

def finished?
Expand All @@ -50,5 +56,9 @@ def retry
def due?
scheduled_at.nil? || scheduled_at <= Time.current
end

def delete_finished_jobs?
SolidQueue.delete_finished_jobs
end
end
end
2 changes: 2 additions & 0 deletions lib/solid_queue.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ module SolidQueue
mattr_accessor :supervisor_pidfile
mattr_accessor :supervisor, default: false

mattr_accessor :delete_finished_jobs, default: true

def self.supervisor?
supervisor
end
Expand Down
3 changes: 3 additions & 0 deletions test/dummy/config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,8 @@ class Application < Rails::Application
# config.eager_load_paths << Rails.root.join("extras")

config.active_job.queue_adapter = :solid_queue

config.solid_queue.logger = ActiveSupport::Logger.new(nil)
config.solid_queue.delete_finished_jobs = false
end
end
32 changes: 27 additions & 5 deletions test/integration/jobs_lifecycle_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

class JobsLifecycleTest < ActiveSupport::TestCase
setup do
@worker = SolidQueue::Worker.new(queues: "background", threads: 3, polling_interval: 1)
@scheduler = SolidQueue::Scheduler.new(batch_size: 10, polling_interval: 1)
@worker = SolidQueue::Worker.new(queues: "background", threads: 3, polling_interval: 0.5)
@scheduler = SolidQueue::Scheduler.new(batch_size: 10, polling_interval: 0.5)
end

teardown do
Expand All @@ -21,9 +21,10 @@ class JobsLifecycleTest < ActiveSupport::TestCase
@scheduler.start(mode: :async)
@worker.start(mode: :async)

wait_for_jobs_to_finish_for(0.5.seconds)
wait_for_jobs_to_finish_for(2.seconds)

assert_equal [ "hey", "ho" ], JobBuffer.values.sort
assert_equal 2, SolidQueue::Job.finished.count
end

test "schedule and run jobs" do
Expand All @@ -37,16 +38,37 @@ class JobsLifecycleTest < ActiveSupport::TestCase

travel_to 2.days.from_now

wait_for_jobs_to_finish_for(5.seconds)
wait_for_jobs_to_finish_for(2.seconds)

assert_equal 1, JobBuffer.size
assert_equal "I'm scheduled", JobBuffer.last_value

travel_to 5.days.from_now

wait_for_jobs_to_finish_for(5.seconds)
wait_for_jobs_to_finish_for(2.seconds)

assert_equal 2, JobBuffer.size
assert_equal "I'm scheduled later", JobBuffer.last_value

assert_equal 2, SolidQueue::Job.finished.count
end

test "delete finished jobs after they run" do
deleting_finished_jobs do
AddToBufferJob.perform_later "hey"
@worker.start(mode: :async)

wait_for_jobs_to_finish_for(2.seconds)
end

assert_equal 0, SolidQueue::Job.count
end

private
def deleting_finished_jobs
previous, SolidQueue.delete_finished_jobs = SolidQueue.delete_finished_jobs, true
yield
ensure
SolidQueue.delete_finished_jobs = previous
end
end
4 changes: 0 additions & 4 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@ def write(...)
Logger::LogDevice.prepend(BlockLogDeviceTimeoutExceptions)

class ActiveSupport::TestCase
setup do
SolidQueue.logger = ActiveSupport::Logger.new(nil)
end

teardown do
JobBuffer.clear

Expand Down

0 comments on commit 1a5074a

Please sign in to comment.