beetle 0.3.0.rc.4 → 0.3.0.rc.6

Sign up to get free protection for your applications and to get access to all the features.
data/beetle.gemspec CHANGED
@@ -1,13 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "beetle/version"
4
+
1
5
  Gem::Specification.new do |s|
2
6
  s.name = "beetle"
3
- s.version = "0.3.0.rc.4"
7
+ s.version = Beetle::VERSION
4
8
  s.required_rubygems_version = ">= 1.3.7"
5
- s.authors = ["Stefan Kaes", "Pascal Friederich", "Ali Jelveh", "Sebastian Roebke"]
9
+ s.authors = ["Stefan Kaes", "Pascal Friederich", "Ali Jelveh", "Sebastian Roebke", "Larry Baltz"]
6
10
  s.date = Time.now.strftime('%Y-%m-%d')
7
11
  s.default_executable = "beetle"
8
12
  s.description = "A highly available, reliable messaging infrastructure"
9
13
  s.summary = "High Availability AMQP Messaging with Redundant Queues"
10
- s.email = "developers@xing.com"
14
+ s.email = "opensource@xing.com"
11
15
  s.executables = ["beetle"]
12
16
  s.extra_rdoc_files = Dir['**/*.rdoc'] + %w(MIT-LICENSE)
13
17
  s.files = Dir['{examples,lib}/**/*.rb'] + Dir['{features,script}/**/*'] + %w(beetle.gemspec Rakefile)
@@ -30,7 +34,7 @@ Gem::Specification.new do |s|
30
34
  s.specification_version = 3
31
35
  s.add_runtime_dependency("uuid4r", [">= 0.1.2"])
32
36
  s.add_runtime_dependency("bunny", ["= 0.7.8"])
33
- s.add_runtime_dependency("redis", ["= 2.2.0"])
37
+ s.add_runtime_dependency("redis", ["= 2.2.2"])
34
38
  s.add_runtime_dependency("hiredis", ["= 0.3.2"])
35
39
  s.add_runtime_dependency("amq-client", ["= 0.8.3"])
36
40
  s.add_runtime_dependency("amq-protocol", ["= 0.8.1"])
@@ -40,8 +44,6 @@ Gem::Specification.new do |s|
40
44
  s.add_development_dependency("rake", [">= 0.8.7"])
41
45
  s.add_development_dependency("mocha", [">= 0"])
42
46
  s.add_development_dependency("rcov", [">= 0"])
43
- s.add_development_dependency("redgreen", [">= 0"])
44
- s.add_development_dependency("wirble", [">= 0"])
45
47
  s.add_development_dependency("cucumber", [">= 0.7.2"])
46
48
  s.add_development_dependency("daemon_controller", [">= 0"])
47
49
  end
@@ -39,7 +39,7 @@ module TestDaemons
39
39
  end
40
40
 
41
41
  def restart(delay=1)
42
- redis.shutdown rescue Errno::ECONNREFUSED
42
+ redis.shutdown
43
43
  sleep delay
44
44
  `redis-server #{config_filename}`
45
45
  end
data/lib/beetle.rb CHANGED
@@ -6,6 +6,7 @@ require 'redis'
6
6
  require 'active_support'
7
7
  require 'active_support/core_ext'
8
8
  require 'set'
9
+ require 'socket'
9
10
 
10
11
  module Beetle
11
12
  Timer = if RUBY_VERSION < "1.9"
@@ -46,6 +47,13 @@ module Beetle
46
47
  # AMQP options for subscribing to queues
47
48
  SUBSCRIPTION_KEYS = [:ack, :key]
48
49
 
50
+ # determine the fully qualified domainname of the host we're running on
51
+ def self.hostname
52
+ name = Socket.gethostname
53
+ parts = name.split('.')
54
+ parts.size > 1 ? name : Socket.gethostbyname(parts.first).first
55
+ end
56
+
49
57
  # use ruby's autoload mechanism for loading beetle classes
50
58
  lib_dir = File.expand_path(File.dirname(__FILE__) + '/beetle/')
51
59
  Dir["#{lib_dir}/*.rb"].each do |libfile|
