karafka-rdkafka 0.31.0-aarch64-linux-gnu → 0.32.0-aarch64-linux-gnu

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +83 -35
  3. data/README.md +2 -1
  4. data/ext/librdkafka.so +0 -0
  5. data/karafka-rdkafka.gemspec +4 -3
  6. data/lib/rdkafka/admin/acl_binding_result.rb +4 -16
  7. data/lib/rdkafka/admin/alter_consumer_group_offsets_report.rb +2 -2
  8. data/lib/rdkafka/admin/create_acl_report.rb +1 -3
  9. data/lib/rdkafka/admin/create_topic_report.rb +2 -6
  10. data/lib/rdkafka/admin/delete_consumer_group_offsets_report.rb +2 -2
  11. data/lib/rdkafka/admin/delete_groups_report.rb +2 -6
  12. data/lib/rdkafka/admin/delete_topic_report.rb +2 -6
  13. data/lib/rdkafka/admin/describe_cluster_report.rb +3 -0
  14. data/lib/rdkafka/admin/list_consumer_group_offsets_handle.rb +31 -0
  15. data/lib/rdkafka/admin/list_consumer_group_offsets_report.rb +52 -0
  16. data/lib/rdkafka/admin.rb +180 -10
  17. data/lib/rdkafka/bindings/admin/configs.rb +1 -1
  18. data/lib/rdkafka/bindings/admin.rb +14 -0
  19. data/lib/rdkafka/bindings/callbacks.rb +13 -6
  20. data/lib/rdkafka/bindings/configuration.rb +3 -3
  21. data/lib/rdkafka/bindings/consumer.rb +44 -2
  22. data/lib/rdkafka/bindings/errors.rb +1 -1
  23. data/lib/rdkafka/bindings/handle.rb +1 -1
  24. data/lib/rdkafka/bindings.rb +3 -0
  25. data/lib/rdkafka/callbacks/list_consumer_group_offsets_handler.rb +62 -0
  26. data/lib/rdkafka/callbacks.rb +5 -6
  27. data/lib/rdkafka/config.rb +70 -0
  28. data/lib/rdkafka/consumer/allocator.rb +0 -2
  29. data/lib/rdkafka/consumer/topic_partition_list.rb +7 -7
  30. data/lib/rdkafka/consumer.rb +76 -36
  31. data/lib/rdkafka/defaults.rb +6 -4
  32. data/lib/rdkafka/native_kafka.rb +45 -31
  33. data/lib/rdkafka/producer/partitions_count_cache.rb +109 -26
  34. data/lib/rdkafka/producer.rb +141 -71
  35. data/lib/rdkafka/share_consumer.rb +64 -34
  36. data/lib/rdkafka/version.rb +1 -1
  37. data/lib/rdkafka.rb +4 -1
  38. data/package-lock.json +3 -3
  39. data/renovate.json +7 -0
  40. metadata +5 -30
@@ -96,13 +96,17 @@ module Rdkafka
96
96
  # and after close or in a forked child, where the native handle must not be touched.
97
97
  # librdkafka assigns the name at creation, so no broker connection is required.
98
98
  @name = Rdkafka::Bindings.rd_kafka_name(Rdkafka::Bindings::NativeShareConsumer.new(native)[:rkshare_rk])
99
- # Guards handle teardown against in-flight calls: increments happen under this mutex and
100
- # close holds it while draining and destroying (mirrors NativeKafka's approach)
99
+ # Guards handle teardown against in-flight calls: the operations in progress counter
100
+ # changes only under this mutex, and close holds it while destroying (mirrors NativeKafka)
101
101
  @access_mutex = Mutex.new
