rdkafka 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 51ed7eebad223105fec15dadf53e133d90a57064
4
- data.tar.gz: 56112be8287c2be5bd5a5b6d9e92308e78ddbdce
2
+ SHA256:
3
+ metadata.gz: f2ca53e4caa266a4e9b4cd1fd5132626259629c1835c6923b8b5b252185884c5
4
+ data.tar.gz: d748f67df1abc442410de913a8b67b600264aeba55cef148ac01b0a7e863a7ce
5
5
  SHA512:
6
- metadata.gz: 48c97055bcef83b22669f8fdff05f29b425ae784bbf9d3efdc1d1e050d2f12fd805a30eca495c0ed9d665e0186f3672fac012874d0c73b403932c9e2b3435fb5
7
- data.tar.gz: 6ffcae7c68b5f27ff30230939049965d619b6ae044bbb713862d30f53ed3a3711b5a561fe4ec656be16b1f547fb513ed99aacb978f9716518d0c312499813c1a
6
+ metadata.gz: 65900548523763e0c448d8ceb8a08fdc96d8404fcef169db0724fc8ef50336a0bd4b50d622371eaf981ecc808d432c70b44b881a044903c7fa2f20bdacf23987
7
+ data.tar.gz: 8d157b0d6e3e82158c4c08c1bfed99e6ccb9c1d6ef287af81e20932c33adc82566a8df239fce2a227eea42b29f991b55499770ab85e87ca61b57afcc94b686d2
@@ -4,15 +4,17 @@ sudo: false
4
4
 
5
5
  env:
6
6
  global:
7
- - CC_TEST_REPORTER_ID=0af2487f1cc190d4a5e23cd76182514e5b62aac5d59b6208a02fd518487b9ed8
7
+ - CC_TEST_REPORTER_ID=9f7f740ac1b6e264e1189fa07a6687a87bcdb9f3c0f4199d4344ab3b538e187e
8
8
 
9
9
  rvm:
10
10
  - 2.1
11
11
  - 2.2
12
12
  - 2.3
13
13
  - 2.4
14
+ - 2.5
14
15
 
15
16
  before_install:
17
+ - gem update --system
16
18
  - wget http://www.us.apache.org/dist/kafka/1.0.0/kafka_2.12-1.0.0.tgz -O kafka.tgz
17
19
  - mkdir -p kafka && tar xzf kafka.tgz -C kafka --strip-components 1
18
20
  - nohup bash -c "cd kafka && bin/zookeeper-server-start.sh config/zookeeper.properties &"
@@ -30,3 +32,4 @@ script:
30
32
 
31
33
  after_script:
32
34
  - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
35
+ - killall -9 java
@@ -1,3 +1,7 @@
1
+ # 0.3.5
2
+ * Fix crash when not waiting for delivery handles
3
+ * Run specs on Ruby 2.5
4
+
1
5
  # 0.3.4
2
6
  * Bump librdkafka to 0.11.3
3
7
 
@@ -154,11 +154,13 @@ module Rdkafka
154
154
  :void, [:pointer, :pointer, :pointer]
155
155
  ) do |client_ptr, message_ptr, opaque_ptr|
156
156
  message = Message.new(message_ptr)
157
- delivery_handle = Rdkafka::Producer::DeliveryHandle.new(message[:_private])
158
- delivery_handle[:pending] = false
159
- delivery_handle[:response] = message[:err]
160
- delivery_handle[:partition] = message[:partition]
161
- delivery_handle[:offset] = message[:offset]
157
+ delivery_handle_ptr_address = message[:_private].address
158
+ if delivery_handle = Rdkafka::Producer::DeliveryHandle.remove(delivery_handle_ptr_address)
159
+ delivery_handle[:pending] = false
160
+ delivery_handle[:response] = message[:err]
161
+ delivery_handle[:partition] = message[:partition]
162
+ delivery_handle[:offset] = message[:offset]
163
+ end
162
164
  end
163
165
  end
164
166
  end
@@ -69,6 +69,7 @@ module Rdkafka
69
69
  delivery_handle[:response] = -1
70
70
  delivery_handle[:partition] = -1
71
71
  delivery_handle[:offset] = -1
72
+ DeliveryHandle.register(delivery_handle.to_ptr.address, delivery_handle)
72
73
 
73
74
  # Produce the message
