beetle 3.4.1 → 3.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/RELEASE_NOTES.rdoc +5 -1
- data/beetle.gemspec +1 -1
- data/lib/beetle/message.rb +14 -12
- data/lib/beetle/version.rb +1 -1
- data/script/analyze-expiries +25 -0
- data/script/analyze-redis-keys +15 -0
- data/script/expire-keys +14 -0
- data/test/beetle/message/settings_test.rb +4 -4
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08db25367467939ff6a625b0caf2b940832b398c7988189ac2a0e91d5244a78b'
|
4
|
+
data.tar.gz: d9ffc4a722b0d86db98e81e0f9080b76e2fbd01537cbb4a6839b00665e778f19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7f986880a871a59a74ee9e3fc63b9b384097713eedc9f106c7b799cd6b8762714d05d181665ac5aadea0675fd10f30acfbaec8fcdf921a31721c609220b95ad
|
7
|
+
data.tar.gz: 3beb91290f71cf8191f9abe0a116732e0e880a3e0e57d2c774c2c417bde4fb697b7980e2d2f6af0bdfcd601b124c7c4286a796fada014771be3bb8b049130d12
|
data/RELEASE_NOTES.rdoc
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
= Release Notes
|
2
2
|
|
3
|
+
== Version 3.4.2
|
4
|
+
* Updated amq-protocol gem to version 2.3.2.
|
5
|
+
* Fixed a rare race condition on message handler timeouts.
|
6
|
+
|
3
7
|
== Version 3.4.1
|
4
|
-
*
|
8
|
+
* Updated amq-protocol gem to version 2.3.1.
|
5
9
|
|
6
10
|
== Version 3.4.0
|
7
11
|
* Require redis gem version 4.2.1. This version changes the exists to check for the
|
data/beetle.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_runtime_dependency "bunny", "~> 0.7.12"
|
27
27
|
s.add_runtime_dependency "redis", ">= 4.2.1"
|
28
28
|
s.add_runtime_dependency "hiredis", ">= 0.4.5"
|
29
|
-
s.add_runtime_dependency "amq-protocol", "= 2.3.
|
29
|
+
s.add_runtime_dependency "amq-protocol", "= 2.3.2"
|
30
30
|
s.add_runtime_dependency "amqp", "= 1.8.0"
|
31
31
|
s.add_runtime_dependency "activesupport", ">= 2.3.4"
|
32
32
|
|
data/lib/beetle/message.rb
CHANGED
@@ -18,6 +18,8 @@ module Beetle
|
|
18
18
|
# forcefully abort a running handler after this many seconds.
|
19
19
|
# can be overriden when registering a handler.
|
20
20
|
DEFAULT_HANDLER_TIMEOUT = 600.seconds
|
21
|
+
# How much extra time on top of the handler timeout we add before considering a handler timed out
|
22
|
+
TIMEOUT_GRACE_PERIOD = 10.seconds
|
21
23
|
# how many times we should try to run a handler before giving up
|
22
24
|
DEFAULT_HANDLER_EXECUTION_ATTEMPTS = 1
|
23
25
|
# how many seconds we should wait before retrying handler execution
|
@@ -167,8 +169,8 @@ module Beetle
|
|
167
169
|
end
|
168
170
|
|
169
171
|
# handler timed out?
|
170
|
-
def timed_out?
|
171
|
-
(t
|
172
|
+
def timed_out?(t = nil)
|
173
|
+
(t ||= @store.get(msg_id, :timeout)) && (t.to_i + TIMEOUT_GRACE_PERIOD) < now
|
172
174
|
end
|
173
175
|
|
174
176
|
# reset handler timeout in the deduplication store
|
@@ -187,8 +189,8 @@ module Beetle
|
|
187
189
|
end
|
188
190
|
|
189
191
|
# whether we should wait before running the handler
|
190
|
-
def delayed?
|
191
|
-
(t
|
192
|
+
def delayed?(t = nil)
|
193
|
+
(t ||= @store.get(msg_id, :delay)) && t.to_i > now
|
192
194
|
end
|
193
195
|
|
194
196
|
# store delay value in the deduplication store
|
@@ -207,8 +209,8 @@ module Beetle
|
|
207
209
|
end
|
208
210
|
|
209
211
|
# whether we have already tried running the handler as often as specified when the handler was registered
|
210
|
-
def attempts_limit_reached?
|
211
|
-
(
|
212
|
+
def attempts_limit_reached?(attempts = nil)
|
213
|
+
(attempts ||= @store.get(msg_id, :attempts)) && attempts.to_i >= attempts_limit
|
212
214
|
end
|
213
215
|
|
214
216
|
# increment number of exception occurences in the deduplication store
|
@@ -217,8 +219,8 @@ module Beetle
|
|
217
219
|
end
|
218
220
|
|
219
221
|
# whether the number of exceptions has exceeded the limit set when the handler was registered
|
220
|
-
def exceptions_limit_reached?
|
221
|
-
@store.get(msg_id, :exceptions).to_i > exceptions_limit
|
222
|
+
def exceptions_limit_reached?(exceptions = nil)
|
223
|
+
(exceptions ||= @store.get(msg_id, :exceptions)) && exceptions.to_i > exceptions_limit
|
222
224
|
end
|
223
225
|
|
224
226
|
def exception_accepted?
|
@@ -306,17 +308,17 @@ module Beetle
|
|
306
308
|
if status == "completed"
|
307
309
|
ack!
|
308
310
|
RC::OK
|
309
|
-
elsif delay && delay
|
311
|
+
elsif delay && delayed?(delay)
|
310
312
|
logger.warn "Beetle: ignored delayed message (#{msg_id})!"
|
311
313
|
RC::Delayed
|
312
|
-
elsif !(timeout && timeout
|
314
|
+
elsif !(timeout && timed_out?(timeout))
|
313
315
|
RC::HandlerNotYetTimedOut
|
314
|
-
elsif attempts
|
316
|
+
elsif attempts && attempts_limit_reached?(attempts)
|
315
317
|
completed!
|
316
318
|
ack!
|
317
319
|
logger.warn "Beetle: reached the handler execution attempts limit: #{attempts_limit} on #{msg_id}"
|
318
320
|
RC::AttemptsLimitReached
|
319
|
-
elsif exceptions
|
321
|
+
elsif exceptions && exceptions_limit_reached?(exceptions)
|
320
322
|
completed!
|
321
323
|
ack!
|
322
324
|
logger.warn "Beetle: reached the handler exceptions limit: #{exceptions_limit} on #{msg_id}"
|
data/lib/beetle/version.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
counts = Hash.new(0)
|
6
|
+
expiries = Hash.new{|h,k| h[k] = Hash.new(0)}
|
7
|
+
t = Time.now.to_i
|
8
|
+
|
9
|
+
File.open(ARGV[0]).each_line do |l|
|
10
|
+
parts = l.split(':')
|
11
|
+
queue = parts[1]
|
12
|
+
counts[queue] += 1
|
13
|
+
expiry = parts[4].to_i
|
14
|
+
expires_in = ((expiry - t)/(3600.0)).ceil
|
15
|
+
expiries[queue][expires_in] += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
counts.to_a.sort_by{|_,v| -v}.each do |q,v|
|
19
|
+
puts "------------------------------------------------------------------"
|
20
|
+
puts "#{q}: #{v}"
|
21
|
+
puts "------------------------------------------------------------------"
|
22
|
+
expiries[q].to_a.sort_by{|k,_| -k}.each do |expiry, count|
|
23
|
+
printf "%3dh: %6d\n", expiry, count
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
queue_counts = Hash.new { |h,k| h[k] = 0 }
|
3
|
+
File.open(ARGV[0]).each_line do |l|
|
4
|
+
next if l == "lastgc" || l == "clients-last-seen"
|
5
|
+
a = l.split(':')
|
6
|
+
if a[0] == "msgid"
|
7
|
+
queue_counts[a[1]] += 1
|
8
|
+
else
|
9
|
+
queue_counts["none"] += 1
|
10
|
+
end
|
11
|
+
end
|
12
|
+
sorted_queues = queue_counts.to_a.sort_by{|a| -a[1]}
|
13
|
+
sorted_queues.each do |q,c|
|
14
|
+
puts "#{c}:#{q}"
|
15
|
+
end
|
data/script/expire-keys
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "redis"
|
3
|
+
|
4
|
+
redis = Redis.new(:host => "beetle-1.redis.ams2.xing.com", :port => 6379, :db => 0)
|
5
|
+
|
6
|
+
File.open(ARGV[0]).each_line.each_slice(10) do |s|
|
7
|
+
redis.pipelined do
|
8
|
+
s.each do |l|
|
9
|
+
l.chomp!
|
10
|
+
next if l =~ /^beetle:.*$/
|
11
|
+
redis.expire(l, 600)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -75,9 +75,9 @@ module Beetle
|
|
75
75
|
message.expects(:now).returns(1)
|
76
76
|
message.set_timeout!
|
77
77
|
assert_equal "2", @store.get(message.msg_id, :timeout)
|
78
|
-
message.expects(:now).returns(2)
|
78
|
+
message.expects(:now).returns(2 + Message::TIMEOUT_GRACE_PERIOD)
|
79
79
|
assert !message.timed_out?
|
80
|
-
message.expects(:now).returns(3)
|
80
|
+
message.expects(:now).returns(3 + Message::TIMEOUT_GRACE_PERIOD)
|
81
81
|
assert message.timed_out?
|
82
82
|
end
|
83
83
|
|
@@ -86,9 +86,9 @@ module Beetle
|
|
86
86
|
message.expects(:now).returns(0)
|
87
87
|
message.set_timeout!
|
88
88
|
assert_equal "#{Message::DEFAULT_HANDLER_TIMEOUT}", @store.get(message.msg_id, :timeout)
|
89
|
-
message.expects(:now).returns(message.timeout)
|
89
|
+
message.expects(:now).returns(message.timeout + Message::TIMEOUT_GRACE_PERIOD)
|
90
90
|
assert !message.timed_out?
|
91
|
-
message.expects(:now).returns(Message::
|
91
|
+
message.expects(:now).returns(message.timeout + Message::TIMEOUT_GRACE_PERIOD + 1)
|
92
92
|
assert message.timed_out?
|
93
93
|
end
|
94
94
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beetle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.4.
|
4
|
+
version: 3.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Kaes
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2020-
|
15
|
+
date: 2020-12-01 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: bunny
|
@@ -62,14 +62,14 @@ dependencies:
|
|
62
62
|
requirements:
|
63
63
|
- - '='
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version: 2.3.
|
65
|
+
version: 2.3.2
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
68
|
version_requirements: !ruby/object:Gem::Requirement
|
69
69
|
requirements:
|
70
70
|
- - '='
|
71
71
|
- !ruby/object:Gem::Version
|
72
|
-
version: 2.3.
|
72
|
+
version: 2.3.2
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: amqp
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -337,7 +337,10 @@ files:
|
|
337
337
|
- lib/beetle/redis_ext.rb
|
338
338
|
- lib/beetle/subscriber.rb
|
339
339
|
- lib/beetle/version.rb
|
340
|
+
- script/analyze-expiries
|
341
|
+
- script/analyze-redis-keys
|
340
342
|
- script/console
|
343
|
+
- script/expire-keys
|
341
344
|
- script/start_rabbit
|
342
345
|
- test/beetle/amqp_gem_behavior_test.rb
|
343
346
|
- test/beetle/base_test.rb
|