bunny 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.md +44 -0
- data/bunny.gemspec +1 -1
- data/lib/bunny/channel.rb +2 -2
- data/lib/bunny/exceptions.rb +12 -0
- data/lib/bunny/session.rb +48 -3
- data/lib/bunny/version.rb +1 -1
- data/spec/higher_level_api/integration/connection_spec.rb +19 -0
- data/spec/higher_level_api/integration/publisher_confirms_spec.rb +36 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8837b72e1a3b2ce162fc168eb298bcc9089f1d1
|
4
|
+
data.tar.gz: 22a780ffdeff22a180470071ab8c90da2ef0ed81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35bb0e4f3cc1dbd35d1fe9e135059b695f2fde65f188265a685d35c11ecad0460409215235ff3b108474e0a6304cca1f00a43d477ca129f4c1f3ea0d50615e33
|
7
|
+
data.tar.gz: aa3ee730eb9f096e0f9268e3187741752f80877a5bea078039133ae830a83e177c435120f369953b122bb8c6bdb7250cf81a167675f1b6d8e22b1e74c9e0b466
|
data/ChangeLog.md
CHANGED
@@ -1,3 +1,47 @@
|
|
1
|
+
## Changes between Bunny 1.0.4 and 1.0.5
|
2
|
+
|
3
|
+
### Single Threaded Mode Fixes
|
4
|
+
|
5
|
+
Single threaded mode no longer fails with
|
6
|
+
|
7
|
+
```
|
8
|
+
undefined method `event_loop'
|
9
|
+
```
|
10
|
+
|
11
|
+
### connection.tune.channel_max No Longer Overflows
|
12
|
+
|
13
|
+
`connection.tune.channel_max` could previously be configured to values
|
14
|
+
greater than 2^16 - 1 (65535). This would result in a silent overflow
|
15
|
+
during serialization. The issue was harmless in practice but is still
|
16
|
+
a bug that can be quite confusing.
|
17
|
+
|
18
|
+
Bunny now caps max number of channels to 65535. This allows it to be
|
19
|
+
forward compatible with future RabbitMQ versions that may allow limiting
|
20
|
+
total # of open channels via server configuration.
|
21
|
+
|
22
|
+
### Thread Leaks Fixes
|
23
|
+
|
24
|
+
Bunny will now correctly release heartbeat sender when allocating
|
25
|
+
a new one (usually happens only when connection recovers from a network
|
26
|
+
failure).
|
27
|
+
|
28
|
+
### amq-protocol Update
|
29
|
+
|
30
|
+
Minimum `amq-protocol` version is now `1.9.0` which includes
|
31
|
+
bug fixes and performance improvements for channel ID allocator.
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
## Changes between Bunny 1.0.3 and 1.0.4
|
36
|
+
|
37
|
+
### Versioned Delivery Tag Fix
|
38
|
+
|
39
|
+
Versioned delivery tag now ensures all the arguments it operates
|
40
|
+
(original delivery tag, atomic fixnum instances, etc) are coerced to `Integer`
|
41
|
+
before comparison.
|
42
|
+
|
43
|
+
GitHub issues: #171.
|
44
|
+
|
1
45
|
## Changes between Bunny 1.0.2 and 1.0.3
|
2
46
|
|
3
47
|
### Eliminated Errouneous Debug Statement
|
data/bunny.gemspec
CHANGED
data/lib/bunny/channel.rb
CHANGED
@@ -1681,7 +1681,7 @@ module Bunny
|
|
1681
1681
|
@threads_waiting_on_basic_get_continuations.delete(t)
|
1682
1682
|
end
|
1683
1683
|
else
|
1684
|
-
connection.
|
1684
|
+
connection.reader_loop.run_once until @basic_get_continuations.length > 0
|
1685
1685
|
|
1686
1686
|
@basic_get_continuations.pop
|
1687
1687
|
end
|
@@ -1699,7 +1699,7 @@ module Bunny
|
|
1699
1699
|
@threads_waiting_on_confirms_continuations.delete(t)
|
1700
1700
|
end
|
1701
1701
|
else
|
1702
|
-
connection.
|
1702
|
+
connection.reader_loop.run_once until @confirms_continuations.length > 0
|
1703
1703
|
|
1704
1704
|
@confirms_continuations.pop
|
1705
1705
|
end
|
data/lib/bunny/exceptions.rb
CHANGED
@@ -42,6 +42,18 @@ module Bunny
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
# Can indicate either a channel or connection-level issue
|
46
|
+
class NotAllowedError < Exception
|
47
|
+
attr_reader :connection, :connection_close
|
48
|
+
|
49
|
+
def initialize(message, connection, connection_close = nil)
|
50
|
+
super(message)
|
51
|
+
|
52
|
+
@connection = connection
|
53
|
+
@connection_close = connection_close
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
45
57
|
|
46
58
|
# Raised when TCP connection to RabbitMQ fails because of an unresolved
|
47
59
|
# hostname, connectivity problem, etc
|
data/lib/bunny/session.rb
CHANGED
@@ -36,6 +36,10 @@ module Bunny
|
|
36
36
|
DEFAULT_HEARTBEAT = :server
|
37
37
|
# @private
|
38
38
|
DEFAULT_FRAME_MAX = 131072
|
39
|
+
# 2^16 - 1, maximum representable signed 16 bit integer.
|
40
|
+
# @private
|
41
|
+
CHANNEL_MAX_LIMIT = 65535
|
42
|
+
DEFAULT_CHANNEL_MAX = CHANNEL_MAX_LIMIT
|
39
43
|
|
40
44
|
# backwards compatibility
|
41
45
|
# @private
|
@@ -78,7 +82,7 @@ module Bunny
|
|
78
82
|
|
79
83
|
# @return [Bunny::Transport]
|
80
84
|
attr_reader :transport
|
81
|
-
attr_reader :status, :host, :port, :heartbeat, :user, :pass, :vhost, :frame_max, :threaded
|
85
|
+
attr_reader :status, :host, :port, :heartbeat, :user, :pass, :vhost, :frame_max, :channel_max, :threaded
|
82
86
|
attr_reader :server_capabilities, :server_properties, :server_authentication_mechanisms, :server_locales
|
83
87
|
attr_reader :default_channel
|
84
88
|
attr_reader :channel_id_allocator
|
@@ -149,7 +153,9 @@ module Bunny
|
|
149
153
|
|
150
154
|
# these are negotiated with the broker during the connection tuning phase
|
151
155
|
@client_frame_max = opts.fetch(:frame_max, DEFAULT_FRAME_MAX)
|
152
|
-
@client_channel_max = opts.fetch(:channel_max,
|
156
|
+
@client_channel_max = normalize_client_channel_max(opts.fetch(:channel_max, DEFAULT_CHANNEL_MAX))
|
157
|
+
# will be-renegotiated during connection tuning steps. MK.
|
158
|
+
@channel_max = @client_channel_max
|
153
159
|
@client_heartbeat = self.heartbeat_from(opts)
|
154
160
|
|
155
161
|
@client_properties = opts[:properties] || DEFAULT_CLIENT_PROPERTIES
|
@@ -646,6 +652,8 @@ module Bunny
|
|
646
652
|
UnexpectedFrame
|
647
653
|
when 506 then
|
648
654
|
ResourceError
|
655
|
+
when 530 then
|
656
|
+
NotAllowedError
|
649
657
|
when 541 then
|
650
658
|
InternalError
|
651
659
|
else
|
@@ -937,7 +945,25 @@ module Bunny
|
|
937
945
|
initialize_heartbeat_sender
|
938
946
|
end
|
939
947
|
|
940
|
-
|
948
|
+
unless connection_open_ok.is_a?(AMQ::Protocol::Connection::OpenOk)
|
949
|
+
if connection_open_ok.is_a?(AMQ::Protocol::Connection::Close)
|
950
|
+
e = instantiate_connection_level_exception(connection_open_ok)
|
951
|
+
begin
|
952
|
+
shut_down_all_consumer_work_pools!
|
953
|
+
maybe_shutdown_reader_loop
|
954
|
+
rescue ShutdownSignal => sse
|
955
|
+
# no-op
|
956
|
+
rescue Exception => e
|
957
|
+
@logger.warn "Caught an exception when cleaning up after receiving connection.close: #{e.message}"
|
958
|
+
ensure
|
959
|
+
close_transport
|
960
|
+
end
|
961
|
+
|
962
|
+
@origin_thread.raise(e)
|
963
|
+
else
|
964
|
+
raise "could not open connection: server did not respond with connection.open-ok but #{connection_open_ok.inspect} instead"
|
965
|
+
end
|
966
|
+
end
|
941
967
|
end
|
942
968
|
|
943
969
|
def heartbeat_disabled?(val)
|
@@ -957,6 +983,7 @@ module Bunny
|
|
957
983
|
|
958
984
|
# @private
|
959
985
|
def initialize_heartbeat_sender
|
986
|
+
maybe_shutdown_heartbeat_sender
|
960
987
|
@logger.debug "Initializing heartbeat sender..."
|
961
988
|
@heartbeat_sender = HeartbeatSender.new(@transport, @logger)
|
962
989
|
@heartbeat_sender.start(@heartbeat)
|
@@ -1037,6 +1064,24 @@ module Bunny
|
|
1037
1064
|
Logger::WARN
|
1038
1065
|
end
|
1039
1066
|
end
|
1067
|
+
|
1068
|
+
# @private
|
1069
|
+
def shut_down_all_consumer_work_pools!
|
1070
|
+
@channels.each do |_, ch|
|
1071
|
+
ch.maybe_kill_consumer_work_pool!
|
1072
|
+
end
|
1073
|
+
end
|
1074
|
+
|
1075
|
+
def normalize_client_channel_max(n)
|
1076
|
+
return CHANNEL_MAX_LIMIT if n > CHANNEL_MAX_LIMIT
|
1077
|
+
|
1078
|
+
case n
|
1079
|
+
when 0 then
|
1080
|
+
CHANNEL_MAX_LIMIT
|
1081
|
+
else
|
1082
|
+
n
|
1083
|
+
end
|
1084
|
+
end
|
1040
1085
|
end # Session
|
1041
1086
|
|
1042
1087
|
# backwards compatibility
|
data/lib/bunny/version.rb
CHANGED
@@ -147,6 +147,25 @@ describe Bunny::Session do
|
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
+
context "initialized with :channel_max => 4096" do
|
151
|
+
after :each do
|
152
|
+
subject.close if subject.open?
|
153
|
+
end
|
154
|
+
|
155
|
+
let(:channel_max) { 1024 }
|
156
|
+
let(:subject) { described_class.new(:channel_max => channel_max) }
|
157
|
+
|
158
|
+
# this assumes RabbitMQ has no lower value configured. In 3.2
|
159
|
+
# it is 0 (no limit) by default and 1024 is still a fairly low value
|
160
|
+
# for future releases. MK.
|
161
|
+
it "negotiates channel max to be 1024" do
|
162
|
+
subject.start
|
163
|
+
subject.channel_max.should == channel_max
|
164
|
+
|
165
|
+
subject.close
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
150
169
|
context "initialized with :ssl => true" do
|
151
170
|
let(:subject) do
|
152
171
|
described_class.new(:user => "bunny_gem",
|
@@ -38,4 +38,40 @@ describe Bunny::Channel do
|
|
38
38
|
ch.close
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
|
43
|
+
context "with a single-threaded connection" do
|
44
|
+
let(:connection) do
|
45
|
+
c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :continuation_timeout => 10000, :threaded => false)
|
46
|
+
c.start
|
47
|
+
c
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
context "when publishing with confirms enabled" do
|
52
|
+
it "increments delivery index" do
|
53
|
+
ch = connection.create_channel
|
54
|
+
ch.should_not be_using_publisher_confirmations
|
55
|
+
|
56
|
+
ch.confirm_select
|
57
|
+
ch.should be_using_publisher_confirmations
|
58
|
+
|
59
|
+
q = ch.queue("", :exclusive => true)
|
60
|
+
x = ch.default_exchange
|
61
|
+
|
62
|
+
n.times do
|
63
|
+
x.publish("xyzzy", :routing_key => q.name)
|
64
|
+
end
|
65
|
+
|
66
|
+
ch.next_publish_seq_no.should == n + 1
|
67
|
+
ch.wait_for_confirms.should be_true
|
68
|
+
sleep 0.25
|
69
|
+
|
70
|
+
q.message_count.should == n
|
71
|
+
q.purge
|
72
|
+
|
73
|
+
ch.close
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
41
77
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bunny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Duncan
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-11-
|
15
|
+
date: 2013-11-26 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: amq-protocol
|
@@ -20,14 +20,14 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - '>='
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.
|
23
|
+
version: 1.9.0
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
28
|
- - '>='
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version: 1.
|
30
|
+
version: 1.9.0
|
31
31
|
description: Easy to use, feature complete Ruby client for RabbitMQ 2.0 and later
|
32
32
|
versions.
|
33
33
|
email:
|
@@ -224,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
224
|
version: '0'
|
225
225
|
requirements: []
|
226
226
|
rubyforge_project:
|
227
|
-
rubygems_version: 2.1.
|
227
|
+
rubygems_version: 2.1.11
|
228
228
|
signing_key:
|
229
229
|
specification_version: 4
|
230
230
|
summary: Popular easy to use Ruby client for RabbitMQ
|