102
- # Separate mutex for decrements so a blocked close (holding @access_mutex) cannot
103
- # deadlock with an operation trying to finish
104
- @decrement_mutex = Mutex.new
105
- # Number of calls currently using the native handle
102
+ # Signalled when `#close` ends and, only while `#close` waits, when the operations in
103
+ # progress counter reaches zero. `#close` waits on it with `@access_mutex` released, so calls
104
+ # that started before it can still decrement the counter.
105
+ @operations_done = ConditionVariable.new
106
+ # Set while `#close` runs, so no new call starts until it ends
107
+ @closing = false
108
+ # Number of calls currently using the native handle, changed only under `@access_mutex`, so
109
+ # no update is lost on Rubies without a GVL (JRuby)
106
110
  @operations_in_progress = 0
107
111
 
108
112
  ObjectSpace.define_finalizer(self, self.class.finalizer(@state))
@@ -541,31 +545,15 @@ module Rdkafka
541
545
  return if closed?
542
546
 
543
547
  @access_mutex.synchronize do
544
- # Wait for in-flight calls on other threads to finish using the handle. New calls block
545
- # on the mutex above while we hold it.
546
- sleep(Defaults::NATIVE_KAFKA_SYNCHRONIZE_SLEEP_INTERVAL_MS / 1_000.0) until @operations_in_progress.zero?
548
+ @operations_done.wait(@access_mutex) while @closing
549
+ @closing = true
547
550
 
548
- native = @state.native
549
-
550
- # Lost the race against a concurrent close that already finished
551
- return if native.nil?
552
-
553
- # librdkafka leaves the instance intact when close/destroy fail, and validate! raises
554
- # before any reference (or the finalizer) is dropped, so the caller can retry close
555
- # and the handle cannot leak silently.
556
- #
557
- # The close step is skipped when librdkafka already considers the consumer closed
558
- # (e.g. a prior close attempt succeeded but its destroy failed and was retried).
559
- if Rdkafka::Bindings.rd_kafka_share_consumer_closed(native).zero?
560
- Rdkafka::RdkafkaError.validate!(Rdkafka::Bindings.rd_kafka_share_consumer_close(native))
551
+ begin
552
+ close_native
553
+ ensure
554
+ @closing = false
555
+ @operations_done.broadcast
561
556
  end
562
-
563
- Rdkafka::RdkafkaError.validate!(Rdkafka::Bindings.rd_kafka_share_destroy(native))
564
-
565
- # The native handle is gone only now; drop all references and the finalizer
566
- ObjectSpace.undefine_finalizer(self)
567
- @state.native = nil
568
- @state.ack_callback = nil
569
557
  end
570
558
 
571
559
  nil
@@ -573,10 +561,46 @@ module Rdkafka
573
561
 
574
562
  private
575
563
 
564
+ # Destroys the native handle once no other thread uses it. Runs under `@access_mutex`, with
565
+ # `@closing` set so no new call starts.
566
+ #
567
+ # @return [nil]
568
+ # @raise [RdkafkaError] When closing or destroying reported an error
569
+ def close_native
570
+ # Wait for in-flight calls on other threads to finish using the handle. The wait releases
571
+ # `@access_mutex`, so those calls can decrement the counter, while `@closing` keeps new
572
+ # calls out.
573
+ @operations_done.wait(@access_mutex) until @operations_in_progress.zero?
574
+
575
+ native = @state.native
576
+
577
+ # Lost the race against a concurrent close that already finished
578
+ return if native.nil?
579
+
580
+ # librdkafka leaves the instance intact when close/destroy fail, and validate! raises
581
+ # before any reference (or the finalizer) is dropped, so the caller can retry close
582
+ # and the handle cannot leak silently.
583
+ #
584
+ # The close step is skipped when librdkafka already considers the consumer closed
585
+ # (e.g. a prior close attempt succeeded but its destroy failed and was retried).
586
+ if Rdkafka::Bindings.rd_kafka_share_consumer_closed(native).zero?
587
+ Rdkafka::RdkafkaError.validate!(Rdkafka::Bindings.rd_kafka_share_consumer_close(native))
588
+ end
589
+
590
+ Rdkafka::RdkafkaError.validate!(Rdkafka::Bindings.rd_kafka_share_destroy(native))
591
+
592
+ # The native handle is gone only now; drop all references and the finalizer
593
+ ObjectSpace.undefine_finalizer(self)
594
+ @state.native = nil
595
+ @state.ack_callback = nil
596
+
597
+ nil
598
+ end
599
+
576
600
  # Executes a block with the native share handle while tracking the call so {#close} cannot
