karafka-rdkafka 0.27.0-aarch64-linux-gnu → 0.27.2-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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f997aa68021eb19e490afc55841e4009da71e85a03a98decf53009b0284471e5
4
- data.tar.gz: ddab9a03905ae72c7d984718f66736e1e1e9dad9ee48a40f04d55e9ab697a672
3
+ metadata.gz: bf144e733ead8d092df02370f368a972ddce305dacd7ffe7b1eeb23376778308
4
+ data.tar.gz: f78f039beab386856654c65b8d7e9b8c57d2a04e62610e3a6e0c881a6aee52dd
5
5
  SHA512:
6
- metadata.gz: b0af437d10ef0c21da45c0d33f79adcd190ce2db7e6243cd2058aa6988067f319f4ca6fb942893a79e24e19d8298b324de00577168e3d792693161c722c5a221
7
- data.tar.gz: 3bf2f40df79b4754751bb250f1adf2775d0c5c18fb887366cb75812e7e63b093fa660c229b8f2d1f58059cbbdcad7ab4a3a4bf507be8ba214eb00ad8e0f5dff4
6
+ metadata.gz: d21d838a647a08fb3593b7f270341441239dc0ef2d62a72df076e28ff24bc0b3e808100a13e1d6aa7d011b210e0423a7bf5b4595ed2ffbb872139dc280cd828f
7
+ data.tar.gz: f8b83914f79932a3d910206542cfb5ace7aabf0cf20533ca0e701b97f40de527fbfa8e799094373970e6d3ad57021f41ba7b0212c30c67e9c2039c9c39240664
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Rdkafka Changelog
2
2
 
3
+ ## 0.27.2 (2026-05-21)
4
+ - [Enhancement] `poll_batch` and `poll_batch_nb` now return error events inline as `RdkafkaError` objects rather than raising on the first error. The return type is `Array<Message, RdkafkaError>` and callers are responsible for handling errors in the result.
5
+
6
+ ## 0.27.1 (2026-05-14)
7
+ - [Fix] `poll_nb`, `poll_nb_each`, `poll_batch`, and `poll_batch_nb` now raise `RdkafkaError` with `details` populated (`{topic:, partition:, offset:}`) when a message contains an error (e.g. `:partition_eof`). Previously these methods raised via `RdkafkaError.new(code)`, discarding the native message struct context. They now use `RdkafkaError.validate!(native_message, client_ptr: inner)`, consistent with `poll`.
8
+
3
9
  ## 0.27.0 (2026-05-08)
4
10
  - [Feature] Add `Consumer#poll_batch(timeout_ms, max_items:)` and `Consumer#poll_batch_nb(timeout_ms, max_items:)` for batch message polling via `rd_kafka_consume_batch_queue` (from upstream).
5
11
  - [Enhancement] Bump librdkafka to `2.14.1`.
data/ext/librdkafka.so CHANGED
Binary file
@@ -163,7 +163,7 @@ module Rdkafka
163
163
  native_message = Rdkafka::Bindings::Message.new(message_ptr)
164
164
 
165
165
  if native_message[:err] != Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
166
- raise Rdkafka::RdkafkaError.new(native_message[:err])
166
+ Rdkafka::RdkafkaError.validate!(native_message, client_ptr: inner)
167
167
  end
168
168
 
169
169
  result = yield Consumer::Message.new(native_message)
@@ -736,7 +736,9 @@ module Rdkafka
736
736
  native_message = Rdkafka::Bindings::Message.new(message_ptr)
737
737
  # Raise error if needed
738
738
  if native_message[:err] != Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
739
- raise Rdkafka::RdkafkaError.new(native_message[:err])
739
+ @native_kafka.with_inner do |inner|
740
+ Rdkafka::RdkafkaError.validate!(native_message, client_ptr: inner)
741
+ end
740
742
  end
741
743
  # Create a message to pass out
742
744
  Rdkafka::Consumer::Message.new(native_message)
@@ -799,16 +801,21 @@ module Rdkafka
799
801
  # is available, librdkafka fills the buffer with whatever is immediately ready and
800
802
  # returns without further waiting.
801
803
  #
