beetle 0.3.0.rc.2 → 0.3.0.rc.3
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.
- data/README.rdoc +1 -1
- data/RELEASE_NOTES.rdoc +5 -0
- data/beetle.gemspec +3 -2
- data/lib/beetle.rb +15 -8
- data/lib/beetle/redis_configuration_server.rb +4 -3
- data/test/beetle/deduplication_store_test.rb +1 -1
- data/test/beetle/redis_ext_test.rb +3 -5
- metadata +43 -30
- data/examples/test_publisher.rb +0 -32
data/README.rdoc
CHANGED
|
@@ -58,7 +58,7 @@ windows and execute the following commands:
|
|
|
58
58
|
|
|
59
59
|
To set up a redundant messaging system you will need
|
|
60
60
|
* at least 2 AMQP servers (we use {RabbitMQ}[http://www.rabbitmq.com/])
|
|
61
|
-
* at least one {Redis}[http://github.com/antirez/redis] server (better are two in a master/slave setup)
|
|
61
|
+
* at least one {Redis}[http://github.com/antirez/redis] server (better are two in a master/slave setup, see REDIS_AUTO_FAILOVER.rdoc)
|
|
62
62
|
|
|
63
63
|
== Gem Dependencies
|
|
64
64
|
|
data/RELEASE_NOTES.rdoc
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
= Release Notes
|
|
2
2
|
|
|
3
|
+
== Version 0.3.0.rc.3
|
|
4
|
+
|
|
5
|
+
* use hiredis as the redis backend, which overcomes lack of proper time-outs in the "generic" redis-rb
|
|
6
|
+
gem for Ruby 1.9
|
|
7
|
+
|
|
3
8
|
== Version 0.2.9.8
|
|
4
9
|
|
|
5
10
|
* since version 2.0, RabbitMQ supports Basic.reject(:requeue => true). we use it now too,
|
data/beetle.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.name = "beetle"
|
|
3
|
-
s.version = "0.3.0.rc.
|
|
3
|
+
s.version = "0.3.0.rc.3"
|
|
4
4
|
s.required_rubygems_version = ">= 1.3.7"
|
|
5
5
|
s.authors = ["Stefan Kaes", "Pascal Friederich", "Ali Jelveh", "Sebastian Roebke"]
|
|
6
6
|
s.date = Time.now.strftime('%Y-%m-%d')
|
|
@@ -30,7 +30,8 @@ Gem::Specification.new do |s|
|
|
|
30
30
|
s.specification_version = 3
|
|
31
31
|
s.add_runtime_dependency("uuid4r", [">= 0.1.2"])
|
|
32
32
|
s.add_runtime_dependency("bunny", ["~> 0.7.1"])
|
|
33
|
-
s.add_runtime_dependency("redis", ["= 2.0
|
|
33
|
+
s.add_runtime_dependency("redis", ["= 2.2.0"])
|
|
34
|
+
s.add_runtime_dependency("hiredis", ["= 0.3.2"])
|
|
34
35
|
s.add_runtime_dependency("amqp", ["~> 0.6.7"])
|
|
35
36
|
s.add_runtime_dependency("activesupport", [">= 2.3.4"])
|
|
36
37
|
s.add_runtime_dependency("daemons", [">= 1.0.10"])
|
data/lib/beetle.rb
CHANGED
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
$:.unshift(File.expand_path('..', __FILE__))
|
|
2
2
|
require 'bunny'
|
|
3
3
|
require 'uuid4r'
|
|
4
|
+
require 'redis/connection/hiredis' # require *before* redis as specified in the redis-rb gem docs
|
|
5
|
+
require 'redis'
|
|
4
6
|
require 'active_support'
|
|
5
7
|
require 'active_support/core_ext'
|
|
6
|
-
require 'redis'
|
|
7
8
|
require 'set'
|
|
8
9
|
|
|
9
10
|
module Beetle
|
|
11
|
+
Timer = if RUBY_VERSION < "1.9"
|
|
12
|
+
begin
|
|
13
|
+
require 'system_timer'
|
|
14
|
+
SystemTimer
|
|
15
|
+
rescue Exception => e
|
|
16
|
+
warn "WARNING: It's highly recommended to install the SystemTimer gem: `gem install SystemTimer -v '=1.2.1'` See: http://ph7spot.com/musings/system-timer" if RUBY_VERSION < "1.9"
|
|
17
|
+
require 'timeout'
|
|
18
|
+
Timeout
|
|
19
|
+
end
|
|
20
|
+
else
|
|
21
|
+
require 'timeout'
|
|
22
|
+
Timeout
|
|
23
|
+
end
|
|
10
24
|
|
|
11
25
|
# abstract superclass for Beetle specific exceptions
|
|
12
26
|
class Error < StandardError; end
|
|
@@ -56,11 +70,4 @@ module Beetle
|
|
|
56
70
|
def self.reraise_expectation_errors! #:nodoc:
|
|
57
71
|
end
|
|
58
72
|
end
|
|
59
|
-
|
|
60
|
-
Timer = begin
|
|
61
|
-
RUBY_VERSION < "1.9" ? SystemTimer : Timeout
|
|
62
|
-
rescue NameError
|
|
63
|
-
warn "WARNING: It's highly recommended to install the SystemTimer gem: `gem install SystemTimer -v '=1.2.1'` See: http://ph7spot.com/musings/system-timer" if RUBY_VERSION < "1.9"
|
|
64
|
-
Timeout
|
|
65
|
-
end
|
|
66
73
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Beetle
|
|
2
2
|
# A RedisConfigurationServer is the supervisor part of beetle's
|
|
3
|
-
# redis failover solution
|
|
3
|
+
# redis failover solution.
|
|
4
4
|
#
|
|
5
|
-
#
|
|
5
|
+
# A single instance of RedisConfigurationServer works as a supervisor for
|
|
6
6
|
# several RedisConfigurationClient instances. It is responsible for watching
|
|
7
7
|
# the redis master and electing and publishing a new master in case of failure.
|
|
8
8
|
#
|
|
@@ -75,6 +75,7 @@ module Beetle
|
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
|
|
78
|
+
# called by the message dispatcher when a "client_started" message from a RedisConfigurationClient is received
|
|
78
79
|
def client_started(payload)
|
|
79
80
|
id = payload["id"]
|
|
80
81
|
if client_id_valid?(id)
|
|
@@ -186,7 +187,7 @@ module Beetle
|
|
|
186
187
|
end
|
|
187
188
|
known_client
|
|
188
189
|
end
|
|
189
|
-
|
|
190
|
+
|
|
190
191
|
def client_id_valid?(client_id)
|
|
191
192
|
@client_ids.include?(client_id)
|
|
192
193
|
end
|
|
@@ -55,11 +55,9 @@ module Beetle
|
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
class
|
|
59
|
-
test
|
|
60
|
-
|
|
61
|
-
r.client.expects(:with_timeout).with(1).raises(Timeout::Error)
|
|
62
|
-
assert_equal({}, r.info_with_rescue)
|
|
58
|
+
class HiredisLoadedTest < Test::Unit::TestCase
|
|
59
|
+
test 'should be using hiredis instead of the redis ruby backend' do
|
|
60
|
+
assert defined?(Hiredis)
|
|
63
61
|
end
|
|
64
62
|
end
|
|
65
63
|
end
|
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: beetle
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 15424035
|
|
5
5
|
prerelease: 6
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 3
|
|
9
9
|
- 0
|
|
10
10
|
- rc
|
|
11
|
-
-
|
|
12
|
-
version: 0.3.0.rc.
|
|
11
|
+
- 3
|
|
12
|
+
version: 0.3.0.rc.3
|
|
13
13
|
platform: ruby
|
|
14
14
|
authors:
|
|
15
15
|
- Stefan Kaes
|
|
@@ -20,8 +20,7 @@ autorequire:
|
|
|
20
20
|
bindir: bin
|
|
21
21
|
cert_chain: []
|
|
22
22
|
|
|
23
|
-
date: 2011-
|
|
24
|
-
default_executable: beetle
|
|
23
|
+
date: 2011-10-05 00:00:00 Z
|
|
25
24
|
dependencies:
|
|
26
25
|
- !ruby/object:Gem::Dependency
|
|
27
26
|
name: uuid4r
|
|
@@ -66,15 +65,31 @@ dependencies:
|
|
|
66
65
|
hash: 7
|
|
67
66
|
segments:
|
|
68
67
|
- 2
|
|
68
|
+
- 2
|
|
69
69
|
- 0
|
|
70
|
-
|
|
71
|
-
version: 2.0.4
|
|
70
|
+
version: 2.2.0
|
|
72
71
|
type: :runtime
|
|
73
72
|
version_requirements: *id003
|
|
74
73
|
- !ruby/object:Gem::Dependency
|
|
75
|
-
name:
|
|
74
|
+
name: hiredis
|
|
76
75
|
prerelease: false
|
|
77
76
|
requirement: &id004 !ruby/object:Gem::Requirement
|
|
77
|
+
none: false
|
|
78
|
+
requirements:
|
|
79
|
+
- - "="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
hash: 23
|
|
82
|
+
segments:
|
|
83
|
+
- 0
|
|
84
|
+
- 3
|
|
85
|
+
- 2
|
|
86
|
+
version: 0.3.2
|
|
87
|
+
type: :runtime
|
|
88
|
+
version_requirements: *id004
|
|
89
|
+
- !ruby/object:Gem::Dependency
|
|
90
|
+
name: amqp
|
|
91
|
+
prerelease: false
|
|
92
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
78
93
|
none: false
|
|
79
94
|
requirements:
|
|
80
95
|
- - ~>
|
|
@@ -86,11 +101,11 @@ dependencies:
|
|
|
86
101
|
- 7
|
|
87
102
|
version: 0.6.7
|
|
88
103
|
type: :runtime
|
|
89
|
-
version_requirements: *
|
|
104
|
+
version_requirements: *id005
|
|
90
105
|
- !ruby/object:Gem::Dependency
|
|
91
106
|
name: activesupport
|
|
92
107
|
prerelease: false
|
|
93
|
-
requirement: &
|
|
108
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
|
94
109
|
none: false
|
|
95
110
|
requirements:
|
|
96
111
|
- - ">="
|
|
@@ -102,11 +117,11 @@ dependencies:
|
|
|
102
117
|
- 4
|
|
103
118
|
version: 2.3.4
|
|
104
119
|
type: :runtime
|
|
105
|
-
version_requirements: *
|
|
120
|
+
version_requirements: *id006
|
|
106
121
|
- !ruby/object:Gem::Dependency
|
|
107
122
|
name: daemons
|
|
108
123
|
prerelease: false
|
|
109
|
-
requirement: &
|
|
124
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
|
110
125
|
none: false
|
|
111
126
|
requirements:
|
|
112
127
|
- - ">="
|
|
@@ -118,11 +133,11 @@ dependencies:
|
|
|
118
133
|
- 10
|
|
119
134
|
version: 1.0.10
|
|
120
135
|
type: :runtime
|
|
121
|
-
version_requirements: *
|
|
136
|
+
version_requirements: *id007
|
|
122
137
|
- !ruby/object:Gem::Dependency
|
|
123
138
|
name: rake
|
|
124
139
|
prerelease: false
|
|
125
|
-
requirement: &
|
|
140
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
|
126
141
|
none: false
|
|
127
142
|
requirements:
|
|
128
143
|
- - ">="
|
|
@@ -134,11 +149,11 @@ dependencies:
|
|
|
134
149
|
- 7
|
|
135
150
|
version: 0.8.7
|
|
136
151
|
type: :development
|
|
137
|
-
version_requirements: *
|
|
152
|
+
version_requirements: *id008
|
|
138
153
|
- !ruby/object:Gem::Dependency
|
|
139
154
|
name: mocha
|
|
140
155
|
prerelease: false
|
|
141
|
-
requirement: &
|
|
156
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
|
142
157
|
none: false
|
|
143
158
|
requirements:
|
|
144
159
|
- - ">="
|
|
@@ -148,11 +163,11 @@ dependencies:
|
|
|
148
163
|
- 0
|
|
149
164
|
version: "0"
|
|
150
165
|
type: :development
|
|
151
|
-
version_requirements: *
|
|
166
|
+
version_requirements: *id009
|
|
152
167
|
- !ruby/object:Gem::Dependency
|
|
153
168
|
name: rcov
|
|
154
169
|
prerelease: false
|
|
155
|
-
requirement: &
|
|
170
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
|
156
171
|
none: false
|
|
157
172
|
requirements:
|
|
158
173
|
- - ">="
|
|
@@ -162,11 +177,11 @@ dependencies:
|
|
|
162
177
|
- 0
|
|
163
178
|
version: "0"
|
|
164
179
|
type: :development
|
|
165
|
-
version_requirements: *
|
|
180
|
+
version_requirements: *id010
|
|
166
181
|
- !ruby/object:Gem::Dependency
|
|
167
182
|
name: redgreen
|
|
168
183
|
prerelease: false
|
|
169
|
-
requirement: &
|
|
184
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
|
170
185
|
none: false
|
|
171
186
|
requirements:
|
|
172
187
|
- - ">="
|
|
@@ -176,11 +191,11 @@ dependencies:
|
|
|
176
191
|
- 0
|
|
177
192
|
version: "0"
|
|
178
193
|
type: :development
|
|
179
|
-
version_requirements: *
|
|
194
|
+
version_requirements: *id011
|
|
180
195
|
- !ruby/object:Gem::Dependency
|
|
181
196
|
name: wirble
|
|
182
197
|
prerelease: false
|
|
183
|
-
requirement: &
|
|
198
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
|
184
199
|
none: false
|
|
185
200
|
requirements:
|
|
186
201
|
- - ">="
|
|
@@ -190,11 +205,11 @@ dependencies:
|
|
|
190
205
|
- 0
|
|
191
206
|
version: "0"
|
|
192
207
|
type: :development
|
|
193
|
-
version_requirements: *
|
|
208
|
+
version_requirements: *id012
|
|
194
209
|
- !ruby/object:Gem::Dependency
|
|
195
210
|
name: cucumber
|
|
196
211
|
prerelease: false
|
|
197
|
-
requirement: &
|
|
212
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
|
198
213
|
none: false
|
|
199
214
|
requirements:
|
|
200
215
|
- - ">="
|
|
@@ -206,11 +221,11 @@ dependencies:
|
|
|
206
221
|
- 2
|
|
207
222
|
version: 0.7.2
|
|
208
223
|
type: :development
|
|
209
|
-
version_requirements: *
|
|
224
|
+
version_requirements: *id013
|
|
210
225
|
- !ruby/object:Gem::Dependency
|
|
211
226
|
name: daemon_controller
|
|
212
227
|
prerelease: false
|
|
213
|
-
requirement: &
|
|
228
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
|
214
229
|
none: false
|
|
215
230
|
requirements:
|
|
216
231
|
- - ">="
|
|
@@ -220,7 +235,7 @@ dependencies:
|
|
|
220
235
|
- 0
|
|
221
236
|
version: "0"
|
|
222
237
|
type: :development
|
|
223
|
-
version_requirements: *
|
|
238
|
+
version_requirements: *id014
|
|
224
239
|
description: A highly available, reliable messaging infrastructure
|
|
225
240
|
email: developers@xing.com
|
|
226
241
|
executables:
|
|
@@ -244,7 +259,6 @@ files:
|
|
|
244
259
|
- examples/redundant.rb
|
|
245
260
|
- examples/rpc.rb
|
|
246
261
|
- examples/simple.rb
|
|
247
|
-
- examples/test_publisher.rb
|
|
248
262
|
- lib/beetle/base.rb
|
|
249
263
|
- lib/beetle/client.rb
|
|
250
264
|
- lib/beetle/commands/configuration_client.rb
|
|
@@ -299,7 +313,6 @@ files:
|
|
|
299
313
|
- test/beetle_test.rb
|
|
300
314
|
- test/test_helper.rb
|
|
301
315
|
- bin/beetle
|
|
302
|
-
has_rdoc: true
|
|
303
316
|
homepage: http://xing.github.com/beetle/
|
|
304
317
|
licenses: []
|
|
305
318
|
|
|
@@ -331,7 +344,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
331
344
|
requirements: []
|
|
332
345
|
|
|
333
346
|
rubyforge_project:
|
|
334
|
-
rubygems_version: 1.
|
|
347
|
+
rubygems_version: 1.8.11
|
|
335
348
|
signing_key:
|
|
336
349
|
specification_version: 3
|
|
337
350
|
summary: High Availability AMQP Messaging with Redundant Queues
|
data/examples/test_publisher.rb
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# attempts.rb
|
|
2
|
-
# this example shows you how to use the exception limiting feature of beetle
|
|
3
|
-
# it allows you to control the number of retries your handler will go through
|
|
4
|
-
# with one message before giving up on it
|
|
5
|
-
#
|
|
6
|
-
# ! check the examples/README.rdoc for information on starting your redis/rabbit !
|
|
7
|
-
#
|
|
8
|
-
# start it with ruby attempts.rb
|
|
9
|
-
|
|
10
|
-
require "rubygems"
|
|
11
|
-
require File.expand_path("../lib/beetle", File.dirname(__FILE__))
|
|
12
|
-
require "eventmachine"
|
|
13
|
-
|
|
14
|
-
# set Beetle log level to info, less noisy than debug
|
|
15
|
-
Beetle.config.logger.level = Logger::INFO
|
|
16
|
-
|
|
17
|
-
# setup client
|
|
18
|
-
client = Beetle::Client.new
|
|
19
|
-
client.register_message(:test)
|
|
20
|
-
|
|
21
|
-
n = 0
|
|
22
|
-
EM.run do
|
|
23
|
-
EM.add_periodic_timer(0.1) do
|
|
24
|
-
data = (n+=1)
|
|
25
|
-
client.logger.info "publishing #{data}"
|
|
26
|
-
client.publish(:test, data)
|
|
27
|
-
end
|
|
28
|
-
trap("INT") do
|
|
29
|
-
client.stop_publishing
|
|
30
|
-
EM.stop_event_loop
|
|
31
|
-
end
|
|
32
|
-
end
|