data/lib/beetle/client.rb CHANGED
@@ -289,7 +289,7 @@ module Beetle
289
289
  end
290
290
 
291
291
  def queue_name_for_tracing(queue)
292
- "trace-#{queue}-#{`hostname`.chomp}-#{$$}"
292
+ "trace-#{queue}-#{Beetle.hostname}-#{$$}"
293
293
  end
294
294
  end
295
295
  end
@@ -25,7 +25,7 @@ module Beetle
25
25
 
26
26
  # Unique id for this instance (defaults to the fully qualified hostname)
27
27
  def id
28
- @id ||= `hostname -f`.chomp
28
+ @id ||= Beetle.hostname
29
29
  end
30
30
 
31
31
  def initialize #:nodoc:
@@ -50,4 +50,23 @@ class Redis #:nodoc:
50
50
  info = info_with_rescue
51
51
  info["role"] == "slave" && info["master_host"] == host && info["master_port"] == port.to_s
52
52
  end
53
+
54
+ # redis 2.2.2 shutdown implementation does not disconnect from the redis server.
55
+ # this leaves the connection in an inconsistent state and causes the next command to silently fail.
56
+ # this in turn breaks our cucumber test scenarios.
57
+ # fix this here, until a new version is released which fixes the problem.
58
+
59
+ alias_method :broken_shutdown, :shutdown
60
+
61
+ # Synchronously save the dataset to disk and then shut down the server.
62
+ def shutdown
63
+ synchronize do
64
+ begin
65
+ @client.call_without_reply [:shutdown]
66
+ ensure
67
+ @client.disconnect
68
+ end
69
+ end
70
+ end
71
+
53
72
  end
@@ -0,0 +1,3 @@
1
+ module Beetle
2
+ VERSION = "0.3.0.rc.6"
3
+ end
@@ -60,4 +60,19 @@ module Beetle
60
60
  assert defined?(Hiredis)
61
61
  end
62
62
  end
63
+
64
+ class BrokenRedisShutdownTest < Test::Unit::TestCase
65
+ def setup
66
+ @r = Redis.new(:host => "localhost", :port => 6390)
67
+ end
68
+
69
+ # if this test fails after upgrading redis, we can probably remove
70
+ # our custom shutdown method from redis_ext.rb
71
+ test "redis shutdown implementation is broken" do
72
+ @r.client.expects(:call_without_reply).with([:shutdown]).once
73
+ @r.client.expects(:disconnect).never
74
+ @r.broken_shutdown
75
+ end
76
+ end
77
+
63
78
  end
metadata CHANGED
@@ -1,288 +1,188 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: beetle
3
- version: !ruby/object:Gem::Version
4
- hash: 15424045
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0.rc.6
5
5
  prerelease: 6
6
- segments:
7
- - 0
8
- - 3
9
- - 0
10
- - rc
11
- - 4
12
- version: 0.3.0.rc.4
13
6
  platform: ruby
14
- authors:
7
+ authors:
15
8
  - Stefan Kaes
16
9
  - Pascal Friederich
17
10
  - Ali Jelveh
18
11
  - Sebastian Roebke
12
+ - Larry Baltz
19
13
  autorequire:
20
14
  bindir: bin
21
15
  cert_chain: []
22
-
23
- date: 2011-10-11 00:00:00 +02:00
16
+ date: 2011-10-22 00:00:00.000000000 +02:00
24
17
  default_executable: beetle
25
- dependencies:
26
- - !ruby/object:Gem::Dependency
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
27
20
  name: uuid4r
28
- prerelease: false
29
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ requirement: &2151634120 !ruby/object:Gem::Requirement
30
22
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- hash: 31
35
- segments:
36
- - 0
37
- - 1
38
- - 2
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
39
26
  version: 0.1.2
40
27
  type: :runtime
41
- version_requirements: *id001
42
- - !ruby/object:Gem::Dependency
43
- name: bunny
44
28
  prerelease: false
45
- requirement: &id002 !ruby/object:Gem::Requirement
29
+ version_requirements: *2151634120
30
+ - !ruby/object:Gem::Dependency
31
+ name: bunny
32
+ requirement: &2151633580 !ruby/object:Gem::Requirement
46
33
  none: false