804
+ # Error events (e.g. `:partition_eof`) are returned inline as {RdkafkaError} objects
805
+ # rather than raised, so callers receive the complete batch — both messages and errors —
806
+ # and can decide how to handle each. This is particularly useful when multiple partitions
807
+ # signal EOF simultaneously: all signals appear in the returned array rather than only
808
+ # the first one being raised and the rest silently discarded.
809
+ #
802
810
  # @param timeout_ms [Integer] Timeout waiting for the first message (-1 for infinite)
803
811
  # @param max_items [Integer] Maximum number of messages to return per call
804
- # @return [Array<Message>] Array of messages (empty if none available within timeout)
805
- # @raise [RdkafkaError] When a consumed message contains an error
812
+ # @return [Array<Message, RdkafkaError>] Batch of messages and/or error events in arrival order
806
813
  # @raise [ClosedConsumerError] When called on a closed consumer
807
814
  def poll_batch(timeout_ms, max_items: 100)
808
815
  closed_consumer_check(__method__)
809
816
 
810
817
  buffer = batch_buffer(max_items)
811
- messages = []
818
+ results = []
812
819
 
813
820
  count = @native_kafka.with_inner do |_inner|
814
821
  Rdkafka::Bindings.rd_kafka_consume_batch_queue(
@@ -819,7 +826,7 @@ module Rdkafka
819
826
  )
820
827
  end
821
828
 
822
- return messages if count <= 0
829
+ return results if count <= 0
823
830
 
824
831
  i = 0
825
832
  begin
@@ -834,10 +841,13 @@ module Rdkafka
834
841
  native_message = Rdkafka::Bindings::Message.new(ptr)
835
842
 
836
843
  if native_message[:err] != Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
837
- raise Rdkafka::RdkafkaError.new(native_message[:err])
844
+ results << build_batch_error(native_message)
845
+ Rdkafka::Bindings.rd_kafka_message_destroy(ptr)
846
+ i += 1
847
+ next
838
848
  end
839
849
 
840
- messages << Rdkafka::Consumer::Message.new(native_message)
850
+ results << Rdkafka::Consumer::Message.new(native_message)
841
851
  Rdkafka::Bindings.rd_kafka_message_destroy(ptr)
842
852
  i += 1
843
853
  end
@@ -849,7 +859,7 @@ module Rdkafka
849
859
  end
850
860
  end
851
861
 
852
- messages
862
+ results
853
863
  end
854
864
 
855
865
  # Poll for a batch of messages without releasing the GVL (Global VM Lock).
@@ -861,16 +871,17 @@ module Rdkafka
861
871
  # @note Since the GVL is not released, a non-zero timeout_ms will block all Ruby
862
872
  # threads/fibers for the duration. Use {#poll_batch} if you need a blocking wait.
863
873
  #
874
+ # Error events are returned inline as {RdkafkaError} objects; see {#poll_batch} for details.
875
+ #
864
876
  # @param timeout_ms [Integer] Timeout waiting for the first message (default: 0 for non-blocking)
865
877
  # @param max_items [Integer] Maximum number of messages to return per call
866
- # @return [Array<Message>] Array of messages (empty if none available within timeout)
867
- # @raise [RdkafkaError] When a consumed message contains an error
878
+ # @return [Array<Message, RdkafkaError>] Batch of messages and/or error events in arrival order
868
879
  # @raise [ClosedConsumerError] When called on a closed consumer
869
880
  def poll_batch_nb(timeout_ms = 0, max_items: 100)
870
881
  closed_consumer_check(__method__)
871
882
 
872
883
  buffer = batch_buffer(max_items)
873
- messages = []
884
+ results = []
874
885
 
875
886
  count = @native_kafka.with_inner do |_inner|
876
887
  Rdkafka::Bindings.rd_kafka_consume_batch_queue_nb(
@@ -881,7 +892,7 @@ module Rdkafka
881
892
  )
882
893
  end
883
894
 
884
- return messages if count <= 0
895
+ return results if count <= 0
885
896
 
886
897
  i = 0
887
898
  begin
@@ -896,10 +907,13 @@ module Rdkafka
896
907
  native_message = Rdkafka::Bindings::Message.new(ptr)
