rdkafka 0.12.0 → 0.13.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.semaphore/semaphore.yml +6 -2
  3. data/CHANGELOG.md +12 -0
  4. data/Gemfile +2 -0
  5. data/Rakefile +2 -0
  6. data/ext/Rakefile +2 -0
  7. data/lib/rdkafka/abstract_handle.rb +2 -0
  8. data/lib/rdkafka/admin/create_topic_handle.rb +2 -0
  9. data/lib/rdkafka/admin/create_topic_report.rb +2 -0
  10. data/lib/rdkafka/admin/delete_topic_handle.rb +2 -0
  11. data/lib/rdkafka/admin/delete_topic_report.rb +2 -0
  12. data/lib/rdkafka/admin.rb +40 -35
  13. data/lib/rdkafka/bindings.rb +22 -6
  14. data/lib/rdkafka/callbacks.rb +7 -1
  15. data/lib/rdkafka/config.rb +9 -6
  16. data/lib/rdkafka/consumer/headers.rb +24 -7
  17. data/lib/rdkafka/consumer/message.rb +3 -1
  18. data/lib/rdkafka/consumer/partition.rb +2 -0
  19. data/lib/rdkafka/consumer/topic_partition_list.rb +2 -0
  20. data/lib/rdkafka/consumer.rb +37 -29
  21. data/lib/rdkafka/error.rb +9 -0
  22. data/lib/rdkafka/metadata.rb +2 -0
  23. data/lib/rdkafka/native_kafka.rb +62 -0
  24. data/lib/rdkafka/producer/delivery_handle.rb +5 -2
  25. data/lib/rdkafka/producer/delivery_report.rb +9 -2
  26. data/lib/rdkafka/producer.rb +23 -10
  27. data/lib/rdkafka/version.rb +5 -3
  28. data/lib/rdkafka.rb +3 -1
  29. data/rdkafka.gemspec +2 -0
  30. data/spec/rdkafka/abstract_handle_spec.rb +2 -0
  31. data/spec/rdkafka/admin/create_topic_handle_spec.rb +2 -0
  32. data/spec/rdkafka/admin/create_topic_report_spec.rb +2 -0
  33. data/spec/rdkafka/admin/delete_topic_handle_spec.rb +2 -0
  34. data/spec/rdkafka/admin/delete_topic_report_spec.rb +2 -0
  35. data/spec/rdkafka/admin_spec.rb +4 -3
  36. data/spec/rdkafka/bindings_spec.rb +2 -0
  37. data/spec/rdkafka/callbacks_spec.rb +2 -0
  38. data/spec/rdkafka/config_spec.rb +14 -0
  39. data/spec/rdkafka/consumer/headers_spec.rb +62 -0
  40. data/spec/rdkafka/consumer/message_spec.rb +3 -1
  41. data/spec/rdkafka/consumer/partition_spec.rb +2 -0
  42. data/spec/rdkafka/consumer/topic_partition_list_spec.rb +2 -0
  43. data/spec/rdkafka/consumer_spec.rb +84 -15
  44. data/spec/rdkafka/error_spec.rb +2 -0
  45. data/spec/rdkafka/metadata_spec.rb +3 -1
  46. data/spec/rdkafka/{producer/client_spec.rb → native_kafka_spec.rb} +22 -10
  47. data/spec/rdkafka/producer/delivery_handle_spec.rb +5 -0
  48. data/spec/rdkafka/producer/delivery_report_spec.rb +8 -2
  49. data/spec/rdkafka/producer_spec.rb +51 -19
  50. data/spec/spec_helper.rb +16 -0
  51. metadata +13 -11
  52. data/lib/rdkafka/producer/client.rb +0 -47
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
  require "ostruct"
3
5
  require 'securerandom'
@@ -593,7 +595,7 @@ describe Rdkafka::Consumer do
593
595
  end
594
596
 
595
597
  describe "#poll with headers" do