577
- # tear the handle down mid-call from another thread. Increments happen under the access
578
- # mutex that close holds for the whole teardown, so once close is draining no new call can
579
- # slip in; librdkafka's own single-owner gate still rejects genuinely concurrent API calls.
601
+ # tear the handle down mid-call from another thread. New calls wait while close runs, so once
602
+ # close is draining no new call can slip in; librdkafka's own single-owner gate still rejects
603
+ # genuinely concurrent API calls.
580
604
  #
581
605
  # @param method [Symbol] public method name, used for the ClosedConsumerError
582
606
  # @yield [FFI::Pointer] the native share handle
@@ -586,7 +610,10 @@ module Rdkafka
586
610
  # (the only internal holder) - the handle is going away, so reject before tracking
587
611
  raise Rdkafka::ClosedConsumerError.new(method) if @access_mutex.owned?
588
612
 
589
- @access_mutex.synchronize { @operations_in_progress += 1 }
613
+ @access_mutex.synchronize do
614
+ @operations_done.wait(@access_mutex) while @closing
615
+ @operations_in_progress += 1
616
+ end
590
617
 
591
618
  begin
592
619
  native = @state.native
@@ -597,7 +624,10 @@ module Rdkafka
597
624
 
598
625
  yield(native)
599
626
  ensure
600
- @decrement_mutex.synchronize { @operations_in_progress -= 1 }
627
+ @access_mutex.synchronize do
628
+ @operations_in_progress -= 1
629
+ @operations_done.broadcast if @closing && @operations_in_progress.zero?
630
+ end
601
631
  end
602
632
  end
603
633
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Rdkafka
4
4
  # Current rdkafka-ruby gem version
5
- VERSION = "0.31.0"
5
+ VERSION = "0.32.0"
6
6
  # Target librdkafka version to be used
7
7
  LIBRDKAFKA_VERSION = "2.16.0"
8
8
  # SHA256 hash of the librdkafka source tarball for verification
data/lib/rdkafka.rb CHANGED
@@ -15,6 +15,8 @@ require "rdkafka/abstract_handle"
15
15
  require "rdkafka/admin"
16
16
  require "rdkafka/admin/alter_consumer_group_offsets_handle"
17
17
  require "rdkafka/admin/alter_consumer_group_offsets_report"
18
+ require "rdkafka/admin/list_consumer_group_offsets_handle"
19
+ require "rdkafka/admin/list_consumer_group_offsets_report"
18
20
  require "rdkafka/admin/delete_consumer_group_offsets_handle"
19
21
  require "rdkafka/admin/delete_consumer_group_offsets_report"
20
22
  require "rdkafka/admin/create_topic_handle"
@@ -51,6 +53,7 @@ require "rdkafka/admin/describe_consumer_groups_report"
51
53
  require "rdkafka/admin/acl_binding_result"
52
54
  require "rdkafka/admin/config_binding_result"
53
55
  require "rdkafka/admin/config_resource_binding_result"
56
+ require "rdkafka/error"
54
57
  require "rdkafka/bindings"
55
58
  require "rdkafka/callbacks"
56
59
  require "rdkafka/callbacks/base_handler"
@@ -58,6 +61,7 @@ require "rdkafka/callbacks/create_topic_handler"
58
61
  require "rdkafka/callbacks/delete_topic_handler"
59
62
  require "rdkafka/callbacks/create_partitions_handler"
60
63
  require "rdkafka/callbacks/alter_consumer_group_offsets_handler"
64
+ require "rdkafka/callbacks/list_consumer_group_offsets_handler"
61
65
  require "rdkafka/callbacks/delete_consumer_group_offsets_handler"
