Skip to content

Commit fe5a532

Browse files
authored
Merge branch 'master' into avoid_connecting_to_primary_in_on_replica
2 parents dc0c02b + da36406 commit fe5a532

File tree

5 files changed

+34
-1
lines changed

5 files changed

+34
-1
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
## Unreleased
22

3+
- Allow setting `Knockoff.default_target` to set the default target other than `:primary` (https://github.com/joinhandshake/knockoff/pull/11)
34
- Drop Ruby 2.2 support
45
- Add Ruby 2.5 support

lib/knockoff.rb

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
module Knockoff
1111
class << self
1212
attr_accessor :enabled
13+
attr_reader :default_target
1314

1415
def on_replica(check_transaction: true, &block)
1516
Base.new(:replica, check_transaction: check_transaction).run(&block)
@@ -19,6 +20,10 @@ def on_primary(&block)
1920
Base.new(:primary).run(&block)
2021
end
2122

23+
def default_target=(target)
24+
@default_target = Base.new(target).target
25+
end
26+
2227
def replica_pool
2328
@replica_pool ||= ReplicaConnectionPool.new(config.replica_database_keys)
2429
end

lib/knockoff/active_record/base.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ class << self
44
alias_method :original_connection, :connection
55

66
def connection
7-
case Thread.current[:knockoff]
7+
target = Thread.current[:knockoff] || Knockoff.default_target
8+
case target
89
when :replica
910
# Attempts to use a random replica connection, but otherwise falls back to primary
1011
Knockoff.replica_pool.random_replica_connection.original_connection

lib/knockoff/base.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module Knockoff
22
class Base
3+
attr_reader :target
4+
35
def initialize(target, check_transaction: true)
46
@target = decide_with(target, check_transaction)
57
end

spec/knockoff_spec.rb

+24
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,30 @@ def on_replica?
6161
end
6262
end
6363

64+
context 'allows for setting the default target' do
65+
after(:each) { Knockoff.instance_variable_set("@default_target", nil) }
66+
67+
it 'sets the target' do
68+
expect(Knockoff.default_target).to be nil
69+
Knockoff.default_target = :replica
70+
expect(Knockoff.default_target).to eq :replica
71+
Knockoff.on_primary { expect(on_replica?).to be false }
72+
expect(Knockoff.default_target).to eq :replica
73+
Knockoff.default_target = :primary
74+
expect(Knockoff.default_target).to eq :primary
75+
end
76+
77+
it 'returns the correct connection' do
78+
expect(ActiveRecord::Base.connection).to eq ActiveRecord::Base.original_connection
79+
Knockoff.default_target = :replica
80+
expect(ActiveRecord::Base.connection).to eq Knockoff::KnockoffReplica0.connection
81+
Knockoff.on_primary { expect(ActiveRecord::Base.connection).to eq ActiveRecord::Base.original_connection }
82+
expect(ActiveRecord::Base.connection).to_not eq ActiveRecord::Base.original_connection
83+
Knockoff.default_target = :primary
84+
expect(ActiveRecord::Base.connection).to eq ActiveRecord::Base.original_connection
85+
end
86+
end
87+
6488
context 'in transaction' do
6589
it 'raises error in transaction if replica is attempted' do
6690
User.transaction do

0 commit comments

Comments
 (0)