beetle 0.3.0.rc.14 → 0.3.0.rc.15
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/features/step_definitions/redis_auto_failover_steps.rb +1 -1
- data/lib/beetle/redis_configuration_client.rb +3 -0
- data/lib/beetle/redis_configuration_server.rb +14 -9
- data/lib/beetle/version.rb +1 -1
- data/test/beetle/redis_configuration_server_test.rb +3 -15
- metadata +34 -35
- data/examples/test_publisher.rb +0 -32
@@ -5,7 +5,7 @@ end
|
|
5
5
|
|
6
6
|
Given /^a redis server "([^\"]*)" exists as slave of "([^\"]*)"$/ do |redis_name, redis_master_name|
|
7
7
|
TestDaemons::Redis[redis_name].start
|
8
|
-
|
8
|
+
step "redis server \"#{redis_name}\" is slave of \"#{redis_master_name}\""
|
9
9
|
end
|
10
10
|
|
11
11
|
Given /^redis server "([^\"]*)" is master$/ do |redis_name|
|
@@ -117,16 +117,19 @@ module Beetle
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def pong!
|
120
|
+
logger.info "Sending pong message with id '#{id}' and token '#{@current_token}'"
|
120
121
|
beetle.publish(:pong, {"id" => id, "token" => @current_token}.to_json)
|
121
122
|
end
|
122
123
|
|
123
124
|
def client_started!
|
125
|
+
logger.info "Sending client_started message with id '#{id}'"
|
124
126
|
beetle.publish(:client_started, {"id" => id}.to_json)
|
125
127
|
end
|
126
128
|
|
127
129
|
def invalidate!
|
128
130
|
@current_master = nil
|
129
131
|
clear_redis_master_file
|
132
|
+
logger.info "Sending client_invalidated message with id '#{id}' and token '#{@current_token}'"
|
130
133
|
beetle.publish(:client_invalidated, {"id" => id, "token" => @current_token}.to_json)
|
131
134
|
end
|
132
135
|
|
@@ -86,7 +86,7 @@ module Beetle
|
|
86
86
|
return unless redeem_token(token)
|
87
87
|
@client_pong_ids_received << id
|
88
88
|
if all_client_pong_ids_received?
|
89
|
-
logger.
|
89
|
+
logger.info "All client pong messages received"
|
90
90
|
@available_timer.cancel if @available_timer
|
91
91
|
invalidate_current_master
|
92
92
|
end
|
@@ -96,10 +96,10 @@ module Beetle
|
|
96
96
|
def client_started(payload)
|
97
97
|
id = payload["id"]
|
98
98
|
if client_id_valid?(id)
|
99
|
-
logger.info
|
99
|
+
logger.info "Received client_started message from id '#{id}'"
|
100
100
|
else
|
101
101
|
msg = "Received client_started message from unknown id '#{id}'"
|
102
|
-
logger.error
|
102
|
+
logger.error msg
|
103
103
|
beetle.publish(:system_notification, {"message" => msg}.to_json)
|
104
104
|
end
|
105
105
|
end
|
@@ -152,7 +152,7 @@ module Beetle
|
|
152
152
|
def initiate_master_switch
|
153
153
|
redis.refresh
|
154
154
|
available, switch_in_progress = master_available?, paused?
|
155
|
-
logger.debug "
|
155
|
+
logger.debug "Initiating master switch: already in progress = #{switch_in_progress}"
|
156
156
|
unless available || switch_in_progress
|
157
157
|
master_unavailable!
|
158
158
|
end
|
@@ -205,7 +205,7 @@ module Beetle
|
|
205
205
|
else
|
206
206
|
write_redis_master_file(current_master.server) if @current_master = redis.auto_detect_master
|
207
207
|
end
|
208
|
-
current_master or raise NoRedisMaster.new("
|
208
|
+
current_master or raise NoRedisMaster.new("Failed to determine initial redis master")
|
209
209
|
end
|
210
210
|
|
211
211
|
def determine_new_master
|
@@ -215,7 +215,8 @@ module Beetle
|
|
215
215
|
def validate_pong_client_id(client_id)
|
216
216
|
unless known_client = client_id_valid?(client_id)
|
217
217
|
msg = "Received pong message from unknown id '#{client_id}'"
|
218
|
-
logger.error
|
218
|
+
logger.error msg
|
219
|
+
logger.info "Sending system_notification message with text: #{msg}"
|
219
220
|
beetle.publish(:system_notification, {"message" => msg}.to_json)
|
220
221
|
end
|
221
222
|
known_client
|
@@ -239,12 +240,14 @@ module Beetle
|
|
239
240
|
|
240
241
|
def check_all_clients_available
|
241
242
|
generate_new_token
|
243
|
+
logger.info "Sending ping message with token '#{@current_token}'"
|
242
244
|
beetle.publish(:ping, payload_with_current_token)
|
243
245
|
@available_timer = EM::Timer.new(config.redis_configuration_client_timeout) { cancel_invalidation }
|
244
246
|
end
|
245
247
|
|
246
248
|
def invalidate_current_master
|
247
249
|
generate_new_token
|
250
|
+
logger.info "Sending invalidate message with token '#{@current_token}'"
|
248
251
|
beetle.publish(:invalidate, payload_with_current_token)
|
249
252
|
@invalidate_timer = EM::Timer.new(config.redis_configuration_client_timeout) { cancel_invalidation }
|
250
253
|
end
|
@@ -275,7 +278,8 @@ module Beetle
|
|
275
278
|
def switch_master
|
276
279
|
if new_master = determine_new_master
|
277
280
|
msg = "Setting redis master to '#{new_master.server}' (was '#{current_master.server}')"
|
278
|
-
logger.warn
|
281
|
+
logger.warn msg
|
282
|
+
logger.info "Sending system_notification message with text: #{msg}"
|
279
283
|
beetle.publish(:system_notification, {"message" => msg}.to_json)
|
280
284
|
|
281
285
|
new_master.master!
|
@@ -283,7 +287,8 @@ module Beetle
|
|
283
287
|
@current_master = new_master
|
284
288
|
else
|
285
289
|
msg = "Redis master could not be switched, no slave available to become new master, promoting old master"
|
286
|
-
logger.error
|
290
|
+
logger.error msg
|
291
|
+
logger.info "Sending system_notification message with text: #{msg}"
|
287
292
|
beetle.publish(:system_notification, {"message" => msg}.to_json)
|
288
293
|
end
|
289
294
|
|
@@ -292,7 +297,7 @@ module Beetle
|
|
292
297
|
end
|
293
298
|
|
294
299
|
def publish_master(master)
|
295
|
-
logger.info "
|
300
|
+
logger.info "Sending reconfigure message with server '#{master.server}'"
|
296
301
|
beetle.publish(:reconfigure, payload_with_current_token({"server" => master.server}))
|
297
302
|
end
|
298
303
|
|
data/lib/beetle/version.rb
CHANGED
@@ -303,38 +303,26 @@ module Beetle
|
|
303
303
|
end
|
304
304
|
end
|
305
305
|
|
306
|
-
class
|
306
|
+
class RedisConfigurationServerSystemNotificationTest < Test::Unit::TestCase
|
307
307
|
def setup
|
308
308
|
Beetle.config.redis_configuration_client_ids = "rc-client-1,rc-client-2"
|
309
309
|
@server = RedisConfigurationServer.new
|
310
310
|
@server.stubs(:beetle).returns(stub(:publish))
|
311
|
-
@server.stubs(:logger).returns(stub)
|
312
311
|
EventMachine.stubs(:add_timer).yields
|
313
312
|
end
|
314
313
|
|
315
|
-
test "should
|
314
|
+
test "should send a system notification when receiving pong message from unknown client" do
|
316
315
|
payload = {"id" => "unknown-client", "token" => @server.current_token}
|
317
316
|
msg = "Received pong message from unknown id 'unknown-client'"
|
318
317
|
@server.beetle.expects(:publish).with(:system_notification, ({:message => msg}).to_json)
|
319
|
-
@server.logger.expects(:error).with(msg)
|
320
318
|
@server.pong(payload)
|
321
319
|
end
|
322
320
|
|
323
|
-
test "should
|
321
|
+
test "should send a system notification when receiving client_started message from unknown client" do
|
324
322
|
payload = {"id" => "unknown-client"}
|
325
323
|
msg = "Received client_started message from unknown id 'unknown-client'"
|
326
324
|
@server.beetle.expects(:publish).with(:system_notification, ({:message => msg}).to_json)
|
327
|
-
@server.logger.expects(:error).with(msg)
|
328
325
|
@server.client_started(payload)
|
329
326
|
end
|
330
|
-
|
331
|
-
test "should log an info about received client_started client_started messages" do
|
332
|
-
payload = {"id" => "known-client"}
|
333
|
-
msg = "Received client_started message from id 'known-client'"
|
334
|
-
@server.logger.expects(:info).with(msg)
|
335
|
-
@server.expects(:client_id_valid?).with('known-client').returns(true)
|
336
|
-
@server.client_started(payload)
|
337
|
-
end
|
338
|
-
|
339
327
|
end
|
340
328
|
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: -946228374
|
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
|
+
- 15
|
12
|
+
version: 0.3.0.rc.15
|
13
13
|
platform: ruby
|
14
14
|
authors:
|
15
15
|
- Stefan Kaes
|
@@ -21,11 +21,9 @@ autorequire:
|
|
21
21
|
bindir: bin
|
22
22
|
cert_chain: []
|
23
23
|
|
24
|
-
date: 2012-07-
|
24
|
+
date: 2012-07-23 00:00:00 Z
|
25
25
|
dependencies:
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
|
-
name: uuid4r
|
28
|
-
prerelease: false
|
29
27
|
requirement: &id001 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
29
|
requirements:
|
@@ -37,11 +35,11 @@ dependencies:
|
|
37
35
|
- 1
|
38
36
|
- 2
|
39
37
|
version: 0.1.2
|
40
|
-
type: :runtime
|
41
38
|
version_requirements: *id001
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: bunny
|
44
39
|
prerelease: false
|
40
|
+
type: :runtime
|
41
|
+
name: uuid4r
|
42
|
+
- !ruby/object:Gem::Dependency
|
45
43
|
requirement: &id002 !ruby/object:Gem::Requirement
|
46
44
|
none: false
|
47
45
|
requirements:
|
@@ -53,11 +51,11 @@ dependencies:
|
|
53
51
|
- 7
|
54
52
|
- 9
|
55
53
|
version: 0.7.9
|
56
|
-
type: :runtime
|
57
54
|
version_requirements: *id002
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
|
-
name: redis
|
60
55
|
prerelease: false
|
56
|
+
type: :runtime
|
57
|
+
name: bunny
|
58
|
+
- !ruby/object:Gem::Dependency
|
61
59
|
requirement: &id003 !ruby/object:Gem::Requirement
|
62
60
|
none: false
|
63
61
|
requirements:
|
@@ -69,11 +67,11 @@ dependencies:
|
|
69
67
|
- 0
|
70
68
|
- 1
|
71
69
|
version: 3.0.1
|
72
|
-
type: :runtime
|
73
70
|
version_requirements: *id003
|
74
|
-
- !ruby/object:Gem::Dependency
|
75
|
-
name: hiredis
|
76
71
|
prerelease: false
|
72
|
+
type: :runtime
|
73
|
+
name: redis
|
74
|
+
- !ruby/object:Gem::Dependency
|
77
75
|
requirement: &id004 !ruby/object:Gem::Requirement
|
78
76
|
none: false
|
79
77
|
requirements:
|
@@ -85,11 +83,11 @@ dependencies:
|
|
85
83
|
- 4
|
86
84
|
- 5
|
87
85
|
version: 0.4.5
|
88
|
-
type: :runtime
|
89
86
|
version_requirements: *id004
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
|
-
name: amq-client
|
92
87
|
prerelease: false
|
88
|
+
type: :runtime
|
89
|
+
name: hiredis
|
90
|
+
- !ruby/object:Gem::Dependency
|
93
91
|
requirement: &id005 !ruby/object:Gem::Requirement
|
94
92
|
none: false
|
95
93
|
requirements:
|
@@ -101,11 +99,11 @@ dependencies:
|
|
101
99
|
- 9
|
102
100
|
- 3
|
103
101
|
version: 0.9.3
|
104
|
-
type: :runtime
|
105
102
|
version_requirements: *id005
|
106
|
-
- !ruby/object:Gem::Dependency
|
107
|
-
name: amq-protocol
|
108
103
|
prerelease: false
|
104
|
+
type: :runtime
|
105
|
+
name: amq-client
|
106
|
+
- !ruby/object:Gem::Dependency
|
109
107
|
requirement: &id006 !ruby/object:Gem::Requirement
|
110
108
|
none: false
|
111
109
|
requirements:
|
@@ -117,11 +115,11 @@ dependencies:
|
|
117
115
|
- 9
|
118
116
|
- 3
|
119
117
|
version: 0.9.3
|
120
|
-
type: :runtime
|
121
118
|
version_requirements: *id006
|
122
|
-
- !ruby/object:Gem::Dependency
|
123
|
-
name: amqp
|
124
119
|
prerelease: false
|
120
|
+
type: :runtime
|
121
|
+
name: amq-protocol
|
122
|
+
- !ruby/object:Gem::Dependency
|
125
123
|
requirement: &id007 !ruby/object:Gem::Requirement
|
126
124
|
none: false
|
127
125
|
requirements:
|
@@ -133,11 +131,11 @@ dependencies:
|
|
133
131
|
- 9
|
134
132
|
- 6
|
135
133
|
version: 0.9.6
|
136
|
-
type: :runtime
|
137
134
|
version_requirements: *id007
|
138
|
-
- !ruby/object:Gem::Dependency
|
139
|
-
name: activesupport
|
140
135
|
prerelease: false
|
136
|
+
type: :runtime
|
137
|
+
name: amqp
|
138
|
+
- !ruby/object:Gem::Dependency
|
141
139
|
requirement: &id008 !ruby/object:Gem::Requirement
|
142
140
|
none: false
|
143
141
|
requirements:
|
@@ -149,11 +147,11 @@ dependencies:
|
|
149
147
|
- 3
|
150
148
|
- 4
|
151
149
|
version: 2.3.4
|
152
|
-
type: :runtime
|
153
150
|
version_requirements: *id008
|
154
|
-
- !ruby/object:Gem::Dependency
|
155
|
-
name: eventmachine_httpserver
|
156
151
|
prerelease: false
|
152
|
+
type: :runtime
|
153
|
+
name: activesupport
|
154
|
+
- !ruby/object:Gem::Dependency
|
157
155
|
requirement: &id009 !ruby/object:Gem::Requirement
|
158
156
|
none: false
|
159
157
|
requirements:
|
@@ -165,11 +163,11 @@ dependencies:
|
|
165
163
|
- 2
|
166
164
|
- 1
|
167
165
|
version: 0.2.1
|
168
|
-
type: :runtime
|
169
166
|
version_requirements: *id009
|
170
|
-
- !ruby/object:Gem::Dependency
|
171
|
-
name: daemons
|
172
167
|
prerelease: false
|
168
|
+
type: :runtime
|
169
|
+
name: eventmachine_httpserver
|
170
|
+
- !ruby/object:Gem::Dependency
|
173
171
|
requirement: &id010 !ruby/object:Gem::Requirement
|
174
172
|
none: false
|
175
173
|
requirements:
|
@@ -181,8 +179,10 @@ dependencies:
|
|
181
179
|
- 0
|
182
180
|
- 10
|
183
181
|
version: 1.0.10
|
184
|
-
type: :runtime
|
185
182
|
version_requirements: *id010
|
183
|
+
prerelease: false
|
184
|
+
type: :runtime
|
185
|
+
name: daemons
|
186
186
|
description: A highly available, reliable messaging infrastructure
|
187
187
|
email: opensource@xing.com
|
188
188
|
executables:
|
@@ -207,7 +207,6 @@ files:
|
|
207
207
|
- examples/redundant.rb
|
208
208
|
- examples/rpc.rb
|
209
209
|
- examples/simple.rb
|
210
|
-
- examples/test_publisher.rb
|
211
210
|
- lib/beetle/base.rb
|
212
211
|
- lib/beetle/client.rb
|
213
212
|
- lib/beetle/commands/configuration_client.rb
|
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
|