distribute_reads 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/distribute_reads.gemspec +2 -1
- data/lib/distribute_reads.rb +16 -5
- data/lib/distribute_reads/appropriate_pool.rb +8 -1
- data/lib/distribute_reads/global_methods.rb +8 -2
- data/lib/distribute_reads/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: db257dfd9b8679aad4cc3d4ee162234ee7375fda
|
|
4
|
+
data.tar.gz: 87daf348a55b8b11e17aa6fcdb181f0233b59569
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 86bd0d6b2be128b6bc20b0b6ff0eb455b7eba40f33db2d12437326f13bc60c1400ed6d3f871c84a1dd9fe97ffc5122aa4b3a93291e9c1dde8d3e4dd3814a86cc
|
|
7
|
+
data.tar.gz: 937a288f831c21fa91546ad6ad89d4a84ea239edf6739a6936540a19cc3a0ec1d9fe19aeefea3e57ffce77d32c50bb536f9309b038c749d17fa9497976eae551
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
data/distribute_reads.gemspec
CHANGED
|
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
|
25
25
|
spec.add_development_dependency "bundler"
|
|
26
26
|
spec.add_development_dependency "rake"
|
|
27
27
|
spec.add_development_dependency "minitest"
|
|
28
|
-
spec.add_development_dependency "pg"
|
|
28
|
+
spec.add_development_dependency "pg", "< 1"
|
|
29
|
+
spec.add_development_dependency "mysql2"
|
|
29
30
|
spec.add_development_dependency "activejob"
|
|
30
31
|
end
|
data/lib/distribute_reads.rb
CHANGED
|
@@ -29,12 +29,13 @@ module DistributeReads
|
|
|
29
29
|
raise DistributeReads::Error, "Don't use outside distribute_reads" unless Thread.current[:distribute_reads]
|
|
30
30
|
|
|
31
31
|
connection ||= ActiveRecord::Base.connection
|
|
32
|
-
if %w(PostgreSQL PostGIS).include?(connection.adapter_name)
|
|
33
|
-
replica_pool = connection.instance_variable_get(:@slave_pool)
|
|
34
|
-
if replica_pool && replica_pool.connections.size > 1
|
|
35
|
-
warn "[distribute_reads] Multiple replicas available, lag only reported for one"
|
|
36
|
-
end
|
|
37
32
|
|
|
33
|
+
replica_pool = connection.instance_variable_get(:@slave_pool)
|
|
34
|
+
if replica_pool && replica_pool.connections.size > 1
|
|
35
|
+
warn "[distribute_reads] Multiple replicas available, lag only reported for one"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if %w(PostgreSQL PostGIS).include?(connection.adapter_name)
|
|
38
39
|
# cache the version number
|
|
39
40
|
@server_version_num ||= {}
|
|
40
41
|
cache_key = connection.pool.object_id
|
|
@@ -53,6 +54,16 @@ module DistributeReads
|
|
|
53
54
|
ELSE EXTRACT (EPOCH FROM NOW() - pg_last_xact_replay_timestamp())
|
|
54
55
|
END AS lag".squish
|
|
55
56
|
).first["lag"].to_f
|
|
57
|
+
elsif %w(MySQL Mysql2 Mysql2Spatial Mysql2Rgeo).include?(connection.adapter_name)
|
|
58
|
+
replica_value = Thread.current[:distribute_reads][:replica]
|
|
59
|
+
begin
|
|
60
|
+
# makara doesn't send SHOW queries to replica, so we must force it
|
|
61
|
+
Thread.current[:distribute_reads][:replica] = true
|
|
62
|
+
status = connection.exec_query("SHOW SLAVE STATUS").to_hash.first
|
|
63
|
+
status ? status["Seconds_Behind_Master"].to_f : 0.0
|
|
64
|
+
ensure
|
|
65
|
+
Thread.current[:distribute_reads][:replica] = replica_value
|
|
66
|
+
end
|
|
56
67
|
else
|
|
57
68
|
raise DistributeReads::Error, "Option not supported with this adapter"
|
|
58
69
|
end
|
|
@@ -2,7 +2,14 @@ module DistributeReads
|
|
|
2
2
|
module AppropriatePool
|
|
3
3
|
def _appropriate_pool(*args)
|
|
4
4
|
if Thread.current[:distribute_reads]
|
|
5
|
-
if Thread.current[:distribute_reads][:
|
|
5
|
+
if Thread.current[:distribute_reads][:replica]
|
|
6
|
+
if @slave_pool.completely_blacklisted?
|
|
7
|
+
raise DistributeReads::NoReplicasAvailable, "No replicas available" if Thread.current[:distribute_reads][:failover] == false
|
|
8
|
+
@master_pool
|
|
9
|
+
else
|
|
10
|
+
@slave_pool
|
|
11
|
+
end
|
|
12
|
+
elsif Thread.current[:distribute_reads][:primary] || needs_master?(*args) || (blacklisted = @slave_pool.completely_blacklisted?)
|
|
6
13
|
raise DistributeReads::NoReplicasAvailable, "No replicas available" if blacklisted && Thread.current[:distribute_reads][:failover] == false
|
|
7
14
|
stick_to_master(*args) if DistributeReads.by_default
|
|
8
15
|
@master_pool
|
|
@@ -3,14 +3,18 @@ module DistributeReads
|
|
|
3
3
|
def distribute_reads(**options)
|
|
4
4
|
raise ArgumentError, "Missing block" unless block_given?
|
|
5
5
|
|
|
6
|
-
unknown_keywords = options.keys - [:failover, :lag_failover, :lag_on, :max_lag, :primary]
|
|
6
|
+
unknown_keywords = options.keys - [:failover, :lag_failover, :lag_on, :max_lag, :primary, :replica]
|
|
7
7
|
raise ArgumentError, "Unknown keywords: #{unknown_keywords.join(", ")}" if unknown_keywords.any?
|
|
8
8
|
|
|
9
9
|
options = DistributeReads.default_options.merge(options)
|
|
10
10
|
|
|
11
11
|
previous_value = Thread.current[:distribute_reads]
|
|
12
12
|
begin
|
|
13
|
-
Thread.current[:distribute_reads] = {
|
|
13
|
+
Thread.current[:distribute_reads] = {
|
|
14
|
+
failover: options[:failover],
|
|
15
|
+
primary: options[:primary],
|
|
16
|
+
replica: options[:replica]
|
|
17
|
+
}
|
|
14
18
|
|
|
15
19
|
# TODO ensure same connection is used to test lag and execute queries
|
|
16
20
|
max_lag = options[:max_lag]
|
|
@@ -20,6 +24,8 @@ module DistributeReads
|
|
|
20
24
|
if options[:lag_failover]
|
|
21
25
|
# TODO possibly per connection
|
|
22
26
|
Thread.current[:distribute_reads][:primary] = true
|
|
27
|
+
Thread.current[:distribute_reads][:replica] = false
|
|
28
|
+
break
|
|
23
29
|
else
|
|
24
30
|
raise DistributeReads::TooMuchLag, "Replica lag over #{max_lag} seconds#{options[:lag_on] ? " on #{base_model.name} connection" : ""}"
|
|
25
31
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: distribute_reads
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrew Kane
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2018-03-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: makara
|
|
@@ -68,6 +68,20 @@ dependencies:
|
|
|
68
68
|
version: '0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: pg
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "<"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '1'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "<"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '1'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: mysql2
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
72
86
|
requirements:
|
|
73
87
|
- - ">="
|