Skip to content

Commit a5fd044

Browse files
feat: add optional clearing of ActiveRecord connections after each job
1 parent 6dc5c66 commit a5fd044

File tree

4 files changed

+56
-0
lines changed

4 files changed

+56
-0
lines changed

lib/solid_queue.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ module SolidQueue
4040
mattr_accessor :preserve_finished_jobs, default: true
4141
mattr_accessor :clear_finished_jobs_after, default: 1.day
4242
mattr_accessor :default_concurrency_control_period, default: 3.minutes
43+
mattr_accessor :clear_connections_after_job, default: false
4344

4445
delegate :on_start, :on_stop, :on_exit, to: Supervisor
4546

lib/solid_queue/pool.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frozen_string_literal: true
22

3+
require "active_record"
4+
35
module SolidQueue
46
class Pool
57
include AppExecutor
@@ -22,6 +24,7 @@ def post(execution)
2224
wrap_in_app_executor do
2325
thread_execution.perform
2426
ensure
27+
ActiveRecord::Base.clear_active_connections! if SolidQueue.clear_connections_after_job
2528
available_threads.increment
2629
mutex.synchronize { on_idle.try(:call) if idle? }
2730
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require "test_helper"
2+
require "active_support/testing/method_call_assertions"
3+
4+
class PoolConnectionClearTest < ActiveSupport::TestCase
5+
include ActiveSupport::Testing::MethodCallAssertions
6+
include JobsTestHelper
7+
8+
self.use_transactional_tests = false
9+
10+
test "clears ActiveRecord connections after executing a job" do
11+
old_flag, SolidQueue.clear_connections_after_job = SolidQueue.clear_connections_after_job, true
12+
# Enqueue a simple job
13+
AddToBufferJob.perform_later "memory check"
14+
15+
# Expect ActiveRecord connections to be cleared at least once during job processing
16+
ActiveRecord::Base.expects(:clear_active_connections!).at_least_once
17+
18+
worker = SolidQueue::Worker.new(queues: "background", threads: 1, polling_interval: 0.1)
19+
worker.start
20+
21+
# Wait for the job to finish and stop the worker
22+
wait_for_jobs_to_finish_for(2.seconds)
23+
worker.stop
24+
ensure
25+
SolidQueue.clear_connections_after_job = old_flag
26+
end
27+
end
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
require "test_helper"
2+
require "active_support/testing/method_call_assertions"
3+
4+
class PoolConnectionClearToggleTest < ActiveSupport::TestCase
5+
include ActiveSupport::Testing::MethodCallAssertions
6+
include JobsTestHelper
7+
8+
self.use_transactional_tests = false
9+
10+
test "does not clear ActiveRecord connections when feature is disabled" do
11+
old_flag, SolidQueue.clear_connections_after_job = SolidQueue.clear_connections_after_job, false
12+
13+
AddToBufferJob.perform_later "no clear"
14+
15+
ActiveRecord::Base.expects(:clear_active_connections!).never
16+
17+
worker = SolidQueue::Worker.new(queues: "background", threads: 1, polling_interval: 0.1)
18+
worker.start
19+
20+
wait_for_jobs_to_finish_for(2.seconds)
21+
worker.stop
22+
ensure
23+
SolidQueue.clear_connections_after_job = old_flag
24+
end
25+
end

0 commit comments

Comments
 (0)