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

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.
@@ -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