ebisu_connection 0.0.3 → 0.0.4

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
  SHA1:
3
- metadata.gz: 4d18980741ce133172b0fb8ab9bbaa1e171a1190
4
- data.tar.gz: 4e44601e1a9137721c63b69be36604155b8b7e0e
3
+ metadata.gz: acec29bfafab4c90b03cf8594363584b07918948
4
+ data.tar.gz: c4659e218081594a681fbf92e8443018560239b1
5
5
  SHA512:
6
- metadata.gz: 61ce15decbf4956cb90a81ac924bc62e89758bf2c290f1a73c0684350d7cd90192d3086ea268e1a0ca8951a73b64eff15e36d0c10b72002682089c507880b1e3
7
- data.tar.gz: 88d8e8e397020242d01dd69c7d386e1a0f09a1a6295f51cf2d3dbb48faeae9f64fc2af19a5d693f64421724e5956f8e0e07d1c7467502156ac83b369a877e541
6
+ metadata.gz: 5226bfef7a1027d4ff43dd59d61d9b53dc569cc96e4d12b96cd49bf857adb5111600a73cee38e94d4bbceca1e8e7e71722a8a6c97de5771b7a304da6091c8929
7
+ data.tar.gz: e1a8426b0365a3132464b062e541d0835e887025b74a3a82536301011113dfa74916d2b2d8f4f0969b95031ffb1050c05163f65a89731a0fe0499b8d2c37be0e
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency 'activerecord', '>= 3.2.0'
22
- spec.add_dependency 'fresh_connection', '>= 0.1.6'
22
+ spec.add_dependency 'fresh_connection', '>= 0.1.7'
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.3"
25
25
  spec.add_development_dependency "rake"
@@ -1,7 +1,8 @@
1
1
  require 'yaml'
2
+ require 'fresh_connection/abstract_connection_manager'
2
3
 
3
4
  module EbisuConnection
4
- class ConnectionManager
5
+ class ConnectionManager < FreshConnection::AbstractConnectionManager
5
6
  class << self
6
7
  delegate :slave_file, :slave_file=, :check_interval, :check_interval=,
7
8
  :slave_type, :slave_type=, :to => EbisuConnection::ConfFile
@@ -13,7 +14,7 @@ module EbisuConnection
13
14
  :to => EbisuConnection::ConfFile
14
15
 
15
16
  def initialize
16
- @mutex = Mutex.new
17
+ super
17
18
  @slaves = {}
18
19
  end
19
20
 
@@ -30,8 +31,21 @@ module EbisuConnection
30
31
  end
31
32
  end
32
33
 
34
+ def recovery(failure_connection, exception)
35
+ if recoverable? && slave_down_message?(exception.message)
36
+ slaves.remove_connection(failure_connection)
37
+ true
38
+ else
39
+ false
40
+ end
41
+ end
42
+
43
+ def recoverable?
44
+ true
45
+ end
46
+
33
47
  def clear_all_connection!
34
- @mutex.synchronize do
48
+ synchronize do
35
49
  @slaves.values.each do |s|
36
50
  s.all_disconnect!
37
51
  end
@@ -44,7 +58,7 @@ module EbisuConnection
44
58
  private
45
59
 
46
60
  def check_own_connection
47
- @mutex.synchronize do
61
+ synchronize do
48
62
  s = @slaves[current_thread_id]
49
63
 
50
64
  if s && s.reserved_release?
@@ -58,7 +72,7 @@ module EbisuConnection
58
72
  end
59
73
 
60
74
  def reserve_release_all_connection
61
- @mutex.synchronize do
75
+ synchronize do
62
76
  @slaves.values.each do |s|
63
77
  s.reserve_release_connection!
64
78
  end
@@ -67,7 +81,7 @@ module EbisuConnection
67
81
  end
68
82
 
69
83
  def slaves
70
- @mutex.synchronize do
84
+ synchronize do
71
85
  @slaves[current_thread_id] ||= get_slaves
72
86
  end
73
87
  end
@@ -75,9 +89,5 @@ module EbisuConnection
75
89
  def get_slaves
76
90
  EbisuConnection::Slaves.new(slaves_conf, spec)
77
91
  end
78
-
79
- def current_thread_id
80
- Thread.current.object_id
81
- end
82
92
  end
83
93
  end
@@ -1,5 +1,7 @@
1
1
  module EbisuConnection
2
2
  class Slaves
3
+ class AllSlavesHasGoneError < StandardError; end
4
+
3
5
  class Slave
4
6
  attr_reader :hostname, :weight
5
7
 
@@ -45,25 +47,27 @@ module EbisuConnection
45
47
  end
46
48
 
47
49
  def initialize(slaves_conf, spec)
48
- weight_list = []
49
50
  @slaves = slaves_conf.map do |conf|
50
- s = Slave.new(conf, spec)
51
- weight_list << s.weight
52
- s
51
+ Slave.new(conf, spec)
53
52
  end
54
53
 
55
- @roulette = []
56
- gcd = get_gcd(weight_list)
57
- weight_list.each_with_index do |w, index|
58
- weight = w / gcd
59
- @roulette.concat([index] * weight)
60
- end
54
+ recalc_roulette
61
55
  end
62
56
 
63
57
  def sample
58
+ raise AllSlavesHasGoneError if @slaves.blang?
64
59
  @slaves[@roulette.sample]
65
60
  end
66
61
 
62
+ def remove_connection(connection)
63
+ return unless s = @slaves.detect{|s| s.connection == connection}
64
+ s.disconnect! rescue nil
65
+ @slaves.delete(s)
66
+ raise AllSlavesHasGoneError if @slaves.blank?
67
+ recalc_roulette
68
+ nil
69
+ end
70
+
67
71
  def all_disconnect!
68
72
  @reserve_release = nil
69
73
  @slaves.each {|s| s.disconnect!}
@@ -79,6 +83,17 @@ module EbisuConnection
79
83
 
80
84
  private
81
85
 
86
+ def recalc_roulette
87
+ weight_list = @slaves.map {|s| s.weight }
88
+
89
+ @roulette = []
90
+ gcd = get_gcd(weight_list)
91
+ weight_list.each_with_index do |w, index|
92
+ weight = w / gcd
93
+ @roulette.concat([index] * weight)
94
+ end
95
+ end
96
+
82
97
  def get_gcd(list)
83
98
  list = list.sort.uniq
84
99
  n = list.shift
@@ -1,3 +1,3 @@
1
1
  module EbisuConnection
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ebisu_connection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - tsukasaoishi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-13 00:00:00.000000000 Z
11
+ date: 2013-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.6
33
+ version: 0.1.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.1.6
40
+ version: 0.1.7
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement