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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 307117d6a7083a17a2bf2799737f6f9be3afa77a58bace4f867bedf38fa05a5c
4
- data.tar.gz: 9d9d54a7a46785f259ba3f19aad402534de7b5305bd57993cb9c92fd14efad3b
3
+ metadata.gz: 7fc58e5f3f5cbc45985b03f862b138aea0ef7723a2a8bba5625f4dea0efae6ee
4
+ data.tar.gz: c1703a05fd75b726bb3b30d06d87b038651e5a6a178a397eb6f6ced1c7b91e18
5
5
  SHA512:
6
- metadata.gz: 7c45a722a9d8bbe1d0ea1410630252c5485496a49b6affe5461615779102d25bfafbf0d990bce920d8e52f164ebe1b92e94a1ccd1787d526b98cba54fc039d45
7
- data.tar.gz: 3dcd9668ef0266b91c35cb3764533fab3624025a3d4dd6db86ce1adafb8168c9d72dde14bbd57fbcb73f7f0049941e6b077eaba519b70b3fa1b03eb92d730b64
6
+ metadata.gz: 9bf3eb493c5ae85af24d7ada304b70af918b4feb34b7b9ca6ee498559b228add84aa93bff0e56d4114c11459bf3ff0ca822c1528f06b94f24a105a1a29b3b8bd
7
+ data.tar.gz: 118761f0ae8c211e171c9bde1d2dbddb2967c5f5b7ed6da535e1ef318761f27701f64dac92579cad983b64307c4ad21e15bb1b600d07e45ae56963047252fe38
data/Gemfile CHANGED
@@ -16,4 +16,5 @@ group :development, :test do
16
16
  gem 'redis', '~> 4.1'
17
17
  gem 'pg', '~> 1.2'
18
18
  gem 'activerecord', '~> 6.0'
19
+ gem 'rack'
19
20
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_failover (0.3.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
- require_relative 'active_record/railtie'
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["rails_failover.role"] = role
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?(::PG::Error))
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsFailover
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_failover
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alan Tan