897
908
 
898
909
  if native_message[:err] != Rdkafka::Bindings::RD_KAFKA_RESP_ERR_NO_ERROR
899
- raise Rdkafka::RdkafkaError.new(native_message[:err])
910
+ results << build_batch_error(native_message)
911
+ Rdkafka::Bindings.rd_kafka_message_destroy(ptr)
912
+ i += 1
913
+ next
900
914
  end
901
915
 
902
- messages << Rdkafka::Consumer::Message.new(native_message)
916
+ results << Rdkafka::Consumer::Message.new(native_message)
903
917
  Rdkafka::Bindings.rd_kafka_message_destroy(ptr)
904
918
  i += 1
905
919
  end
@@ -911,7 +925,7 @@ module Rdkafka
911
925
  end
912
926
  end
913
927
 
914
- messages
928
+ results
915
929
  end
916
930
 
917
931
  # Poll for new messages and yield for each received one. Iteration
@@ -995,6 +1009,21 @@ module Rdkafka
995
1009
  end
996
1010
  end
997
1011
 
1012
+ # Builds an RdkafkaError from a native message, promoting to a fatal error when
1013
+ # librdkafka flagged a fatal condition on the underlying client handle.
1014
+ # @param native_message [Rdkafka::Bindings::Message] the errored native message
1015
+ # @return [RdkafkaError]
1016
+ def build_batch_error(native_message)
1017
+ err = Rdkafka::RdkafkaError.build(native_message)
1018
+ if err && err.rdkafka_response == Rdkafka::Bindings::RD_KAFKA_RESP_ERR__FATAL
1019
+ @native_kafka.with_inner do |inner|
1020
+ Rdkafka::RdkafkaError.build_fatal(inner, fallback_error_code: err.rdkafka_response)
1021
+ end
1022
+ else
1023
+ err
1024
+ end
1025
+ end
1026
+
998
1027
  # Returns a reusable FFI buffer for batch polling, growing if needed
999
1028
  # @param max_items [Integer] minimum buffer capacity
1000
1029
  # @return [FFI::MemoryPointer] pointer buffer
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Rdkafka
4
4
  # Current rdkafka-ruby gem version
5
- VERSION = "0.27.0"
5
+ VERSION = "0.27.2"
6
6
  # Target librdkafka version to be used
7
7
  LIBRDKAFKA_VERSION = "2.14.1"
8
8
  # SHA256 hash of the librdkafka source tarball for verification
data/package-lock.json CHANGED
@@ -286,9 +286,9 @@
286
286
  }
287
287
  },
288
288
  "node_modules/smol-toml": {
289
- "version": "1.6.0",
290
- "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz",
291
- "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==",
289
+ "version": "1.6.1",
290
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
291
+ "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==",
292
292
  "dev": true,
293
293
  "license": "BSD-3-Clause",
294
294
  "engines": {
@@ -312,9 +312,9 @@
312
312
  }
313
313
  },
314
314
  "node_modules/yaml": {
315
- "version": "2.8.2",
316
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
317
- "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
315
+ "version": "2.8.4",
316
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz",
317
+ "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==",
318
318
  "dev": true,
319
319
  "license": "ISC",
320
320
  "bin": {
data/renovate.json CHANGED
@@ -85,7 +85,8 @@
85
85
  "ruby/setup-ruby",
86
86
  "ruby"
87
87
  ],
88
- "groupName": "ruby setup"
88
+ "groupName": "ruby setup",
89
+ "internalChecksFilter": "strict"
89
90
  }
90
91
  ],
91
92
  "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.27.0
4
+ version: 0.27.2
5
5
  platform: aarch64-linux-gnu
6
6
  authors:
7
7
  - Thijs Cadier
@@ -172,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
172
  - !ruby/object:Gem::Version
173
173
  version: '0'
174
174
  requirements: []
175
- rubygems_version: 4.0.6
175
+ rubygems_version: 4.0.10
176
176
  specification_version: 4
177
177
  summary: The rdkafka gem is a modern Kafka client library for Ruby based on librdkafka.
178
178
  It wraps the production-ready C client using the ffi gem and targets Kafka 1.0+