47
- requirements:
48
- - - "="
49
- - !ruby/object:Gem::Version
50
- hash: 19
51
- segments:
52
- - 0
53
- - 7
54
- - 8
34
+ requirements:
35
+ - - =
36
+ - !ruby/object:Gem::Version
55
37
  version: 0.7.8
56
38
  type: :runtime
57
- version_requirements: *id002
58
- - !ruby/object:Gem::Dependency
59
- name: redis
60
39
  prerelease: false
61
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: *2151633580
41
+ - !ruby/object:Gem::Dependency
42
+ name: redis
43
+ requirement: &2151633100 !ruby/object:Gem::Requirement
62
44
  none: false
63
- requirements:
64
- - - "="
65
- - !ruby/object:Gem::Version
66
- hash: 7
67
- segments:
68
- - 2
69
- - 2
70
- - 0
71
- version: 2.2.0
45
+ requirements:
46
+ - - =
47
+ - !ruby/object:Gem::Version
48
+ version: 2.2.2
72
49
  type: :runtime
73
- version_requirements: *id003
74
- - !ruby/object:Gem::Dependency
75
- name: hiredis
76
50
  prerelease: false
77
- requirement: &id004 !ruby/object:Gem::Requirement
51
+ version_requirements: *2151633100
52
+ - !ruby/object:Gem::Dependency
53
+ name: hiredis
54
+ requirement: &2151632560 !ruby/object:Gem::Requirement
78
55
  none: false
79
- requirements:
80
- - - "="
81
- - !ruby/object:Gem::Version
82
- hash: 23
83
- segments:
84
- - 0
85
- - 3
86
- - 2
56
+ requirements:
57
+ - - =
58
+ - !ruby/object:Gem::Version
87
59
  version: 0.3.2
88
60
  type: :runtime
89
- version_requirements: *id004
90
- - !ruby/object:Gem::Dependency
91
- name: amq-client
92
61
  prerelease: false
93
- requirement: &id005 !ruby/object:Gem::Requirement
62
+ version_requirements: *2151632560
63
+ - !ruby/object:Gem::Dependency
64
+ name: amq-client
65
+ requirement: &2151632020 !ruby/object:Gem::Requirement
94
66
  none: false
95
- requirements:
96
- - - "="
97
- - !ruby/object:Gem::Version
98
- hash: 57
99
- segments:
100
- - 0
101
- - 8
102
- - 3
67
+ requirements:
68
+ - - =
69
+ - !ruby/object:Gem::Version
103
70
  version: 0.8.3
104
71
  type: :runtime
105
- version_requirements: *id005
106
- - !ruby/object:Gem::Dependency
107
- name: amq-protocol
108
72
  prerelease: false
109
- requirement: &id006 !ruby/object:Gem::Requirement
73
+ version_requirements: *2151632020
74
+ - !ruby/object:Gem::Dependency
75
+ name: amq-protocol
76
+ requirement: &2151631540 !ruby/object:Gem::Requirement
110
77
  none: false
111
- requirements:
112
- - - "="
113
- - !ruby/object:Gem::Version
114
- hash: 61
115
- segments:
116
- - 0
117
- - 8
118
- - 1
78
+ requirements:
79
+ - - =
80
+ - !ruby/object:Gem::Version
119
81
  version: 0.8.1
120
82
  type: :runtime
121
- version_requirements: *id006
122
- - !ruby/object:Gem::Dependency
123
- name: amqp
124
83
  prerelease: false
125
- requirement: &id007 !ruby/object:Gem::Requirement
84
+ version_requirements: *2151631540
85
+ - !ruby/object:Gem::Dependency
86
+ name: amqp
87
+ requirement: &2151631000 !ruby/object:Gem::Requirement
126
88
  none: false
127
- requirements:
128
- - - "="
129
- - !ruby/object:Gem::Version
130
- hash: 63
131
- segments:
132
- - 0
133
- - 8
134
- - 0
89
+ requirements:
90
+ - - =
91
+ - !ruby/object:Gem::Version
135
92
  version: 0.8.0
136
93
  type: :runtime
137
- version_requirements: *id007
138
- - !ruby/object:Gem::Dependency
139
- name: activesupport
140
94
  prerelease: false