74
75
  response = Rdkafka::Bindings.rd_kafka_producev(
@@ -85,6 +86,7 @@ module Rdkafka
85
86
 
86
87
  # Raise error if the produce call was not successfull
87
88
  if response != 0
89
+ DeliveryHandle.remove(delivery_handle.to_ptr.address)
88
90
  raise RdkafkaError.new(response)
89
91
  end
90
92
 
@@ -8,6 +8,16 @@ module Rdkafka
8
8
  :partition, :int,
9
9
  :offset, :int64
10
10
 
11
+ REGISTRY = {}
12
+
13
+ def self.register(address, handle)
14
+ REGISTRY[address] = handle
15
+ end
16
+
17
+ def self.remove(address)
18
+ REGISTRY.delete(address)
19
+ end
20
+
11
21
  # Whether the delivery handle is still pending.
12
22
  #
13
23
  # @return [Boolean]
@@ -1,4 +1,4 @@
1
1
  module Rdkafka
2
- VERSION = "0.3.4"
2
+ VERSION = "0.3.5"
3
3
  LIBRDKAFKA_VERSION = "0.11.3"
4
4
  end
@@ -2,18 +2,30 @@ require "spec_helper"
2
2
 
3
3
  describe Rdkafka::Producer::DeliveryHandle do
4
4
  let(:response) { 0 }
5
+
5
6
  subject do
6
7
  Rdkafka::Producer::DeliveryHandle.new.tap do |handle|
7
- handle[:pending] = pending
8
+ handle[:pending] = pending_handle
8
9
  handle[:response] = response
9
10
  handle[:partition] = 2
10
11
  handle[:offset] = 100
11
12
  end
12
13
  end
13
14
 
15
+ describe ".register and .remove" do
16
+ let(:pending_handle) { true }
17
+
18
+ it "should register and remove a delivery handle" do
19
+ Rdkafka::Producer::DeliveryHandle.register(subject.to_ptr.address, subject)
20
+ removed = Rdkafka::Producer::DeliveryHandle.remove(subject.to_ptr.address)
21
+ expect(removed).to eq subject
22
+ expect(Rdkafka::Producer::DeliveryHandle::REGISTRY).to be_empty
23
+ end
24
+ end
25
+
14
26
  describe "#pending?" do
15
27
  context "when true" do
16
- let(:pending) { true }
28
+ let(:pending_handle) { true }
17
29
 
18
30
  it "should be true" do
19
31
  expect(subject.pending?).to be true
@@ -21,7 +33,7 @@ describe Rdkafka::Producer::DeliveryHandle do
21
33
  end
22
34
 
23
35
  context "when not true" do
24
- let(:pending) { false }
36
+ let(:pending_handle) { false }
25
37
 
26
38
  it "should be false" do
27
39
  expect(subject.pending?).to be false
@@ -30,7 +42,7 @@ describe Rdkafka::Producer::DeliveryHandle do
30
42
  end
31
43
 
32
44
  describe "#wait" do
33
- let(:pending) { true }
45
+ let(:pending_handle) { true }
34
46
 
35
47
  it "should wait until the timeout and then raise an error" do
36
48
  expect {
@@ -39,7 +51,7 @@ describe Rdkafka::Producer::DeliveryHandle do
39
51
  end
40
52
 
41
53
  context "when not pending anymore and no error" do
42
- let(:pending) { false }
54
+ let(:pending_handle) { false }
43
55
 
44
56
  it "should return a delivery report" do
45
57
  report = subject.wait
@@ -57,7 +69,7 @@ describe Rdkafka::Producer::DeliveryHandle do
57
69
  end
58
70
 
59
71
  context "when not pending anymore and there was an error" do
60
- let(:pending) { false }
72
+ let(:pending_handle) { false }
61
73
  let(:response) { 20 }
62
74
 
63
75
  it "should raise an rdkafka error" do
@@ -3,6 +3,11 @@ require "spec_helper"
3
3
  describe Rdkafka::Producer do
4
4
  let(:producer) { rdkafka_config.producer }
5
5
 
6
+ after do
7
+ # Registry should always end up being empty
8
+ expect(Rdkafka::Producer::DeliveryHandle::REGISTRY).to be_empty
9
+ end
10
+
6
11
  it "should require a topic" do
7
12
  expect {
8
13
  producer.produce(
@@ -138,6 +143,27 @@ describe Rdkafka::Producer do
138
143
  expect(message.payload).to be_nil
139
144
  end
140
145
 
146
+ it "should produce message that aren't waited for and not crash" do
147
+ 5.times do
148
+ 200.times do
149
+ producer.produce(
150
+ topic: "produce_test_topic",
151
+ payload: "payload not waiting",
152
+ key: "key not waiting"
153
+ )
154
+ end
155
+
156
+ # Allow some time for a GC run
157
+ sleep 1
158
+ end
159
+
160
+ # Wait for the delivery notifications
161
+ 10.times do
162
+ break if Rdkafka::Producer::DeliveryHandle::REGISTRY.empty?
163
+ sleep 1
164
+ end
165
+ end
166
+
141
167
  it "should raise an error when producing fails" do
142
168
  expect(Rdkafka::Bindings).to receive(:rd_kafka_producev).and_return(20)
143
169
 
@@ -158,5 +184,8 @@ describe Rdkafka::Producer do
158
184
  expect {
159
185
  handle.wait(0)
160
186
  }.to raise_error Rdkafka::Producer::DeliveryHandle::WaitTimeoutError
187
+
188
+ # Waiting a second time should work
189
+ handle.wait(5)
161
190
  end
162
191
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdkafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thijs Cadier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-05 00:00:00.000000000 Z
11
+ date: 2018-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
155
  version: '0'
156
156
  requirements: []
157
157
  rubyforge_project:
158
- rubygems_version: 2.6.13
158
+ rubygems_version: 2.7.3
159
159
  signing_key:
160
160
  specification_version: 4
161
161
  summary: Kafka client library wrapping librdkafka using the ffi gem and futures from