596
- it "should return message with headers" do
598
+ it "should return message with headers using string keys (when produced with symbol keys)" do
597
599
  report = producer.produce(
598
600
  topic: "consume_test_topic",
599
601
  key: "key headers",
@@ -603,7 +605,20 @@ describe Rdkafka::Consumer do
603
605
  message = wait_for_message(topic: "consume_test_topic", consumer: consumer, delivery_report: report)
604
606
  expect(message).to be
605
607
  expect(message.key).to eq('key headers')
606
- expect(message.headers).to include(foo: 'bar')
608
+ expect(message.headers).to include('foo' => 'bar')
609
+ end
610
+
611
+ it "should return message with headers using string keys (when produced with string keys)" do
612
+ report = producer.produce(
613
+ topic: "consume_test_topic",
614
+ key: "key headers",
615
+ headers: { 'foo' => 'bar' }
616
+ ).wait
617
+
618
+ message = wait_for_message(topic: "consume_test_topic", consumer: consumer, delivery_report: report)
619
+ expect(message).to be
620
+ expect(message.key).to eq('key headers')
621
+ expect(message.headers).to include('foo' => 'bar')
607
622
  end
608
623
 
609
624
  it "should return message with no headers" do
@@ -698,7 +713,7 @@ describe Rdkafka::Consumer do
698
713
  n.times do |i|
699
714
  handles << producer.produce(
700
715
  topic: topic_name,
701
- payload: Time.new.to_f.to_s,
716
+ payload: i % 10 == 0 ? nil : Time.new.to_f.to_s,
702
717
  key: i.to_s,
703
718
  partition: 0
704
719
  )
@@ -962,18 +977,6 @@ describe Rdkafka::Consumer do
962
977
  expect(listener.queue).to eq([:assigned, :revoked])
963
978
  end
964
979
  end
965
-
966
- def notify_listener(listener)
967
- # 1. subscribe and poll
968
- consumer.subscribe("consume_test_topic")
969
- wait_for_assignment(consumer)
970
- consumer.poll(100)
971
-
972
- # 2. unsubscribe
973
- consumer.unsubscribe
974
- wait_for_unassignment(consumer)
975
- consumer.close
976
- end
977
980
  end
978
981
 
979
982
  context "methods that should not be called after a consumer has been closed" do
@@ -1005,4 +1008,70 @@ describe Rdkafka::Consumer do
1005
1008
  end
1006
1009
  end
1007
1010
  end
1011
+
1012
+ it "provides a finalizer that closes the native kafka client" do
1013
+ expect(consumer.closed?).to eq(false)
1014
+
1015
+ consumer.finalizer.call("some-ignored-object-id")
1016
+
1017
+ expect(consumer.closed?).to eq(true)
1018
+ end
1019
+
1020
+ context "when the rebalance protocol is cooperative" do
1021
+ let(:consumer) do
1022
+ config = rdkafka_consumer_config(
1023
+ {
1024
+ :"partition.assignment.strategy" => "cooperative-sticky",
1025
+ :"debug" => "consumer",
1026
+ }
1027
+ )
1028
+ config.consumer_rebalance_listener = listener
1029
+ config.consumer
1030
+ end
1031
+
1032
+ let(:listener) do
1033
+ Struct.new(:queue) do
1034
+ def on_partitions_assigned(consumer, list)
1035
+ collect(:assign, list)
1036
+ end
1037
+
1038
+ def on_partitions_revoked(consumer, list)
1039
+ collect(:revoke, list)
1040
+ end
1041
+
1042
+ def collect(name, list)
1043
+ partitions = list.to_h.map { |key, values| [key, values.map(&:partition)] }.flatten
1044
+ queue << ([name] + partitions)
1045
+ end
1046
+ end.new([])
1047
+ end
1048
+
1049
+ it "should be able to assign and unassign partitions using the cooperative partition assignment APIs" do
1050
+ notify_listener(listener) do
1051
+ handles = []
1052
+ 10.times do
1053
+ handles << producer.produce(
1054
+ topic: "consume_test_topic",
1055
+ payload: "payload 1",
1056
+ key: "key 1",
1057
+ partition: 0
1058
+ )
1059
+ end
1060
+ handles.each(&:wait)
1061
+
1062
+ consumer.subscribe("consume_test_topic")
1063
+ # Check the first 10 messages. Then close the consumer, which
1064
+ # should break the each loop.
1065
+ consumer.each_with_index do |message, i|
1066
+ expect(message).to be_a Rdkafka::Consumer::Message
1067
+ break if i == 10
1068
+ end
1069
+ end
1070
+
1071
+ expect(listener.queue).to eq([
1072
+ [:assign, "consume_test_topic", 0, 1, 2],
1073
+ [:revoke, "consume_test_topic", 0, 1, 2]
1074
+ ])
1075
+ end
1076
+ end
1008
1077
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Rdkafka::RdkafkaError do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
  require "securerandom"
3
5
 
@@ -8,7 +10,7 @@ describe Rdkafka::Metadata do
8
10
 
9
11
  after do
10
12
  Rdkafka::Bindings.rd_kafka_consumer_close(native_kafka)
11
- Rdkafka::Bindings.rd_kafka_destroy(native_kafka)
13
+ Rdkafka::Bindings.rd_kafka_destroy_flags(native_kafka, Rdkafka::Bindings::RD_KAFKA_DESTROY_F_IMMEDIATE)
12
14
  end
13
15
 
14
16
  context "passing in a topic name" do
@@ -1,17 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
- describe Rdkafka::Producer::Client do
5
+ describe Rdkafka::NativeKafka do
4
6
  let(:config) { rdkafka_producer_config }
5
7
  let(:native) { config.send(:native_kafka, config.send(:native_config), :rd_kafka_producer) }
6
8
  let(:closing) { false }
7
9
  let(:thread) { double(Thread) }
8
10
 
9
- subject(:client) { described_class.new(native) }
11
+ subject(:client) { described_class.new(native, run_polling_thread: true) }
10
12
 
11
13
  before do
12
14
  allow(Rdkafka::Bindings).to receive(:rd_kafka_poll).with(instance_of(FFI::Pointer), 250).and_call_original
13
15
  allow(Rdkafka::Bindings).to receive(:rd_kafka_outq_len).with(instance_of(FFI::Pointer)).and_return(0).and_call_original
14
- allow(Rdkafka::Bindings).to receive(:rd_kafka_destroy)
16
+ allow(Rdkafka::Bindings).to receive(:rd_kafka_destroy_flags)
15
17
  allow(Thread).to receive(:new).and_return(thread)
16
18
 
17
19
  allow(thread).to receive(:[]=).with(:closing, anything)
@@ -51,6 +53,16 @@ describe Rdkafka::Producer::Client do
51
53
  expect(Rdkafka::Bindings).to receive(:rd_kafka_outq_len).with(native).at_least(:once)
52
54
  end
53
55
  end
56
+
57
+ context "if not enabled" do
58
+ subject(:client) { described_class.new(native, run_polling_thread: false) }
59
+
60
+ it "is not created" do
61
+ expect(Thread).not_to receive(:new)
62
+
63
+ client
64
+ end
65
+ end
54
66
  end
55
67
 
56
68
  def polling_loop_expects(&block)
@@ -63,8 +75,8 @@ describe Rdkafka::Producer::Client do
63
75
  client
64
76
  end
65
77
 
66
- it "exposes `native` client" do
67
- expect(client.native).to eq(native)
78
+ it "exposes inner client" do
79
+ expect(client.inner).to eq(native)
68
80
  end
69
81
 
70
82
  context "when client was not yet closed (`nil`)" do
@@ -74,7 +86,7 @@ describe Rdkafka::Producer::Client do
74
86
 
75
87
  context "and attempt to close" do
76
88
  it "calls the `destroy` binding" do
77
- expect(Rdkafka::Bindings).to receive(:rd_kafka_destroy).with(native)
89
+ expect(Rdkafka::Bindings).to receive(:rd_kafka_destroy_flags).with(native, Rdkafka::Bindings::RD_KAFKA_DESTROY_F_IMMEDIATE)
78
90
 
79
91
  client.close
80
92
  end
@@ -94,7 +106,7 @@ describe Rdkafka::Producer::Client do
94
106
  it "closes and unassign the native client" do
95
107
  client.close
96
108
 
97
- expect(client.native).to eq(nil)
109
+ expect(client.inner).to eq(nil)
98
110
  expect(client.closed?).to eq(true)
99
111
  end
100
112
  end
@@ -109,7 +121,7 @@ describe Rdkafka::Producer::Client do
109
121
 
110
122
  context "and attempt to close again" do
111
123
  it "does not call the `destroy` binding" do
112
- expect(Rdkafka::Bindings).not_to receive(:rd_kafka_destroy)
124
+ expect(Rdkafka::Bindings).not_to receive(:rd_kafka_destroy_flags)
113
125
 
114
126
  client.close
115
127
  end
@@ -129,13 +141,13 @@ describe Rdkafka::Producer::Client do
129
141
  it "does not close and unassign the native client again" do
130
142
  client.close
131
143
 
132
- expect(client.native).to eq(nil)
144
+ expect(client.inner).to eq(nil)
133
145
  expect(client.closed?).to eq(true)
134
146
  end
135
147
  end
136
148
  end
137
149
 
138
- it "provide a finalizer Proc that closes the `native` client" do
150
+ it "provides a finalizer that closes the native kafka client" do
139
151
  expect(client.closed?).to eq(false)
140
152
 
141
153
  client.finalizer.call("some-ignored-object-id")
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Rdkafka::Producer::DeliveryHandle do
@@ -9,6 +11,7 @@ describe Rdkafka::Producer::DeliveryHandle do
9
11
  handle[:response] = response
10
12
  handle[:partition] = 2
11
13
  handle[:offset] = 100
14
+ handle[:topic_name] = FFI::MemoryPointer.from_string("produce_test_topic")
12
15
  end
13
16
  end
14
17
 
@@ -29,6 +32,7 @@ describe Rdkafka::Producer::DeliveryHandle do
29
32
 
30
33
  expect(report.partition).to eq(2)
31
34
  expect(report.offset).to eq(100)
35
+ expect(report.topic_name).to eq("produce_test_topic")
32
36
  end
33
37
 
34
38
  it "should wait without a timeout" do
@@ -36,6 +40,7 @@ describe Rdkafka::Producer::DeliveryHandle do
36
40
 
37
41
  expect(report.partition).to eq(2)
38
42
  expect(report.offset).to eq(100)
43
+ expect(report.topic_name).to eq("produce_test_topic")
39
44
  end
40
45
  end
41
46
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Rdkafka::Producer::DeliveryReport do
4
- subject { Rdkafka::Producer::DeliveryReport.new(2, 100, "error") }
6
+ subject { Rdkafka::Producer::DeliveryReport.new(2, 100, "topic", -1) }
5
7
 
6
8
  it "should get the partition" do
7
9
  expect(subject.partition).to eq 2
@@ -11,7 +13,11 @@ describe Rdkafka::Producer::DeliveryReport do
11
13
  expect(subject.offset).to eq 100
12
14
  end
13
15
 
16
+ it "should get the topic_name" do
17
+ expect(subject.topic_name).to eq "topic"
18
+ end
19
+
14
20
  it "should get the error" do
15
- expect(subject.error).to eq "error"
21
+ expect(subject.error).to eq -1
16
22
  end
17
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
  require "zlib"
3
5
 
@@ -7,7 +9,8 @@ describe Rdkafka::Producer do
7
9
 
8
10
  after do
9
11
  # Registry should always end up being empty
10
- expect(Rdkafka::Producer::DeliveryHandle::REGISTRY).to be_empty
12
+ registry = Rdkafka::Producer::DeliveryHandle::REGISTRY
13
+ expect(registry).to be_empty, registry.inspect
11
14
  producer.close
12
15
  consumer.close
13
16
  end
@@ -30,6 +33,7 @@ describe Rdkafka::Producer do
30
33
  expect(report).not_to be_nil
31
34
  expect(report.partition).to eq 1
32
35
  expect(report.offset).to be >= 0
36
+ expect(report.topic_name).to eq "produce_test_topic"
33
37
  @callback_called = true
34
38
  end
35
39
 
@@ -113,6 +117,7 @@ describe Rdkafka::Producer do
113
117
  expect(called_report.first).not_to be_nil
114
118
  expect(called_report.first.partition).to eq 1
115
119
  expect(called_report.first.offset).to be >= 0
120
+ expect(called_report.first.topic_name).to eq "produce_test_topic"
116
121
  end
117
122
 
118
123
  it "should provide handle" do
@@ -180,10 +185,11 @@ describe Rdkafka::Producer do
180
185
  expect(report.partition).to eq 1
181
186
  expect(report.offset).to be >= 0
182
187
 
183
- # Close producer
188
+ # Flush and close producer
189
+ producer.flush
184
190
  producer.close
185
191
 
186
- # Consume message and verify it's content
192
+ # Consume message and verify its content
187
193
  message = wait_for_message(
188
194
  topic: "produce_test_topic",
189
195
  delivery_report: report,
@@ -207,7 +213,7 @@ describe Rdkafka::Producer do
207
213
  )
208
214
  report = handle.wait(max_wait_timeout: 5)
209
215
 
210
- # Consume message and verify it's content
216
+ # Consume message and verify its content
211
217
  message = wait_for_message(
212
218
  topic: "produce_test_topic",
213
219
  delivery_report: report,
@@ -251,6 +257,28 @@ describe Rdkafka::Producer do
251
257
  expect(messages[2].key).to eq key
252
258
  end
253
259
 
260
+ it "should produce a message with empty string without crashing" do
261
+ messages = [{key: 'a', partition_key: ''}]
262
+
263
+ messages = messages.map do |m|
264
+ handle = producer.produce(
265
+ topic: "partitioner_test_topic",
266
+ payload: "payload partition",
267
+ key: m[:key],
268
+ partition_key: m[:partition_key]
269
+ )
270
+ report = handle.wait(max_wait_timeout: 5)
271
+
272
+ wait_for_message(
273
+ topic: "partitioner_test_topic",
274
+ delivery_report: report,
275
+ )
276
+ end
277
+
278
+ expect(messages[0].partition).to eq 0
279
+ expect(messages[0].key).to eq 'a'
280
+ end
281
+
254
282
  it "should produce a message with utf-8 encoding" do
255
283
  handle = producer.produce(
256
284
  topic: "produce_test_topic",
@@ -259,7 +287,7 @@ describe Rdkafka::Producer do
259
287
  )
260
288
  report = handle.wait(max_wait_timeout: 5)
261
289
 
262
- # Consume message and verify it's content
290
+ # Consume message and verify its content
263
291
  message = wait_for_message(
264
292
  topic: "produce_test_topic",
265
293
  delivery_report: report,
@@ -292,7 +320,7 @@ describe Rdkafka::Producer do
292
320
  )
293
321
  report = handle.wait(max_wait_timeout: 5)
294
322
 
295
- # Consume message and verify it's content
323
+ # Consume message and verify its content
296
324
  message = wait_for_message(
297
325
  topic: "produce_test_topic",
298
326
  delivery_report: report,
@@ -313,7 +341,7 @@ describe Rdkafka::Producer do
313
341
  )
314
342
  report = handle.wait(max_wait_timeout: 5)
315
343
 
316
- # Consume message and verify it's content
344
+ # Consume message and verify its content
317
345
  message = wait_for_message(
318
346
  topic: "produce_test_topic",
319
347
  delivery_report: report,
@@ -333,7 +361,7 @@ describe Rdkafka::Producer do
333
361
  )
334
362
  report = handle.wait(max_wait_timeout: 5)
335
363
 
336
- # Consume message and verify it's content
364
+ # Consume message and verify its content
337
365
  message = wait_for_message(
338
366
  topic: "produce_test_topic",
339
367
  delivery_report: report,
@@ -351,7 +379,7 @@ describe Rdkafka::Producer do
351
379
  )
352
380
  report = handle.wait(max_wait_timeout: 5)
353
381
 
354
- # Consume message and verify it's content
382
+ # Consume message and verify its content
355
383
  message = wait_for_message(
356
384
  topic: "produce_test_topic",
357
385
  delivery_report: report,
@@ -371,7 +399,7 @@ describe Rdkafka::Producer do
371
399
  )
372
400
  report = handle.wait(max_wait_timeout: 5)
373
401
 
374
- # Consume message and verify it's content
402
+ # Consume message and verify its content
375
403
  message = wait_for_message(
376
404
  topic: "produce_test_topic",
377
405
  delivery_report: report,
@@ -380,9 +408,9 @@ describe Rdkafka::Producer do
380
408
 
381
409
  expect(message.payload).to eq "payload headers"
382
410
  expect(message.key).to eq "key headers"
383
- expect(message.headers[:foo]).to eq "bar"
384
- expect(message.headers[:baz]).to eq "foobar"
385
- expect(message.headers[:foobar]).to be_nil
411
+ expect(message.headers["foo"]).to eq "bar"
412
+ expect(message.headers["baz"]).to eq "foobar"
413
+ expect(message.headers["foobar"]).to be_nil
386
414
  end
387
415
 
388
416
  it "should produce a message with empty headers" do
@@ -394,7 +422,7 @@ describe Rdkafka::Producer do
394
422
  )
395
423
  report = handle.wait(max_wait_timeout: 5)
396
424
 
397
- # Consume message and verify it's content
425
+ # Consume message and verify its content
398
426
  message = wait_for_message(
399
427
  topic: "produce_test_topic",
400
428
  delivery_report: report,
@@ -432,10 +460,10 @@ describe Rdkafka::Producer do
432
460
  # wait for and check the message in the main process.
433
461
  reader, writer = IO.pipe
434
462
 
435
- fork do
463
+ pid = fork do
436
464
  reader.close
437
465
 
438
- # Avoids sharing the socket between processes.
466
+ # Avoid sharing the client between processes.
439
467
  producer = rdkafka_producer_config.producer
440
468
 
441
469
  handle = producer.produce(
@@ -448,24 +476,28 @@ describe Rdkafka::Producer do
448
476
 
449
477
  report_json = JSON.generate(
450
478
  "partition" => report.partition,
451
- "offset" => report.offset
479
+ "offset" => report.offset,
480
+ "topic_name" => report.topic_name
452
481
  )
453
482
 
454
483
  writer.write(report_json)
455
484
  writer.close
485
+ producer.flush
456
486
  producer.close
457
487
  end
488
+ Process.wait(pid)
458
489
 
459
490
  writer.close
460
491
  report_hash = JSON.parse(reader.read)
461
492
  report = Rdkafka::Producer::DeliveryReport.new(
462
493
  report_hash["partition"],
463
- report_hash["offset"]
494
+ report_hash["offset"],
495
+ report_hash["topic_name"]
464
496
  )
465
497
 
466
498
  reader.close
467
499
 
468
- # Consume message and verify it's content
500
+ # Consume message and verify its content
469
501
  message = wait_for_message(
470
502
  topic: "produce_test_topic",
471
503
  delivery_report: report,
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  unless ENV["CI"] == "true"
2
4
  require "simplecov"
3
5
  SimpleCov.start do
@@ -104,6 +106,20 @@ def wait_for_unassignment(consumer)
104
106
  end
105
107
  end
106
108
 
109
+ def notify_listener(listener, &block)
110
+ # 1. subscribe and poll
111
+ consumer.subscribe("consume_test_topic")
112
+ wait_for_assignment(consumer)
113
+ consumer.poll(100)
114
+
115
+ block.call if block
116
+
117
+ # 2. unsubscribe
118
+ consumer.unsubscribe
119
+ wait_for_unassignment(consumer)
120
+ consumer.close
121
+ end
122
+
107
123
  RSpec.configure do |config|
108
124
  config.filter_run focus: true
109
125
  config.run_all_when_everything_filtered = true
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.12.0
4
+ version: 0.13.0.beta.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thijs Cadier
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-17 00:00:00.000000000 Z
11
+ date: 2022-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -176,8 +176,8 @@ files:
176
176
  - lib/rdkafka/consumer/topic_partition_list.rb
177
177
  - lib/rdkafka/error.rb
178
178
  - lib/rdkafka/metadata.rb
179
+ - lib/rdkafka/native_kafka.rb
179
180
  - lib/rdkafka/producer.rb
180
- - lib/rdkafka/producer/client.rb
181
181
  - lib/rdkafka/producer/delivery_handle.rb
182
182
  - lib/rdkafka/producer/delivery_report.rb
183
183
  - lib/rdkafka/version.rb
@@ -191,13 +191,14 @@ files:
191
191
  - spec/rdkafka/bindings_spec.rb
192
192
  - spec/rdkafka/callbacks_spec.rb
193
193
  - spec/rdkafka/config_spec.rb
194
+ - spec/rdkafka/consumer/headers_spec.rb
194
195
  - spec/rdkafka/consumer/message_spec.rb
195
196
  - spec/rdkafka/consumer/partition_spec.rb
196
197
  - spec/rdkafka/consumer/topic_partition_list_spec.rb
197
198
  - spec/rdkafka/consumer_spec.rb
198
199
  - spec/rdkafka/error_spec.rb
199
200
  - spec/rdkafka/metadata_spec.rb
200
- - spec/rdkafka/producer/client_spec.rb
201
+ - spec/rdkafka/native_kafka_spec.rb
201
202
  - spec/rdkafka/producer/delivery_handle_spec.rb
202
203
  - spec/rdkafka/producer/delivery_report_spec.rb
203
204
  - spec/rdkafka/producer_spec.rb
@@ -206,7 +207,7 @@ homepage: https://github.com/thijsc/rdkafka-ruby
206
207
  licenses:
207
208
  - MIT
208
209
  metadata: {}
209
- post_install_message:
210
+ post_install_message:
210
211
  rdoc_options: []
211
212
  require_paths:
212
213
  - lib
@@ -217,12 +218,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
217
218
  version: '2.6'
218
219
  required_rubygems_version: !ruby/object:Gem::Requirement
219
220
  requirements:
220
- - - ">="
221
+ - - ">"
221
222
  - !ruby/object:Gem::Version
222
- version: '0'
223
+ version: 1.3.1
223
224
  requirements: []
224
- rubygems_version: 3.0.3
225
- signing_key:
225
+ rubygems_version: 3.3.13
226
+ signing_key:
226
227
  specification_version: 4
227
228
  summary: The rdkafka gem is a modern Kafka client library for Ruby based on librdkafka.
228
229
  It wraps the production-ready C client using the ffi gem and targets Kafka 1.0+
@@ -237,13 +238,14 @@ test_files:
237
238
  - spec/rdkafka/bindings_spec.rb
238
239
  - spec/rdkafka/callbacks_spec.rb
239
240
  - spec/rdkafka/config_spec.rb
241
+ - spec/rdkafka/consumer/headers_spec.rb
240
242
  - spec/rdkafka/consumer/message_spec.rb
241
243
  - spec/rdkafka/consumer/partition_spec.rb
242
244
  - spec/rdkafka/consumer/topic_partition_list_spec.rb
243
245
  - spec/rdkafka/consumer_spec.rb
244
246
  - spec/rdkafka/error_spec.rb
245
247
  - spec/rdkafka/metadata_spec.rb
246
- - spec/rdkafka/producer/client_spec.rb
248
+ - spec/rdkafka/native_kafka_spec.rb
247
249
  - spec/rdkafka/producer/delivery_handle_spec.rb
248
250
  - spec/rdkafka/producer/delivery_report_spec.rb
249
251
  - spec/rdkafka/producer_spec.rb
@@ -1,47 +0,0 @@
1
- module Rdkafka
2
- class Producer
3
- class Client
4
- def initialize(native)
5
- @native = native
6
-
7
- # Start thread to poll client for delivery callbacks
8
- @polling_thread = Thread.new do
9
- loop do
10
- Rdkafka::Bindings.rd_kafka_poll(native, 250)
11
- # Exit thread if closing and the poll queue is empty
12
- if Thread.current[:closing] && Rdkafka::Bindings.rd_kafka_outq_len(native) == 0
13
- break
14
- end
15
- end
16
- end
17
- @polling_thread.abort_on_exception = true
18
- @polling_thread[:closing] = false
19
- end
20
-
21
- def native
22
- @native
23
- end
24
-
25
- def finalizer
26
- ->(_) { close }
27
- end
28
-
29
- def closed?
30
- @native.nil?
31
- end
32
-
33
- def close(object_id=nil)
34
- return unless @native
35
-
36
- # Indicate to polling thread that we're closing
37
- @polling_thread[:closing] = true
38
- # Wait for the polling thread to finish up
39
- @polling_thread.join
40
-
41
- Rdkafka::Bindings.rd_kafka_destroy(@native)
42
-
43
- @native = nil
44
- end
45
- end
46
- end
47
- end