141
- requirement: &id008 !ruby/object:Gem::Requirement
95
+ version_requirements: *2151631000
96
+ - !ruby/object:Gem::Dependency
97
+ name: activesupport
98
+ requirement: &2151630480 !ruby/object:Gem::Requirement
142
99
  none: false
143
- requirements:
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- hash: 11
147
- segments:
148
- - 2
149
- - 3
150
- - 4
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
151
103
  version: 2.3.4
152
104
  type: :runtime
153
- version_requirements: *id008
154
- - !ruby/object:Gem::Dependency
155
- name: daemons
156
105
  prerelease: false
157
- requirement: &id009 !ruby/object:Gem::Requirement
106
+ version_requirements: *2151630480
107
+ - !ruby/object:Gem::Dependency
108
+ name: daemons
109
+ requirement: &2151629940 !ruby/object:Gem::Requirement
158
110
  none: false
159
- requirements:
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- hash: 3
163
- segments:
164
- - 1
165
- - 0
166
- - 10
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
167
114
  version: 1.0.10
168
115
  type: :runtime
169
- version_requirements: *id009
170
- - !ruby/object:Gem::Dependency
171
- name: rake
172
116
  prerelease: false
173
- requirement: &id010 !ruby/object:Gem::Requirement
117
+ version_requirements: *2151629940
118
+ - !ruby/object:Gem::Dependency
119
+ name: rake
120
+ requirement: &2151629420 !ruby/object:Gem::Requirement
174
121
  none: false
175
- requirements:
176
- - - ">="
177
- - !ruby/object:Gem::Version
178
- hash: 49
179
- segments:
180
- - 0
181
- - 8
182
- - 7
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
183
125
  version: 0.8.7
184
126
  type: :development
185
- version_requirements: *id010
186
- - !ruby/object:Gem::Dependency
187
- name: mocha
188
- prerelease: false
189
- requirement: &id011 !ruby/object:Gem::Requirement
190
- none: false
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- hash: 3
195
- segments:
196
- - 0
197
- version: "0"
198
- type: :development
199
- version_requirements: *id011
200
- - !ruby/object:Gem::Dependency
201
- name: rcov
202
127
  prerelease: false
203
- requirement: &id012 !ruby/object:Gem::Requirement
128
+ version_requirements: *2151629420
129
+ - !ruby/object:Gem::Dependency
130
+ name: mocha
131
+ requirement: &2151628940 !ruby/object:Gem::Requirement
204
132
  none: false
205
- requirements:
206
- - - ">="
207
- - !ruby/object:Gem::Version
208
- hash: 3
209
- segments:
210
- - 0
211
- version: "0"
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
212
137
  type: :development
213
- version_requirements: *id012
214
- - !ruby/object:Gem::Dependency
215
- name: redgreen
216
138
  prerelease: false
217
- requirement: &id013 !ruby/object:Gem::Requirement
139
+ version_requirements: *2151628940
140
+ - !ruby/object:Gem::Dependency
141
+ name: rcov
142
+ requirement: &2151628460 !ruby/object:Gem::Requirement
218
143
  none: false
219
- requirements:
220
- - - ">="
221
- - !ruby/object:Gem::Version
222
- hash: 3
223
- segments:
224
- - 0
225
- version: "0"
144
+ requirements:
145
+ - - ! '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
226
148
  type: :development
227
- version_requirements: *id013
228
- - !ruby/object:Gem::Dependency
229
- name: wirble
230
149
  prerelease: false
231
- requirement: &id014 !ruby/object:Gem::Requirement
232
- none: false
233
- requirements:
234
- - - ">="
235
- - !ruby/object:Gem::Version
236
- hash: 3
237
- segments:
238
- - 0
239
- version: "0"
240
- type: :development
241
- version_requirements: *id014
242
- - !ruby/object:Gem::Dependency
150
+ version_requirements: *2151628460
151
+ - !ruby/object:Gem::Dependency
243
152
  name: cucumber
244
- prerelease: false
245
- requirement: &id015 !ruby/object:Gem::Requirement
153
+ requirement: &2151627860 !ruby/object:Gem::Requirement
246
154
  none: false
