beetle 0.3.0.rc.14 → 0.3.0.rc.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- Given "redis server \"#{redis_name}\" is slave of \"#{redis_master_name}\""
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|
@@ -29,6 +29,7 @@ module Beetle
29
29
  @processor = processor
30
30
  @error_callback = opts[:errback]
31
31
  @failure_callback = opts[:failback]
32
+ @__handler_called__ = nil
32
33
  end
33
34
 
34
35
  # called when a message should be processed. if the message was caused by an RPC, the
@@ -43,6 +44,8 @@ module Beetle
43
44
  else
44
45
  process
45
46
  end
47
+ ensure
48
+ @__handler_called__ = true
46
49
  end
47
50
 
48
51
  # called for message processing if no processor was specfied when the handler instance
@@ -75,7 +78,7 @@ module Beetle
75
78
 
76
79
  # should not be overriden in subclasses
77
80
  def processing_completed
78
- completed
81
+ completed if @__handler_called__
79
82
  rescue Exception
80
83
  Beetle::reraise_expectation_errors!
81
84
  end
@@ -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.debug "All client pong messages received"
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("Received client_started message from id '#{id}'")
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(msg)
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 "initiating master switch: already in progress = #{switch_in_progress}"
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("failed to determine initial redis master")
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(msg)
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(msg)
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(msg)
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 "Publishing reconfigure message with server '#{master.server}'"
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
 
@@ -1,3 +1,3 @@
1
1
  module Beetle
2
- VERSION = "0.3.0.rc.14"
2
+ VERSION = "0.3.0.rc.16"
3
3
  end
@@ -103,8 +103,15 @@ module Beetle
103
103
  end
104
104
 
105
105
  test "should silently rescue exceptions in the processing_completed call" do
106
- handler = Handler.create(lambda {})
106
+ handler = Handler.create(lambda {|m|})
107
107
  handler.expects(:completed).raises(Exception)
108
+ handler.call(mock("message"))
109
+ assert_nothing_raised {handler.processing_completed}
110
+ end
111
+
112
+ test "should not invoke completed method when the hander was never called" do
113
+ handler = Handler.create(lambda {})
114
+ handler.expects(:completed).never
108
115
  assert_nothing_raised {handler.processing_completed}
109
116
  end
110
117
 
@@ -303,38 +303,26 @@ module Beetle
303
303
  end
304
304
  end
305
305
 
306
- class RedisConfigurationServerSystemNotificationAndLoggingTest < Test::Unit::TestCase
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 log and send a system notification when pong message from unknown client received" do
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 warn about unknown clients when receiving client_started messages" do
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,17 +1,10 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: beetle
3
- version: !ruby/object:Gem::Version
4
- hash: -3659944352
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0.rc.16
5
5
  prerelease: 6
6
- segments:
7
- - 0
8
- - 3
9
- - 0
10
- - rc
11
- - 14
12
- version: 0.3.0.rc.14
13
6
  platform: ruby
14
- authors:
7
+ authors:
15
8
  - Stefan Kaes
16
9
  - Pascal Friederich
17
10
  - Ali Jelveh
@@ -20,183 +13,181 @@ authors:
20
13
  autorequire:
21
14
  bindir: bin
22
15
  cert_chain: []
23
-
24
- date: 2012-07-01 00:00:00 Z
25
- dependencies:
26
- - !ruby/object:Gem::Dependency
16
+ date: 2012-11-20 00:00:00.000000000 Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
27
19
  name: uuid4r
28
- prerelease: false
29
- requirement: &id001 !ruby/object:Gem::Requirement
20
+ requirement: !ruby/object:Gem::Requirement
30
21
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- hash: 31
35
- segments:
36
- - 0
37
- - 1
38
- - 2
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
39
25
  version: 0.1.2
40
26
  type: :runtime
41
- version_requirements: *id001
42
- - !ruby/object:Gem::Dependency
43
- name: bunny
44
27
  prerelease: false
45
- requirement: &id002 !ruby/object:Gem::Requirement
28
+ version_requirements: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.2
34
+ - !ruby/object:Gem::Dependency
35
+ name: bunny
36
+ requirement: !ruby/object:Gem::Requirement
46
37
  none: false
47
- requirements:
48
- - - "="
49
- - !ruby/object:Gem::Version
50
- hash: 17
51
- segments:
52
- - 0
53
- - 7
54
- - 9
38
+ requirements:
39
+ - - '='
40
+ - !ruby/object:Gem::Version
55
41
  version: 0.7.9
56
42
  type: :runtime
57
- version_requirements: *id002
58
- - !ruby/object:Gem::Dependency
59
- name: redis
60
43
  prerelease: false
