rails_failover 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -1
- data/lib/rails_failover/active_record.rb +9 -1
- data/lib/rails_failover/active_record/middleware.rb +21 -3
- data/lib/rails_failover/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fc58e5f3f5cbc45985b03f862b138aea0ef7723a2a8bba5625f4dea0efae6ee
|
4
|
+
data.tar.gz: c1703a05fd75b726bb3b30d06d87b038651e5a6a178a397eb6f6ced1c7b91e18
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bf3eb493c5ae85af24d7ada304b70af918b4feb34b7b9ca6ee498559b228add84aa93bff0e56d4114c11459bf3ff0ca822c1528f06b94f24a105a1a29b3b8bd
|
7
|
+
data.tar.gz: 118761f0ae8c211e171c9bde1d2dbddb2967c5f5b7ed6da535e1ef318761f27701f64dac92579cad983b64307c4ad21e15bb1b600d07e45ae56963047252fe38
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rails_failover (0.
|
4
|
+
rails_failover (0.4.0)
|
5
5
|
activerecord (~> 6.0)
|
6
6
|
listen (~> 3.2)
|
7
7
|
railties (~> 6.0)
|
@@ -119,6 +119,7 @@ DEPENDENCIES
|
|
119
119
|
activerecord (~> 6.0)
|
120
120
|
byebug
|
121
121
|
pg (~> 1.2)
|
122
|
+
rack
|
122
123
|
rails_failover!
|
123
124
|
rake (~> 12.0)
|
124
125
|
redis (~> 4.1)
|
@@ -1,7 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_record'
|
4
|
-
|
4
|
+
|
5
|
+
if defined?(::Rails)
|
6
|
+
require_relative 'active_record/railtie'
|
7
|
+
end
|
8
|
+
|
5
9
|
require_relative 'active_record/middleware'
|
6
10
|
require_relative 'active_record/handler'
|
7
11
|
|
@@ -37,5 +41,9 @@ module RailsFailover
|
|
37
41
|
handler.establish_connection(replica_config)
|
38
42
|
end
|
39
43
|
end
|
44
|
+
|
45
|
+
def self.register_force_reading_role_callback(&block)
|
46
|
+
Middleware.force_reading_role_callback = block
|
47
|
+
end
|
40
48
|
end
|
41
49
|
end
|
@@ -3,6 +3,24 @@
|
|
3
3
|
module RailsFailover
|
4
4
|
module ActiveRecord
|
5
5
|
class Middleware
|
6
|
+
class << self
|
7
|
+
attr_accessor :force_reading_role_callback
|
8
|
+
|
9
|
+
def adapter_error
|
10
|
+
@adapter_error ||= begin
|
11
|
+
if defined?(::PG)
|
12
|
+
::PG::Error
|
13
|
+
elsif defined?(::SQLite3)
|
14
|
+
::SQLite3::Exception
|
15
|
+
elsif defined?(::Mysql2)
|
16
|
+
::Mysql2::Error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
ROLE_HEADER = "rails_failover.role"
|
23
|
+
|
6
24
|
def initialize(app)
|
7
25
|
@app = app
|
8
26
|
end
|
@@ -11,18 +29,18 @@ module RailsFailover
|
|
11
29
|
writing_role = ::ActiveRecord::Base.writing_role
|
12
30
|
|
13
31
|
role =
|
14
|
-
if primary_down = Handler.instance.primary_down?(writing_role)
|
32
|
+
if primary_down = Handler.instance.primary_down?(writing_role) || self.class.force_reading_role_callback&.call(env)
|
15
33
|
::ActiveRecord::Base.reading_role
|
16
34
|
else
|
17
35
|
::ActiveRecord::Base.writing_role
|
18
36
|
end
|
19
37
|
|
20
38
|
::ActiveRecord::Base.connected_to(role: role) do
|
21
|
-
env[
|
39
|
+
env[ROLE_HEADER] = role
|
22
40
|
@app.call(env)
|
23
41
|
end
|
24
42
|
rescue Exception => e
|
25
|
-
if (resolve_cause(e).is_a?(
|
43
|
+
if (resolve_cause(e).is_a?(self.class.adapter_error))
|
26
44
|
Handler.instance.verify_primary(writing_role)
|
27
45
|
raise
|
28
46
|
end
|