247
- requirements:
248
- - - ">="
249
- - !ruby/object:Gem::Version
250
- hash: 7
251
- segments:
252
- - 0
253
- - 7
254
- - 2
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
255
158
  version: 0.7.2
256
159
  type: :development
257
- version_requirements: *id015
258
- - !ruby/object:Gem::Dependency
259
- name: daemon_controller
260
160
  prerelease: false
261
- requirement: &id016 !ruby/object:Gem::Requirement
161
+ version_requirements: *2151627860
162
+ - !ruby/object:Gem::Dependency
163
+ name: daemon_controller
164
+ requirement: &2151627360 !ruby/object:Gem::Requirement
262
165
  none: false
263
- requirements:
264
- - - ">="
265
- - !ruby/object:Gem::Version
266
- hash: 3
267
- segments:
268
- - 0
269
- version: "0"
166
+ requirements:
167
+ - - ! '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
270
170
  type: :development
271
- version_requirements: *id016
171
+ prerelease: false
172
+ version_requirements: *2151627360
272
173
  description: A highly available, reliable messaging infrastructure
273
- email: developers@xing.com
274
- executables:
174
+ email: opensource@xing.com
175
+ executables:
275
176
  - beetle
276
177
  extensions: []
277
-
278
- extra_rdoc_files:
178
+ extra_rdoc_files:
279
179
  - examples/README.rdoc
280
180
  - features/README.rdoc
281
181
  - README.rdoc
282
182
  - REDIS_AUTO_FAILOVER.rdoc
283
183
  - RELEASE_NOTES.rdoc
284
184
  - MIT-LICENSE
285
- files:
185
+ files:
286
186
  - examples/attempts.rb
287
187
  - examples/handler_class.rb
288
188
  - examples/handling_exceptions.rb
@@ -311,6 +211,7 @@ files:
311
211
  - lib/beetle/redis_master_file.rb
312
212
  - lib/beetle/redis_server_info.rb
313
213
  - lib/beetle/subscriber.rb
214
+ - lib/beetle/version.rb
314
215
  - lib/beetle.rb
315
216
  - features/README.rdoc
316
217
  - features/redis_auto_failover.feature
@@ -353,40 +254,33 @@ files:
353
254
  has_rdoc: true
354
255
  homepage: http://xing.github.com/beetle/
355
256
  licenses: []
356
-
357
- 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"
358
- rdoc_options:
257
+ post_install_message: ! " *********************************************************************************************\n\n
258
+ \ Please install the SystemTimer gem if you're running a ruby version < 1.9:\n
259
+ \ `gem install SystemTimer -v '=1.2.1'`\n See: http://ph7spot.com/musings/system-timer\n\n
260
+ \ *********************************************************************************************\n"
261
+ rdoc_options:
359
262
  - --charset=UTF-8
360
- require_paths:
263
+ require_paths:
361
264
  - lib
362
- required_ruby_version: !ruby/object:Gem::Requirement
265
+ required_ruby_version: !ruby/object:Gem::Requirement
363
266
  none: false
364
- requirements:
365
- - - ">="
366
- - !ruby/object:Gem::Version
367
- hash: 3
368
- segments:
369
- - 0
370
- version: "0"
371
- required_rubygems_version: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - ! '>='
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
271
+ required_rubygems_version: !ruby/object:Gem::Requirement
372
272
  none: false
373
- requirements:
374
- - - ">="
375
- - !ruby/object:Gem::Version
376
- hash: 21
377
- segments:
378
- - 1
379
- - 3
380
- - 7
273
+ requirements:
274
+ - - ! '>='
275
+ - !ruby/object:Gem::Version
381
276
  version: 1.3.7
382
277
  requirements: []
383
-
384
278
  rubyforge_project:
385
279
  rubygems_version: 1.6.2
386
280
  signing_key:
387
281
  specification_version: 3
388
282
  summary: High Availability AMQP Messaging with Redundant Queues
389
- test_files:
283
+ test_files:
390
284
  - test/beetle/amqp_gem_behavior_test.rb
391
285
  - test/beetle/base_test.rb
392
286
  - test/beetle/client_test.rb