61
- requirement: &id003 !ruby/object:Gem::Requirement
44
+ version_requirements: !ruby/object:Gem::Requirement
62
45
  none: false
63
- requirements:
64
- - - "="
65
- - !ruby/object:Gem::Version
66
- hash: 5
67
- segments:
68
- - 3
69
- - 0
70
- - 1
46
+ requirements:
47
+ - - '='
48
+ - !ruby/object:Gem::Version
49
+ version: 0.7.9
50
+ - !ruby/object:Gem::Dependency
51
+ name: redis
52
+ requirement: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - '='
56
+ - !ruby/object:Gem::Version
71
57
  version: 3.0.1
72
58
  type: :runtime
73
- version_requirements: *id003
74
- - !ruby/object:Gem::Dependency
75
- name: hiredis
76
59
  prerelease: false
77
- requirement: &id004 !ruby/object:Gem::Requirement
60
+ version_requirements: !ruby/object:Gem::Requirement
78
61
  none: false
79
- requirements:
80
- - - "="
81
- - !ruby/object:Gem::Version
82
- hash: 5
83
- segments:
84
- - 0
85
- - 4
86
- - 5
62
+ requirements:
63
+ - - '='
64
+ - !ruby/object:Gem::Version
65
+ version: 3.0.1
66
+ - !ruby/object:Gem::Dependency
67
+ name: hiredis
68
+ requirement: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - '='
72
+ - !ruby/object:Gem::Version
87
73
  version: 0.4.5
88
74
  type: :runtime
89
- version_requirements: *id004
90
- - !ruby/object:Gem::Dependency
91
- name: amq-client
92
75
  prerelease: false
93
- requirement: &id005 !ruby/object:Gem::Requirement
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - '='
80
+ - !ruby/object:Gem::Version
81
+ version: 0.4.5
82
+ - !ruby/object:Gem::Dependency
83
+ name: amq-client
84
+ requirement: !ruby/object:Gem::Requirement
94
85
  none: false
95
- requirements:
96
- - - "="
97
- - !ruby/object:Gem::Version
98
- hash: 61
99
- segments:
100
- - 0
101
- - 9
102
- - 3
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
103
89
  version: 0.9.3
104
90
  type: :runtime
105
- version_requirements: *id005
106
- - !ruby/object:Gem::Dependency
107
- name: amq-protocol
108
91
  prerelease: false
109
- requirement: &id006 !ruby/object:Gem::Requirement
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - '='
96
+ - !ruby/object:Gem::Version
97
+ version: 0.9.3
98
+ - !ruby/object:Gem::Dependency
99
+ name: amq-protocol
100
+ requirement: !ruby/object:Gem::Requirement
110
101
  none: false
111
- requirements:
112
- - - "="
113
- - !ruby/object:Gem::Version
114
- hash: 61
115
- segments:
116
- - 0
117
- - 9
118
- - 3
102
+ requirements:
103
+ - - '='
104
+ - !ruby/object:Gem::Version
119
105
  version: 0.9.3
120
106
  type: :runtime
121
- version_requirements: *id006
122
- - !ruby/object:Gem::Dependency
123
- name: amqp
124
107
  prerelease: false
125
- requirement: &id007 !ruby/object:Gem::Requirement
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - '='
112
+ - !ruby/object:Gem::Version
113
+ version: 0.9.3
114
+ - !ruby/object:Gem::Dependency
115
+ name: amqp
116
+ requirement: !ruby/object:Gem::Requirement
126
117
  none: false
127
- requirements:
128
- - - "="
129
- - !ruby/object:Gem::Version
130
- hash: 55
131
- segments:
132
- - 0
133
- - 9
134
- - 6
118
+ requirements:
119
+ - - '='
120
+ - !ruby/object:Gem::Version
135
121
  version: 0.9.6
136
122
  type: :runtime
137
- version_requirements: *id007
138
- - !ruby/object:Gem::Dependency
139
- name: activesupport
140
123
  prerelease: false
141
- requirement: &id008 !ruby/object:Gem::Requirement
124
+ version_requirements: !ruby/object:Gem::Requirement
142
125
  none: false
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- hash: 11
147
- segments:
148
- - 2
149
- - 3
150
- - 4
126
+ requirements:
127
+ - - '='
128
+ - !ruby/object:Gem::Version
129
+ version: 0.9.6
130
+ - !ruby/object:Gem::Dependency
131
+ name: activesupport
132
+ requirement: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
151
137
  version: 2.3.4
152
138
  type: :runtime
