bunny 2.9.2 → 2.10.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +12 -4
- data/ChangeLog.md +72 -6
- data/README.md +2 -2
- data/lib/bunny/channel.rb +11 -0
- data/lib/bunny/channel_id_allocator.rb +3 -1
- data/lib/bunny/cruby/ssl_socket.rb +1 -1
- data/lib/bunny/session.rb +16 -21
- data/lib/bunny/transport.rb +4 -0
- data/lib/bunny/version.rb +1 -1
- data/spec/higher_level_api/integration/tls_connection_spec.rb +3 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1383ed91ffd30856f2d5a7581dcc0c4110c072b
|
4
|
+
data.tar.gz: d90f995da1275458c90e2659a005aaa555a53300
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2de02f1c102d95da9137f4348f1e4897d2848cb2851f6fb51ebae28cf48b39c103c87b3faffc05b6b98db2482aab8c8a765204f9ce8d264ebe23feb34ba8913b
|
7
|
+
data.tar.gz: 3a1807d8219e9a006176ffeccba1120d5b3f6d237db750cfcd50ae7f5951d1481ffa90bec94dc700fc2f221aefe110da84910ab381a473ca7851ad127b6cacc3
|
data/.travis.yml
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
language: ruby
|
2
2
|
bundler_args: --without development
|
3
3
|
cache: bundler
|
4
|
+
before_install:
|
5
|
+
- gem install bundler
|
4
6
|
before_script: "./bin/ci/before_build"
|
5
7
|
script: "bundle exec rake integration_without_recovery"
|
6
8
|
rvm:
|
7
9
|
- ruby-head
|
8
|
-
- "2.
|
9
|
-
- "2.
|
10
|
-
- "2.
|
10
|
+
- "2.5.1"
|
11
|
+
- "2.4.2"
|
12
|
+
- "2.3.5"
|
13
|
+
- "2.2.8"
|
11
14
|
notifications:
|
12
15
|
email: michael@rabbitmq.com
|
13
16
|
services:
|
@@ -15,6 +18,11 @@ services:
|
|
15
18
|
branches:
|
16
19
|
only:
|
17
20
|
- master
|
18
|
-
- 2.
|
21
|
+
- 2.9.x-stable
|
22
|
+
- 2.8.x-stable
|
19
23
|
env:
|
20
24
|
- CI=true
|
25
|
+
matrix:
|
26
|
+
allow_failures:
|
27
|
+
rvm:
|
28
|
+
- ruby-head
|
data/ChangeLog.md
CHANGED
@@ -1,13 +1,68 @@
|
|
1
|
-
## Changes between Bunny 2.
|
1
|
+
## Changes between Bunny 2.10.0 and 2.11.0 (unreleased)
|
2
2
|
|
3
3
|
No changes yet.
|
4
4
|
|
5
5
|
|
6
|
-
## Changes between Bunny 2.9.0 and 2.
|
6
|
+
## Changes between Bunny 2.9.0 and 2.10.0 (Jun 5th, 2018)
|
7
7
|
|
8
|
-
|
8
|
+
`2.10.0` is a maintenance release that introduces a couple of
|
9
|
+
**minor potentially breaking changes**.
|
9
10
|
|
10
|
-
|
11
|
+
### Disabling Heartbeats Also Disables TCP Socket Read Timeouts
|
12
|
+
|
13
|
+
Disabling heartbeats will now disable TCP socket read timeouts.
|
14
|
+
|
15
|
+
They go hand in hand and users who prefer TCP keepalives via
|
16
|
+
kernel configuration previously had to also explicitly configure
|
17
|
+
a zero read timeout.
|
18
|
+
|
19
|
+
GitHub issue: [#551](https://github.com/ruby-amqp/bunny/pull/551).
|
20
|
+
|
21
|
+
Contributed by Carl Hörberg.
|
22
|
+
|
23
|
+
|
24
|
+
### `verify_peer: false` Has the Expected Effect Again
|
25
|
+
|
26
|
+
Make sure `verify_peer: false` has the expected effect again.
|
27
|
+
|
28
|
+
Default value of connection's `:verify_peer` option to `true` only when
|
29
|
+
all of `:verify_ssl`, `:verify_peer`, and `:verify` are `nil`.
|
30
|
+
|
31
|
+
GitHub issue: [#541](https://github.com/ruby-amqp/bunny/issues/541).
|
32
|
+
|
33
|
+
Contributed by Howard Ding.
|
34
|
+
|
35
|
+
|
36
|
+
### Maximum Number of Channels Limited to 2K by Default
|
37
|
+
|
38
|
+
Default maximum number of channels is limited to 2047 to reduce the probability
|
39
|
+
of severe channel leaks. See [rabbitmq/rabbitmq-server#1593](https://github.com/rabbitmq/rabbitmq-server/issues/1593) for details.
|
40
|
+
|
41
|
+
Applications that want to use more channels per connection can still configure a higher value
|
42
|
+
using the `channel_max` setting (for both Bunny and RabbitMQ server).
|
43
|
+
|
44
|
+
GitHub issue: [#553](https://github.com/ruby-amqp/bunny/pull/553).
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
### Squashed Some Warnings
|
49
|
+
|
50
|
+
GitHub issue: [#552](https://github.com/ruby-amqp/bunny/pull/552).
|
51
|
+
|
52
|
+
Contributed by @utilum.
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
### Disabling Heartbeats Disables TCP Socket Read Timeouts
|
57
|
+
|
58
|
+
Disabling heartbeats will also disable TCP socket read timeouts,
|
59
|
+
since the two are effectively interconnected. In this case a mechanism
|
60
|
+
such as [TCP keepalives](http://www.rabbitmq.com/heartbeats.html#tcp-keepalives) is assumed to be used.
|
61
|
+
|
62
|
+
See [RabbitMQ heartbeats guide](http://www.rabbitmq.com/heartbeats.html) for a more
|
63
|
+
detailed overview of the options.
|
64
|
+
|
65
|
+
GH issue: [#519](https://github.com/ruby-amqp/bunny/issues/519).
|
11
66
|
|
12
67
|
Contributed by Carl Hörberg.
|
13
68
|
|
@@ -19,12 +74,23 @@ Contributed by Carl Hörberg.
|
|
19
74
|
Bunny now requires Ruby 2.2.
|
20
75
|
|
21
76
|
|
22
|
-
###
|
77
|
+
### Connection Recovery Now Retries on Timeouts
|
78
|
+
|
79
|
+
Connection recovery now will retry on TCP connection timeouts.
|
80
|
+
|
81
|
+
GitHub issue: [#537](https://github.com/ruby-amqp/bunny/pull/537).
|
23
82
|
|
24
|
-
|
83
|
+
|
84
|
+
### More URI Query Parameters
|
85
|
+
|
86
|
+
Bunny now supports more URI query parameters plus aliases
|
87
|
+
that are identical to those of the server.
|
25
88
|
|
26
89
|
Contributed by Andrew Babichev.
|
27
90
|
|
91
|
+
GitHub issue: [#534](https://github.com/ruby-amqp/bunny/pull/534)
|
92
|
+
|
93
|
+
|
28
94
|
|
29
95
|
## Changes between Bunny 2.7.0 and 2.8.0 (Dec 18th, 2018)
|
30
96
|
|
data/README.md
CHANGED
@@ -48,7 +48,7 @@ Specific examples:
|
|
48
48
|
|
49
49
|
Modern Bunny versions support
|
50
50
|
|
51
|
-
* CRuby 2.
|
51
|
+
* CRuby 2.2 through 2.5 (inclusive)
|
52
52
|
|
53
53
|
Bunny works sufficiently well on JRuby but there are known
|
54
54
|
JRuby bugs in versions prior to JRuby 9000 that cause high CPU burn. JRuby users should
|
@@ -95,7 +95,7 @@ gem install bunny
|
|
95
95
|
To use Bunny in a project managed with Bundler:
|
96
96
|
|
97
97
|
``` ruby
|
98
|
-
gem "bunny", ">= 2.
|
98
|
+
gem "bunny", ">= 2.9.2"
|
99
99
|
```
|
100
100
|
|
101
101
|
|
data/lib/bunny/channel.rb
CHANGED
@@ -169,6 +169,17 @@ module Bunny
|
|
169
169
|
@connection = connection
|
170
170
|
@logger = connection.logger
|
171
171
|
@id = id || @connection.next_channel_id
|
172
|
+
|
173
|
+
# channel allocator is exhausted
|
174
|
+
if @id < 0
|
175
|
+
msg = "Cannot open a channel: max number of channels on connection reached. Connection channel_max value: #{@connection.channel_max}"
|
176
|
+
@logger.error(msg)
|
177
|
+
|
178
|
+
raise msg
|
179
|
+
else
|
180
|
+
@logger.debug { "Allocated channel id: #{@id}" }
|
181
|
+
end
|
182
|
+
|
172
183
|
@status = :opening
|
173
184
|
|
174
185
|
@connection.register_channel(self)
|
@@ -17,7 +17,9 @@ module Bunny
|
|
17
17
|
#
|
18
18
|
|
19
19
|
# @param [Integer] max_channel Max allowed channel id
|
20
|
-
def initialize(max_channel = ((1 <<
|
20
|
+
def initialize(max_channel = ((1 << 11) - 1))
|
21
|
+
# channel 0 has special meaning in the protocol, so start
|
22
|
+
# allocator at 1
|
21
23
|
@allocator = AMQ::IntAllocator.new(1, max_channel)
|
22
24
|
@mutex = Monitor.new
|
23
25
|
end
|
data/lib/bunny/session.rb
CHANGED
@@ -36,10 +36,10 @@ module Bunny
|
|
36
36
|
DEFAULT_HEARTBEAT = :server
|
37
37
|
# @private
|
38
38
|
DEFAULT_FRAME_MAX = 131072
|
39
|
-
#
|
39
|
+
# Hard limit the user cannot go over regardless of server configuration.
|
40
40
|
# @private
|
41
41
|
CHANNEL_MAX_LIMIT = 65535
|
42
|
-
DEFAULT_CHANNEL_MAX =
|
42
|
+
DEFAULT_CHANNEL_MAX = 2047
|
43
43
|
|
44
44
|
# backwards compatibility
|
45
45
|
# @private
|
@@ -101,7 +101,7 @@ module Bunny
|
|
101
101
|
# @option connection_string_or_opts [String] :username ("guest") Username
|
102
102
|
# @option connection_string_or_opts [String] :password ("guest") Password
|
103
103
|
# @option connection_string_or_opts [String] :vhost ("/") Virtual host to use
|
104
|
-
# @option connection_string_or_opts [Integer, Symbol] :heartbeat (:server) Heartbeat interval. :server means use the default suggested by RabbitMQ. 0 means
|
104
|
+
# @option connection_string_or_opts [Integer, Symbol] :heartbeat (:server) Heartbeat interval. :server means use the default suggested by RabbitMQ. 0 means heartbeats and socket read timeouts will be disabled (not recommended).
|
105
105
|
# @option connection_string_or_opts [Integer] :network_recovery_interval (4) Recovery interval periodic network recovery will use. This includes initial pause after network failure.
|
106
106
|
# @option connection_string_or_opts [Boolean] :tls (false) Should TLS/SSL be used?
|
107
107
|
# @option connection_string_or_opts [String] :tls_cert (nil) Path to client TLS/SSL certificate file (.pem)
|
@@ -109,9 +109,10 @@ module Bunny
|
|
109
109
|
# @option connection_string_or_opts [Array<String>] :tls_ca_certificates Array of paths to TLS/SSL CA files (.pem), by default detected from OpenSSL configuration
|
110
110
|
# @option connection_string_or_opts [String] :verify_peer (true) Whether TLS peer verification should be performed
|
111
111
|
# @option connection_string_or_opts [Symbol] :tls_version (negotiated) What TLS version should be used (:TLSv1, :TLSv1_1, or :TLSv1_2)
|
112
|
+
# @option connection_string_or_opts [Integer] :channel_max (2047) Maximum number of channels allowed on this connection, minus 1 to account for the special channel 0.
|
112
113
|
# @option connection_string_or_opts [Integer] :continuation_timeout (15000) Timeout for client operations that expect a response (e.g. {Bunny::Queue#get}), in milliseconds.
|
113
114
|
# @option connection_string_or_opts [Integer] :connection_timeout (30) Timeout in seconds for connecting to the server.
|
114
|
-
# @option connection_string_or_opts [Integer] :read_timeout (30) TCP socket read timeout in seconds.
|
115
|
+
# @option connection_string_or_opts [Integer] :read_timeout (30) TCP socket read timeout in seconds. If heartbeats are disabled this will be ignored.
|
115
116
|
# @option connection_string_or_opts [Integer] :write_timeout (30) TCP socket write timeout in seconds.
|
116
117
|
# @option connection_string_or_opts [Proc] :hosts_shuffle_strategy A Proc that reorders a list of host strings, defaults to Array#shuffle
|
117
118
|
# @option connection_string_or_opts [Logger] :logger The logger. If missing, one is created using :log_file and :log_level.
|
@@ -1068,7 +1069,9 @@ module Bunny
|
|
1068
1069
|
# threads publish on the same channel aggressively, at some point frames will be
|
1069
1070
|
# delivered out of order and broker will raise 505 UNEXPECTED_FRAME exception.
|
1070
1071
|
# If we synchronize on the channel, however, this is both thread safe and pretty fine-grained
|
1071
|
-
# locking. Note that "single frame" methods do not need this kind of synchronization
|
1072
|
+
# locking. Note that "single frame" methods technically do not need this kind of synchronization
|
1073
|
+
# (no incorrect frame interleaving of the same kind as with basic.publish isn't possible) but we
|
1074
|
+
# still recommend not sharing channels between threads except for consumer-only cases in the docs. MK.
|
1072
1075
|
channel.synchronize do
|
1073
1076
|
# see rabbitmq/rabbitmq-server#156
|
1074
1077
|
data = frames.reduce("") { |acc, frame| acc << frame.encode }
|
@@ -1087,7 +1090,7 @@ module Bunny
|
|
1087
1090
|
# threads publish on the same channel aggressively, at some point frames will be
|
1088
1091
|
# delivered out of order and broker will raise 505 UNEXPECTED_FRAME exception.
|
1089
1092
|
# If we synchronize on the channel, however, this is both thread safe and pretty fine-grained
|
1090
|
-
# locking.
|
1093
|
+
# locking. See a note about "single frame" methods in a comment in `send_frameset`. MK.
|
1091
1094
|
channel.synchronize do
|
1092
1095
|
frames.each { |frame| self.send_frame_without_timeout(frame, false) }
|
1093
1096
|
signal_activity!
|
@@ -1177,26 +1180,18 @@ module Bunny
|
|
1177
1180
|
@logger.debug { "Heartbeat interval negotiation: client = #{@client_heartbeat}, server = #{connection_tune.heartbeat}, result = #{@heartbeat}" }
|
1178
1181
|
@logger.info "Heartbeat interval used (in seconds): #{@heartbeat}"
|
1179
1182
|
|
1180
|
-
# We set the read_write_timeout to twice the heartbeat value
|
1183
|
+
# We set the read_write_timeout to twice the heartbeat value,
|
1184
|
+
# and then some padding for edge cases.
|
1181
1185
|
# This allows us to miss a single heartbeat before we time out the socket.
|
1182
|
-
#
|
1183
|
-
#
|
1184
|
-
|
1185
|
-
|
1186
|
-
@transport.read_timeout = if heartbeat_disabled?(@client_heartbeat) || heartbeat_disabled?(@heartbeat)
|
1187
|
-
@logger.debug { "Will use default socket read timeout of #{Transport::DEFAULT_READ_TIMEOUT}" }
|
1188
|
-
Transport::DEFAULT_READ_TIMEOUT
|
1189
|
-
else
|
1190
|
-
# pad to account for edge cases. MK.
|
1191
|
-
n = @heartbeat * 2.2
|
1192
|
-
@logger.debug { "Will use socket read timeout of #{n}" }
|
1193
|
-
n
|
1194
|
-
end
|
1195
|
-
|
1186
|
+
# If heartbeats are disabled, assume that TCP keepalives or a similar mechanism will be used
|
1187
|
+
# and disable socket read timeouts. See ruby-amqp/bunny#551.
|
1188
|
+
@transport.read_timeout = @heartbeat * 2.2
|
1189
|
+
@logger.debug { "Will use socket read timeout of #{@transport.read_timeout}" }
|
1196
1190
|
|
1197
1191
|
# if there are existing channels we've just recovered from
|
1198
1192
|
# a network failure and need to fix the allocated set. See issue 205. MK.
|
1199
1193
|
if @channels.empty?
|
1194
|
+
@logger.debug { "Initializing channel ID allocator with channel_max = #{@channel_max}" }
|
1200
1195
|
@channel_id_allocator = ChannelIdAllocator.new(@channel_max)
|
1201
1196
|
end
|
1202
1197
|
|
data/lib/bunny/transport.rb
CHANGED
@@ -29,6 +29,10 @@ module Bunny
|
|
29
29
|
attr_reader :tls_context, :verify_peer, :tls_ca_certificates, :tls_certificate_path, :tls_key_path
|
30
30
|
|
31
31
|
attr_writer :read_timeout
|
32
|
+
def read_timeout=(v)
|
33
|
+
@read_timeout = v
|
34
|
+
@read_timeout = nil if @read_timeout == 0
|
35
|
+
end
|
32
36
|
|
33
37
|
def initialize(session, host, port, opts)
|
34
38
|
@session = session
|
data/lib/bunny/version.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
|
+
require "socket"
|
5
|
+
|
4
6
|
unless ENV["CI"]
|
5
7
|
CERTIFICATE_DIR = ENV.fetch("BUNNY_CERTIFICATE_DIR", "./spec/tls")
|
6
8
|
puts "Will use certificates from #{CERTIFICATE_DIR}"
|
@@ -35,7 +37,7 @@ unless ENV["CI"]
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def local_hostname
|
38
|
-
ENV.fetch("BUNNY_RABBITMQ_HOSTNAME", "
|
40
|
+
ENV.fetch("BUNNY_RABBITMQ_HOSTNAME", "localhost")
|
39
41
|
end
|
40
42
|
|
41
43
|
context "initialized with :tls => true" do
|
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: 2.
|
4
|
+
version: 2.10.0
|
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: 2018-
|
15
|
+
date: 2018-06-05 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: amq-protocol
|
@@ -232,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
232
232
|
version: '0'
|
233
233
|
requirements: []
|
234
234
|
rubyforge_project:
|
235
|
-
rubygems_version: 2.6.
|
235
|
+
rubygems_version: 2.6.11
|
236
236
|
signing_key:
|
237
237
|
specification_version: 4
|
238
238
|
summary: Popular easy to use Ruby client for RabbitMQ
|