bunny 0.9.6 → 0.9.7

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7580b7ff949410f73fe0dd0d4425d19dd0b8b911
4
+ data.tar.gz: a6121f81e944a8765cb20ad27c2f2c9aecc38009
5
+ SHA512:
6
+ metadata.gz: a773f870cdaaec57396812d6120a10052e74468f939f9f587d807755330ac21940248e6166fd46c710969dff365e23eb927bac3cad95fc25e6c07fa66cf8e04a
7
+ data.tar.gz: 75a2d552c4748e98424f8ce156eb37465550329ffe078184ecdf7103132ce9c8fedf615c8b8048491af018f3ceea2ec4b5f8399107b2e28a427fc544f8175630
@@ -1,3 +1,21 @@
1
+ ## Changes between Bunny 0.9.6 and 0.9.7
2
+
3
+ ### Reentrant Mutex Implementation
4
+
5
+ Bunny now allows mutex impl to be configurable, uses reentrant Monitor
6
+ by default.
7
+
8
+ Non-reentrant mutexes is a major PITA and may affect code that
9
+ uses Bunny.
10
+
11
+ Avg. publishing throughput with Monitor drops slightly from
12
+ 5.73 Khz to 5.49 Khz (about 4% decrease), which is reasonable
13
+ for Bunny.
14
+
15
+ Apps that need these 4% can configure what mutex implementation
16
+ is used on per-connection basis.
17
+
18
+
1
19
  ## Changes between Bunny 0.9.5 and 0.9.6
2
20
 
3
21
  ### Eliminated Race Condition in Bunny::Session#close
@@ -1,5 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require "thread"
3
+ require "monitor"
3
4
  require "set"
4
5
 
5
6
  require "bunny/consumer_work_pool"
@@ -173,10 +174,10 @@ module Bunny
173
174
  @work_pool = work_pool
174
175
 
175
176
  # synchronizes frameset delivery. MK.
176
- @publishing_mutex = Mutex.new
177
- @consumer_mutex = Mutex.new
177
+ @publishing_mutex = @connection.mutex_impl.new
178
+ @consumer_mutex = @connection.mutex_impl.new
178
179
 
179
- @unconfirmed_set_mutex = Mutex.new
180
+ @unconfirmed_set_mutex = @connection.mutex_impl.new
180
181
 
181
182
  self.reset_continuations
182
183
 
@@ -1,4 +1,5 @@
1
1
  require "thread"
2
+ require "monitor"
2
3
  require "amq/int_allocator"
3
4
 
4
5
  module Bunny
@@ -18,7 +19,7 @@ module Bunny
18
19
  # @param [Integer] max_channel Max allowed channel id
19
20
  def initialize(max_channel = ((1 << 16) - 1))
20
21
  @allocator = AMQ::IntAllocator.new(1, max_channel)
21
- @mutex = Mutex.new
22
+ @mutex = Monitor.new
22
23
  end
23
24
 
24
25
 
@@ -1,4 +1,5 @@
1
1
  require "thread"
2
+ require "monitor"
2
3
 
3
4
  module Bunny
4
5
  # @private
@@ -14,7 +15,7 @@ module Bunny
14
15
 
15
16
 
16
17
  def initialize(description = nil)
17
- @mutex = Mutex.new
18
+ @mutex = Monitor.new
18
19
  @waiting_threads = []
19
20
  @description = description
20
21
  end
@@ -15,7 +15,7 @@ module Bunny
15
15
  def initialize(transport, logger)
16
16
  @transport = transport
17
17
  @logger = logger
18
- @mutex = Mutex.new
18
+ @mutex = Monitor.new
19
19
 
20
20
  @last_activity_time = Time.now
21
21
  end
@@ -83,7 +83,7 @@ module Bunny
83
83
  end
84
84
 
85
85
  def stopped?
86
- @stopped = true
86
+ @stopped
87
87
  end
88
88
 
89
89
  def kill
@@ -1,5 +1,6 @@
1
1
  require "socket"
2
2
  require "thread"
3
+ require "monitor"
3
4
 
4
5
  require "bunny/transport"
5
6
  require "bunny/channel_id_allocator"
@@ -144,11 +145,14 @@ module Bunny
144
145
  @mechanism = opts.fetch(:auth_mechanism, "PLAIN")
145
146
  @credentials_encoder = credentials_encoder_for(@mechanism)
146
147
  @locale = @opts.fetch(:locale, DEFAULT_LOCALE)
148
+
149
+ @mutex_impl = @opts.fetch(:mutex_impl, Monitor)
150
+
147
151
  # mutex for the channel id => channel hash
148
- @channel_mutex = Mutex.new
152
+ @channel_mutex = @mutex_impl.new
149
153
  # transport operations/continuations mutex. A workaround for
150
154
  # the non-reentrant Ruby mutexes. MK.
151
- @transport_mutex = Mutex.new
155
+ @transport_mutex = @mutex_impl.new
152
156
  @channels = Hash.new
153
157
 
154
158
  @origin_thread = Thread.current
@@ -186,6 +190,9 @@ module Bunny
186
190
  @threaded
187
191
  end
188
192
 
193
+ # @private
194
+ attr_reader :mutex_impl
195
+
189
196
  def configure_socket(&block)
190
197
  raise ArgumentError, "No block provided!" if block.nil?
191
198
 
@@ -1,5 +1,6 @@
1
1
  require "socket"
2
2
  require "thread"
3
+ require "monitor"
3
4
 
4
5
  begin
5
6
  require "openssl"
@@ -49,7 +50,7 @@ module Bunny
49
50
  @connect_timeout = nil if @connect_timeout == 0