153
- version_requirements: *id008
154
- - !ruby/object:Gem::Dependency
155
- name: eventmachine_httpserver
156
139
  prerelease: false
157
- requirement: &id009 !ruby/object:Gem::Requirement
140
+ version_requirements: !ruby/object:Gem::Requirement
158
141
  none: false
159
- requirements:
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- hash: 21
163
- segments:
164
- - 0
165
- - 2
166
- - 1
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: 2.3.4
146
+ - !ruby/object:Gem::Dependency
147
+ name: eventmachine_httpserver
148
+ requirement: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
167
153
  version: 0.2.1
168
154
  type: :runtime
169
- version_requirements: *id009
170
- - !ruby/object:Gem::Dependency
171
- name: daemons
172
155
  prerelease: false
173
- requirement: &id010 !ruby/object:Gem::Requirement
156
+ version_requirements: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: 0.2.1
162
+ - !ruby/object:Gem::Dependency
163
+ name: daemons
164
+ requirement: !ruby/object:Gem::Requirement
174
165
  none: false
175
- requirements:
176
- - - ">="
177
- - !ruby/object:Gem::Version
178
- hash: 3
179
- segments:
180
- - 1
181
- - 0
182
- - 10
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
183
169
  version: 1.0.10
184
170
  type: :runtime
185
- version_requirements: *id010
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ none: false
174
+ requirements:
175
+ - - ! '>='
176
+ - !ruby/object:Gem::Version
177
+ version: 1.0.10
186
178
  description: A highly available, reliable messaging infrastructure
187
179
  email: opensource@xing.com
188
- executables:
180
+ executables:
189
181
  - beetle
190
182
  extensions: []
191
-
192
- extra_rdoc_files:
183
+ extra_rdoc_files:
193
184
  - examples/README.rdoc
194
185
  - features/README.rdoc
195
186
  - README.rdoc
196
187
  - REDIS_AUTO_FAILOVER.rdoc
197
188
  - RELEASE_NOTES.rdoc
198
189
  - MIT-LICENSE
199
- files:
190
+ files:
200
191
  - examples/attempts.rb
201
192
  - examples/handler_class.rb
202
193
  - examples/handling_exceptions.rb
@@ -269,40 +260,36 @@ files:
269
260
  - bin/beetle
270
261
  homepage: http://xing.github.com/beetle/
271
262
  licenses: []
272
-
273
- post_install_message: " *********************************************************************************************\n\n Please install the SystemTimer gem if you're running a ruby version < 1.9:\n `gem install SystemTimer -v '=1.2.1'`\n See: http://ph7spot.com/musings/system-timer\n\n *********************************************************************************************\n"
274
- rdoc_options:
263
+ post_install_message: ! " *********************************************************************************************\n\n
264
+ \ Please install the SystemTimer gem if you're running a ruby version < 1.9:\n
265
+ \ `gem install SystemTimer -v '=1.2.1'`\n See: http://ph7spot.com/musings/system-timer\n\n
266
+ \ *********************************************************************************************\n"
267
+ rdoc_options:
275
268
  - --charset=UTF-8
276
- require_paths:
269
+ require_paths:
277
270
  - lib
278
- required_ruby_version: !ruby/object:Gem::Requirement
271
+ required_ruby_version: !ruby/object:Gem::Requirement
279
272
  none: false
280
- requirements:
281
- - - ">="
282
- - !ruby/object:Gem::Version
283
- hash: 3
284
- segments:
273
+ requirements:
274
+ - - ! '>='
275
+ - !ruby/object:Gem::Version
276
+ version: '0'
277
+ segments:
285
278
  - 0
286
- version: "0"
287
- required_rubygems_version: !ruby/object:Gem::Requirement
279
+ hash: -3446454574049422431
280
+ required_rubygems_version: !ruby/object:Gem::Requirement
288
281
  none: false
289
- requirements:
290
- - - ">="
291
- - !ruby/object:Gem::Version
292
- hash: 21
293
- segments:
294
- - 1
295
- - 3
296
- - 7
282
+ requirements:
283
+ - - ! '>='
284
+ - !ruby/object:Gem::Version
297
285
  version: 1.3.7
298
286
  requirements: []
299
-
300
287
  rubyforge_project:
301
288
  rubygems_version: 1.8.24
302
289
  signing_key:
303
290
  specification_version: 3
304
291
  summary: High Availability AMQP Messaging with Redundant Queues
305
- test_files:
292
+ test_files:
306
293
  - test/beetle/amqp_gem_behavior_test.rb
307
294
  - test/beetle/base_test.rb
308
295
  - test/beetle/beetle_test.rb