lib/rdkafka/error.rb in karafka-rdkafka-0.17.1 vs lib/rdkafka/error.rb in karafka-rdkafka-0.17.2.rc1

- old
+ new

@@ -4,10 +4,13 @@ # Base error class. class BaseError < RuntimeError; end # Error returned by the underlying rdkafka library. class RdkafkaError < BaseError + # Empty hash for details default allocation + EMPTY_HASH = {}.freeze + # The underlying raw error response # @return [Integer] attr_reader :rdkafka_response # Prefix to be used for human readable representation @@ -16,10 +19,14 @@ # Error message sent by the broker # @return [String] attr_reader :broker_message + # Optional details hash specific to a given error or empty hash if none or not supported + # @return [Hash] + attr_reader :details + class << self def build_from_c(response_ptr, message_prefix = nil, broker_message: nil) code = Rdkafka::Bindings.rd_kafka_error_code(response_ptr) return false if code.zero? @@ -52,11 +59,25 @@ unless response_ptr_or_code[:payload].null? message_prefix ||= response_ptr_or_code[:payload].read_string(response_ptr_or_code[:len]) end - new(response_ptr_or_code[:err], message_prefix, broker_message: broker_message) + details = if response_ptr_or_code[:rkt].null? + EMPTY_HASH + else + { + partition: response_ptr_or_code[:partition], + offset: response_ptr_or_code[:offset], + topic: Bindings.rd_kafka_topic_name(response_ptr_or_code[:rkt]) + }.freeze + end + new( + response_ptr_or_code[:err], + message_prefix, + broker_message: broker_message, + details: details + ) else build_from_c(response_ptr_or_code, message_prefix) end end @@ -71,18 +92,20 @@ response, message_prefix=nil, broker_message: nil, fatal: false, retryable: false, - abortable: false + abortable: false, + details: EMPTY_HASH ) raise TypeError.new("Response has to be an integer") unless response.is_a? Integer @rdkafka_response = response @message_prefix = message_prefix @broker_message = broker_message @fatal = fatal @retryable = retryable @abortable = abortable + @details = details end # This error's code, for example `:partition_eof`, `:msg_size_too_large`. # @return [Symbol] def code