50
51
  @disconnect_timeout = @read_write_timeout || @connect_timeout
51
52
 
52
- @writes_mutex = Mutex.new
53
+ @writes_mutex = @session.mutex_impl.new
53
54
 
54
55
  maybe_initialize_socket
55
56
  prepare_tls_context if @tls_enabled
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bunny
4
4
  # @return [String] Version of the library
5
- VERSION = "0.9.6"
5
+ VERSION = "0.9.7"
6
6
  end
@@ -1,15 +1,13 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Bunny::Session do
4
- 4000.times do |i|
5
- it "can be closed (take #{i})" do
6
- c = Bunny.new(:automatically_recover => false)
7
- c.start
8
- ch = c.create_channel
4
+ it "can be closed" do
5
+ c = Bunny.new(:automatically_recover => false)
6
+ c.start
7
+ ch = c.create_channel
9
8
 
10
- c.should be_connected
11
- c.stop
12
- c.should be_closed
13
- end
9
+ c.should be_connected
10
+ c.stop
11
+ c.should be_closed
14
12
  end
15
13
  end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ unless RUBY_ENGINE == "jruby"
4
+ describe Bunny::Session do
5
+ 4000.times do |i|
6
+ it "can be closed (take #{i})" do
7
+ c = Bunny.new(:automatically_recover => false)
8
+ c.start
9
+ ch = c.create_channel
10
+
11
+ c.should be_connected
12
+ c.stop
13
+ c.should be_closed
14
+ end
15
+ end
16
+ end
17
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bunny
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.6
5
- prerelease:
4
+ version: 0.9.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - Chris Duncan
@@ -13,36 +12,29 @@ authors:
13
12
  autorequire:
14
13
  bindir: bin
15
14
  cert_chain: []
16
- date: 2013-07-25 00:00:00.000000000 Z
15
+ date: 2013-07-26 00:00:00.000000000 Z
17
16
  dependencies:
18
17
  - !ruby/object:Gem::Dependency
19
18
  name: amq-protocol
20
19
  requirement: !ruby/object:Gem::Requirement
21
- none: false
22
20
  requirements:
23
- - - ! '>='
21
+ - - '>='
24
22
  - !ruby/object:Gem::Version
25
23
  version: 1.6.0
26
24
  type: :runtime
27
25
  prerelease: false
28
26
  version_requirements: !ruby/object:Gem::Requirement
29
- none: false
30
27
  requirements:
31
- - - ! '>='
28
+ - - '>='
32
29
  - !ruby/object:Gem::Version
33
30
  version: 1.6.0
34
31
  description: Easy to use, feature complete Ruby client for RabbitMQ 2.0.
35
32
  email:
36
- - !binary |-
37
- Y2VsbGRlZUBnbWFpbC5jb20=
38
- - !binary |-
39
- ZXJpY0A1c3RvcHMuY29t
40
- - !binary |-
41
- c3Rhc3RueUAxMDFpZGVhcy5jeg==
42
- - !binary |-
43
- bWljaGFlbEBub3ZlbWJlcmFpbi5jb20=
44
- - !binary |-
45
- c2thZXNAcmFpbHNleHByZXNzLmRl
33
+ - celldee@gmail.com
34
+ - eric@5stops.com
35
+ - stastny@101ideas.cz
36
+ - michael@novemberain.com
37
+ - skaes@railsexpress.de
46
38
  executables: []
47
39
  extensions: []
48
40
  extra_rdoc_files:
@@ -181,6 +173,7 @@ files:
181
173
  - spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb
182
174
  - spec/stress/concurrent_consumers_stress_spec.rb
183
175
  - spec/stress/concurrent_publishers_stress_spec.rb
176
+ - spec/stress/connection_open_close_spec.rb
184
177
  - spec/stress/long_running_consumer_spec.rb
185
178
  - spec/tls/cacert.pem
186
179
  - spec/tls/client_cert.pem
@@ -193,27 +186,26 @@ files:
193
186
  homepage: http://rubybunny.info
194
187
  licenses:
195
188
  - MIT
189
+ metadata: {}
196
190
  post_install_message:
197
191
  rdoc_options: []
198
192
  require_paths:
199
193
  - lib
200
194
  required_ruby_version: !ruby/object:Gem::Requirement
201
- none: false
202
195
  requirements:
203
- - - ! '>='
196
+ - - '>='
204
197
  - !ruby/object:Gem::Version
205
198
  version: '0'
206
199
  required_rubygems_version: !ruby/object:Gem::Requirement
207
- none: false
208
200
  requirements:
209
- - - ! '>='
201
+ - - '>='
210
202
  - !ruby/object:Gem::Version
211
203
  version: '0'
212
204
  requirements: []
213
205
  rubyforge_project:
214
- rubygems_version: 1.8.25
206
+ rubygems_version: 2.0.5
215
207
  signing_key:
216
- specification_version: 3
208
+ specification_version: 4
217
209
  summary: Popular easy to use Ruby client for RabbitMQ
218
210
  test_files:
219
211
  - spec/compatibility/queue_declare_spec.rb
@@ -269,6 +261,7 @@ test_files:
269
261
  - spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb
270
262
  - spec/stress/concurrent_consumers_stress_spec.rb
271
263
  - spec/stress/concurrent_publishers_stress_spec.rb
264
+ - spec/stress/connection_open_close_spec.rb
272
265
  - spec/stress/long_running_consumer_spec.rb
273
266
  - spec/tls/cacert.pem
274
267
  - spec/tls/client_cert.pem