Skip to content

Commit 407f3e0

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

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def post(execution)
2222
wrap_in_app_executor do
2323
thread_execution.perform
2424
ensure
25+
ActiveRecord::Base.clear_active_connections! if SolidQueue.clear_connections_after_job
2526
available_threads.increment
2627
mutex.synchronize { on_idle.try(:call) if idle? }
2728
end
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
require "test_helper"
2+
require "active_support/testing/method_call_assertions"
3+
4+
class ConnectionClearingTest < ActiveSupport::TestCase
5+
include ActiveSupport::Testing::MethodCallAssertions
6+
include JobsTestHelper
7+
8+
self.use_transactional_tests = false
9+
10+
test "clears ActiveRecord connections when flag enabled" do
11+
old_flag, SolidQueue.clear_connections_after_job = SolidQueue.clear_connections_after_job, true
12+
13+
ActiveRecord::Base.expects(:clear_active_connections!).at_least_once
14+
15+
AddToBufferJob.perform_later "clear"
16+
17+
worker = SolidQueue::Worker.new(queues: "background", threads: 1, polling_interval: 0.1)
18+
worker.start
19+
wait_for_jobs_to_finish_for(2.seconds)
20+
worker.stop
21+
ensure
22+
SolidQueue.clear_connections_after_job = old_flag
23+
end
24+
25+
test "does not clear ActiveRecord connections when flag disabled" do
26+
old_flag, SolidQueue.clear_connections_after_job = SolidQueue.clear_connections_after_job, false
27+
28+
ActiveRecord::Base.expects(:clear_active_connections!).never
29+
30+
AddToBufferJob.perform_later "noclear"
31+
32+
worker = SolidQueue::Worker.new(queues: "background", threads: 1, polling_interval: 0.1)
33+
worker.start
34+
wait_for_jobs_to_finish_for(2.seconds)
35+
worker.stop
36+
ensure
37+
SolidQueue.clear_connections_after_job = old_flag
38+
end
39+
end

0 commit comments

Comments
 (0)