right_support 1.0.9 → 1.0.11
Sign up to get free protection for your applications and to get access to all the features.
@@ -110,11 +110,10 @@ module RightSupport::Net::Balancing
|
|
110
110
|
# Selection of the next endpoint using RoundRobin
|
111
111
|
@counter += 1 unless endpoints.size < @last_size
|
112
112
|
@counter = 0 if @counter == endpoints.size
|
113
|
-
i = @counter % endpoints.size
|
114
113
|
@last_size = endpoints.size
|
115
114
|
|
116
115
|
# Returns false or true, depending on whether EP is yellow or not
|
117
|
-
[ endpoints[
|
116
|
+
[ endpoints[@counter][0], endpoints[@counter][1][:n_level] != 0 ]
|
118
117
|
end
|
119
118
|
|
120
119
|
def good(endpoint, t0, t1)
|
@@ -126,7 +125,20 @@ module RightSupport::Net::Balancing
|
|
126
125
|
end
|
127
126
|
|
128
127
|
def health_check(endpoint)
|
129
|
-
|
128
|
+
t0 = Time.now
|
129
|
+
result = @health_check.call(endpoint)
|
130
|
+
t1 = Time.now
|
131
|
+
if result
|
132
|
+
@stack.decrease_state(endpoint, t0, t1)
|
133
|
+
return true
|
134
|
+
else
|
135
|
+
@stack.increase_state(endpoint, t0, t1)
|
136
|
+
return false
|
137
|
+
end
|
138
|
+
rescue Exception => e
|
139
|
+
t1 = Time.now
|
140
|
+
@stack.increase_state(endpoint, t0, t1)
|
141
|
+
raise e
|
130
142
|
end
|
131
143
|
|
132
144
|
# Proxy to EndpointStack
|
@@ -137,7 +137,6 @@ module RightSupport::Net
|
|
137
137
|
n = 0
|
138
138
|
|
139
139
|
retry_opt = @options[:retry] || DEFAULT_RETRY_PROC
|
140
|
-
health_check = @options[:health_check]
|
141
140
|
|
142
141
|
loop do
|
143
142
|
if complete
|
@@ -145,7 +144,7 @@ module RightSupport::Net
|
|
145
144
|
else
|
146
145
|
max_n = retry_opt
|
147
146
|
max_n = max_n.call(@endpoints, n) if max_n.respond_to?(:call)
|
148
|
-
break if (max_n.is_a?(Integer) && n >= max_n) ||
|
147
|
+
break if (max_n.is_a?(Integer) && n >= max_n) || [nil, false].include?(max_n)
|
149
148
|
end
|
150
149
|
|
151
150
|
endpoint, need_health_check = @policy.next
|
@@ -154,12 +153,15 @@ module RightSupport::Net
|
|
154
153
|
n += 1
|
155
154
|
t0 = Time.now
|
156
155
|
|
157
|
-
#
|
156
|
+
# Perform health check if necessary. Note that we guard this with a rescue, because the
|
157
|
+
# health check may raise an exception and we want to log the exception info if this happens.
|
158
158
|
if need_health_check
|
159
159
|
begin
|
160
|
-
@policy.health_check(endpoint)
|
160
|
+
unless @policy.health_check(endpoint)
|
161
|
+
log_error("RequestBalancer: health check failed to #{endpoint} because of non-true return value")
|
162
|
+
next
|
163
|
+
end
|
161
164
|
rescue Exception => e
|
162
|
-
@policy.bad(endpoint, t0, Time.now)
|
163
165
|
log_error("RequestBalancer: health check failed to #{endpoint} because of #{e.class.name}: #{e.message}")
|
164
166
|
next
|
165
167
|
end
|
@@ -173,7 +175,7 @@ module RightSupport::Net
|
|
173
175
|
complete = true
|
174
176
|
break
|
175
177
|
rescue Exception => e
|
176
|
-
if to_raise = handle_exception(endpoint, e)
|
178
|
+
if to_raise = handle_exception(endpoint, e, t0)
|
177
179
|
raise(to_raise)
|
178
180
|
else
|
179
181
|
@policy.bad(endpoint, t0, Time.now)
|
@@ -218,7 +220,7 @@ module RightSupport::Net
|
|
218
220
|
|
219
221
|
# Decide what to do with an exception. The decision is influenced by the :fatal
|
220
222
|
# option passed to the constructor.
|
221
|
-
def handle_exception(endpoint, e)
|
223
|
+
def handle_exception(endpoint, e, t0)
|
222
224
|
fatal = @options[:fatal] || DEFAULT_FATAL_PROC
|
223
225
|
|
224
226
|
#The option may be a proc or lambda; call it to get input
|
@@ -232,7 +234,8 @@ module RightSupport::Net
|
|
232
234
|
#whether the exception we're handling is an instance of any mentioned exception
|
233
235
|
#class
|
234
236
|
fatal = fatal.any?{ |c| e.is_a?(c) } if fatal.respond_to?(:any?)
|
235
|
-
|
237
|
+
duration = sprintf('%.4f', Time.now - t0)
|
238
|
+
msg = "RequestBalancer: rescued #{fatal ? 'fatal' : 'retryable'} #{e.class.name} during request to #{endpoint}: #{e.message} after #{duration} seconds"
|
236
239
|
log_error msg
|
237
240
|
@options[:on_exception].call(fatal, e, endpoint) if @options[:on_exception]
|
238
241
|
|
data/right_support.gemspec
CHANGED
@@ -7,8 +7,8 @@ spec = Gem::Specification.new do |s|
|
|
7
7
|
s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
|
8
8
|
|
9
9
|
s.name = 'right_support'
|
10
|
-
s.version = '1.0.
|
11
|
-
s.date = '2011-10-
|
10
|
+
s.version = '1.0.11'
|
11
|
+
s.date = '2011-10-21'
|
12
12
|
|
13
13
|
s.authors = ['Tony Spataro']
|
14
14
|
s.email = 'tony@rightscale.com'
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 11
|
10
|
+
version: 1.0.11
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tony Spataro
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-10-
|
18
|
+
date: 2011-10-21 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|