karafka-rdkafka 0.27.0 → 0.27.2
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/CHANGELOG.md +6 -0
- data/lib/rdkafka/consumer.rb +45 -16
- data/lib/rdkafka/version.rb +1 -1
- data/package-lock.json +6 -6
- data/renovate.json +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 28b25d5553da8103cf3ba2840c57d954bc36a957004a01e31a7a4ace76b82382
|
|
4
|
+
data.tar.gz: ee834fb05a4afa6ac3bb31d2dcf8735779f6bcd9c7e4b910d95e22ecae74b3fc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d4fe487cab97e1cf1ea5c275a682feee20247d1e20517d257c1a03383d5fb9bcb926404626123e3d0c7e05d9832fa7675c37b0b5f6b0ff484c277324a432c66f
|
|
7
|
+
data.tar.gz: 223c61df2cb43ad07df271caf29c535e8daa13f49602a21cfea5ef8ddb030e6378f23fe698f15025a673083fd486b749c04f3078edb6f69d14fa0339cd55658f
|
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/lib/rdkafka/consumer.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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>]
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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>]
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
data/lib/rdkafka/version.rb
CHANGED
data/package-lock.json
CHANGED
|
@@ -286,9 +286,9 @@
|
|
|
286
286
|
}
|
|
287
287
|
},
|
|
288
288
|
"node_modules/smol-toml": {
|
|
289
|
-
"version": "1.6.
|
|
290
|
-
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.
|
|
291
|
-
"integrity": "sha512-
|
|
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.
|
|
316
|
-
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.
|
|
317
|
-
"integrity": "sha512-
|
|
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
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.
|
|
4
|
+
version: 0.27.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thijs Cadier
|
|
@@ -176,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
176
176
|
- !ruby/object:Gem::Version
|
|
177
177
|
version: '0'
|
|
178
178
|
requirements: []
|
|
179
|
-
rubygems_version: 4.0.
|
|
179
|
+
rubygems_version: 4.0.10
|
|
180
180
|
specification_version: 4
|
|
181
181
|
summary: The rdkafka gem is a modern Kafka client library for Ruby based on librdkafka.
|
|
182
182
|
It wraps the production-ready C client using the ffi gem and targets Kafka 1.0+
|