fresh_connection 0.1.6 → 0.1.7
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/lib/fresh_connection/abstract_connection_manager.rb +42 -0
- data/lib/fresh_connection/active_record/abstract_adapter.rb +14 -3
- data/lib/fresh_connection/connection_manager.rb +24 -15
- data/lib/fresh_connection/slave_connection.rb +6 -11
- data/lib/fresh_connection/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6cf45789101eb5867723358916e51d9830479c7
|
4
|
+
data.tar.gz: 829c2c642c9357cbd4e40966601d4e9fa05ccedb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43f069ab92bc1383f3bd3c48503e3fd4df75cbda1622b6a2c81d11241787e78aeced42c7a492160090029a5212e1b61184989546bb3f5d8d4fa7a46dd35d5f0a
|
7
|
+
data.tar.gz: f06dacf9d04f362810a0febd8421cd78fbf94fc2ece3fddecd6cffb2845359394c51dca0a6fc4b1ddcd5b3d9654dc9c1e3f675edd16bcc58cd0ad0c2df5bcdbd
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module FreshConnection
|
2
|
+
class AbstractConnectionManager
|
3
|
+
EXCEPTION_MESSAGE_WHEN_SLAVE_SERVER_DOWN = [
|
4
|
+
"MySQL server has gone away",
|
5
|
+
"closed MySQL connection",
|
6
|
+
"Can't connect to local MySQL server"
|
7
|
+
].map{|msg| Regexp.escape(msg)}.join("|")
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@mutex = Mutex.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def slave_connection
|
14
|
+
end
|
15
|
+
|
16
|
+
def put_aside!
|
17
|
+
end
|
18
|
+
|
19
|
+
def recovery(failure_connection, exception)
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
def recoverable?
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def synchronize
|
30
|
+
@mutex.synchronize{ yield }
|
31
|
+
end
|
32
|
+
|
33
|
+
def current_thread_id
|
34
|
+
Thread.current.object_id
|
35
|
+
end
|
36
|
+
|
37
|
+
def slave_down_message?(message)
|
38
|
+
/#{EXCEPTION_MESSAGE_WHEN_SLAVE_SERVER_DOWN}/o =~ message
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -13,9 +13,20 @@ module ActiveRecord
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def change_connection
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
retry_count = 0
|
17
|
+
master_connection = @connection
|
18
|
+
begin
|
19
|
+
slave_connection = FreshConnection::SlaveConnection.slave_connection
|
20
|
+
@connection = slave_connection.raw_connection
|
21
|
+
yield
|
22
|
+
rescue ActiveRecord::StatementInvalid => exception
|
23
|
+
if FreshConnection::SlaveConnection.recovery(slave_connection, exception)
|
24
|
+
retry_count += 1
|
25
|
+
retry if retry_count < FreshConnection::SlaveConnection.retry_limit
|
26
|
+
end
|
27
|
+
|
28
|
+
raise
|
29
|
+
end
|
19
30
|
ensure
|
20
31
|
@connection = master_connection
|
21
32
|
end
|
@@ -1,27 +1,40 @@
|
|
1
|
-
|
2
|
-
class ConnectionManager
|
3
|
-
def initialize
|
4
|
-
@mutex = Mutex.new
|
5
|
-
end
|
1
|
+
require 'fresh_connection/abstract_connection_manager'
|
6
2
|
|
3
|
+
module FreshConnection
|
4
|
+
class ConnectionManager < AbstractConnectionManager
|
7
5
|
def slave_connection
|
8
|
-
|
9
|
-
|
10
|
-
@slave_connections[current_thread_id] ||= new_connection
|
6
|
+
synchronize do
|
7
|
+
slave_connections[current_thread_id] ||= new_connection
|
11
8
|
end
|
12
9
|
end
|
13
10
|
|
14
11
|
def put_aside!
|
15
|
-
|
16
|
-
|
17
|
-
if c = @slave_connections.delete(current_thread_id)
|
12
|
+
synchronize do
|
13
|
+
if c = slave_connections.delete(current_thread_id)
|
18
14
|
c.disconnect! rescue nil
|
19
15
|
end
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
19
|
+
def recovery(failure_connection, exception)
|
20
|
+
if recoverable? && slave_down_message?(exception.message)
|
21
|
+
put_aside!
|
22
|
+
true
|
23
|
+
else
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def recoverable?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
23
32
|
private
|
24
33
|
|
34
|
+
def slave_connections
|
35
|
+
@slave_connections ||= {}
|
36
|
+
end
|
37
|
+
|
25
38
|
def new_connection
|
26
39
|
ActiveRecord::Base.send("#{spec["adapter"]}_connection", spec)
|
27
40
|
end
|
@@ -34,9 +47,5 @@ module FreshConnection
|
|
34
47
|
ret = ActiveRecord::Base.configurations[Rails.env]
|
35
48
|
ret.merge(ret["slave"] || {})
|
36
49
|
end
|
37
|
-
|
38
|
-
def current_thread_id
|
39
|
-
Thread.current.object_id
|
40
|
-
end
|
41
50
|
end
|
42
51
|
end
|
@@ -2,21 +2,12 @@ module FreshConnection
|
|
2
2
|
class SlaveConnection
|
3
3
|
COUNT = :fresh_connection_access_count
|
4
4
|
TARGET = :fresh_connection_access_target
|
5
|
+
RETRY_LIMIT = 10
|
5
6
|
|
6
7
|
class << self
|
7
8
|
attr_writer :ignore_models, :ignore_configure_connection
|
8
9
|
|
9
|
-
|
10
|
-
slave_connection.raw_connection
|
11
|
-
end
|
12
|
-
|
13
|
-
def slave_connection
|
14
|
-
connection_manager.slave_connection
|
15
|
-
end
|
16
|
-
|
17
|
-
def put_aside!
|
18
|
-
connection_manager.put_aside!
|
19
|
-
end
|
10
|
+
delegate :slave_connection, :put_aside!, :recoverable?, :recovery, :to => :connection_manager
|
20
11
|
|
21
12
|
def manage_access(model_klass, go_slave, &block)
|
22
13
|
if ignore_model?(model_klass)
|
@@ -57,6 +48,10 @@ module FreshConnection
|
|
57
48
|
@connection_manager_class = manager
|
58
49
|
end
|
59
50
|
|
51
|
+
def retry_limit
|
52
|
+
RETRY_LIMIT
|
53
|
+
end
|
54
|
+
|
60
55
|
private
|
61
56
|
|
62
57
|
def force_master_access
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fresh_connection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tsukasa OISHI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- Rakefile
|
66
66
|
- fresh_connection.gemspec
|
67
67
|
- lib/fresh_connection.rb
|
68
|
+
- lib/fresh_connection/abstract_connection_manager.rb
|
68
69
|
- lib/fresh_connection/active_record/abstract_adapter.rb
|
69
70
|
- lib/fresh_connection/active_record/mysql2_adapter.rb
|
70
71
|
- lib/fresh_connection/active_record/relation.rb
|