62
66
  require "rdkafka/callbacks/delete_groups_handler"
63
67
  require "rdkafka/callbacks/delete_records_handler"
@@ -80,7 +84,6 @@ require "rdkafka/consumer/allocator"
80
84
  require "rdkafka/consumer/topic_partition_list"
81
85
  require "rdkafka/share_consumer"
82
86
  require "rdkafka/share_consumer/message"
83
- require "rdkafka/error"
84
87
  require "rdkafka/metadata"
85
88
  require "rdkafka/native_kafka"
86
89
  require "rdkafka/producer/partitions_count_cache"
data/package-lock.json CHANGED
@@ -286,9 +286,9 @@
286
286
  }
287
287
  },
288
288
  "node_modules/smol-toml": {
289
- "version": "1.9.0",
290
- "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.9.0.tgz",
291
- "integrity": "sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==",
289
+ "version": "1.9.1",
290
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.9.1.tgz",
291
+ "integrity": "sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==",
292
292
  "dev": true,
293
293
  "license": "BSD-3-Clause",
294
294
  "engines": {
data/renovate.json CHANGED
@@ -97,6 +97,13 @@
97
97
  "ruby/setup-ruby"
98
98
  ],
99
99
  "minimumReleaseAge": "5 days"
100
+ },
101
+ {
102
+ "description": "Keep the ubuntu:22.04 build container of the precompiled gnu libraries; a newer Ubuntu raises their glibc floor",
103
+ "matchDatasources": ["docker"],
104
+ "matchPackageNames": ["ubuntu"],
105
+ "matchFileNames": [".github/workflows/**"],
106
+ "allowedVersions": "/^22\\.04$/"
100
107
  }
101
108
  ],
102
109
  "labels": [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karafka-rdkafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.31.0
4
+ version: 0.32.0
5
5
  platform: aarch64-linux-gnu
6
6
  authors:
7
7
  - Thijs Cadier
@@ -52,34 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: mini_portile2
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '2.6'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '2.6'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">"
74
- - !ruby/object:Gem::Version
75
- version: '12'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">"
81
- - !ruby/object:Gem::Version
82
- version: '12'
83
55
  description: Modern Kafka client library for Ruby based on librdkafka
84
56
  email:
85
57
  - contact@karafka.io
@@ -133,6 +105,8 @@ files:
133
105
  - lib/rdkafka/admin/describe_topics_report.rb
134
106
  - lib/rdkafka/admin/incremental_alter_configs_handle.rb
135
107
  - lib/rdkafka/admin/incremental_alter_configs_report.rb
108
+ - lib/rdkafka/admin/list_consumer_group_offsets_handle.rb
109
+ - lib/rdkafka/admin/list_consumer_group_offsets_report.rb
136
110
  - lib/rdkafka/admin/list_consumer_groups_handle.rb
137
111
  - lib/rdkafka/admin/list_consumer_groups_report.rb
138
112
  - lib/rdkafka/admin/list_offsets_handle.rb
@@ -170,6 +144,7 @@ files:
170
144
  - lib/rdkafka/callbacks/describe_consumer_groups_handler.rb
171
145
  - lib/rdkafka/callbacks/describe_topics_handler.rb
172
146
  - lib/rdkafka/callbacks/incremental_alter_configs_handler.rb
147
+ - lib/rdkafka/callbacks/list_consumer_group_offsets_handler.rb
173
148
  - lib/rdkafka/callbacks/list_consumer_groups_handler.rb
174
149
  - lib/rdkafka/callbacks/list_offsets_handler.rb
175
150
  - lib/rdkafka/clients.rb
@@ -227,5 +202,5 @@ rubygems_version: 4.0.20
227
202
  specification_version: 4
228
203
  summary: The rdkafka gem is a modern Kafka client library for Ruby based on librdkafka.
229
204
  It wraps the production-ready C client using the ffi gem and targets Kafka 1.0+
230
- and Ruby 2.7+.
205
+ and Ruby 3.3+.
231
206
  test_files: []