Skip to content

Commit

Permalink
Add index, FKs, and method to clear finished jobs after a configured …
Browse files Browse the repository at this point in the history
…time

The foreign keys with cascade delete are just a failsafe, to ensure we don't
fail to clear executions after deleting jobs.
  • Loading branch information
rosa committed Dec 6, 2023
1 parent cd65cab commit f1a6319
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 2 deletions.
13 changes: 13 additions & 0 deletions app/models/solid_queue/job/clearable.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module SolidQueue
class Job
module Clearable
extend ActiveSupport::Concern

class_methods do
def clear_finished_in_batches(batch_size: 500, finished_before: SolidQueue.clear_finished_jobs_after.ago)
where(finished_at: ...finished_before).in_batches(of: batch_size).delete_all
end
end
end
end
end
2 changes: 1 addition & 1 deletion app/models/solid_queue/job/executable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module Executable
extend ActiveSupport::Concern

included do
include ConcurrencyControls
include Clearable, ConcurrencyControls

has_one :ready_execution, dependent: :destroy
has_one :claimed_execution, dependent: :destroy
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class AddIndexAndForeignKeysForClearing < ActiveRecord::Migration[7.1]
def change
add_index :solid_queue_jobs, :finished_at

%w[ scheduled ready blocked claimed failed ].each do |execution_type|
add_foreign_key "solid_queue_#{execution_type}_executions", :solid_queue_jobs, column: :job_id, on_delete: :cascade
end
end
end
8 changes: 7 additions & 1 deletion test/dummy/db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.1].define(version: 2023_12_01_102514) do
ActiveRecord::Schema[7.1].define(version: 2023_12_06_150233) do
create_table "job_results", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "queue_name"
t.string "status"
Expand Down Expand Up @@ -58,6 +58,7 @@
t.string "concurrency_key"
t.index ["active_job_id"], name: "index_solid_queue_jobs_on_job_id"
t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name"
t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at"
t.index ["queue_name", "scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting"
end

Expand Down Expand Up @@ -107,4 +108,9 @@
t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true
end

add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
end
22 changes: 22 additions & 0 deletions test/integration/jobs_lifecycle_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,28 @@ class JobsLifecycleTest < ActiveSupport::TestCase
assert_equal 0, SolidQueue::Job.count
end

test "clear finished jobs after configured period" do
10.times { AddToBufferJob.perform_later(2) }
jobs = SolidQueue::Job.last(10)

assert_no_difference -> { SolidQueue::Job.count } do
SolidQueue::Job.clear_finished_in_batches
end

# Simulate that only 5 of these jobs finished
jobs.sample(5).each(&:finished!)

assert_no_difference -> { SolidQueue::Job.count } do
SolidQueue::Job.clear_finished_in_batches
end

travel_to 3.days.from_now

assert_difference -> { SolidQueue::Job.count }, -5 do
SolidQueue::Job.clear_finished_in_batches
end
end

private
def deleting_finished_jobs
previous, SolidQueue.preserve_finished_jobs = SolidQueue.preserve_finished_jobs, false
Expand Down

0 comments on commit f1a6319

Please sign in to comment.