File tree Expand file tree Collapse file tree 2 files changed +48
-1
lines changed Expand file tree Collapse file tree 2 files changed +48
-1
lines changed Original file line number Diff line number Diff line change @@ -71,7 +71,29 @@ def list_offsets(**options)
71
71
def produce ( **options )
72
72
request = Protocol ::ProduceRequest . new ( **options )
73
73
74
- send_request ( request )
74
+ resp = send_request ( request )
75
+
76
+ return if resp . nil?
77
+
78
+ errored_partitions = [ ]
79
+ resp . topics . each do |topic_info |
80
+ errored = topic_info . partitions . find { |part_info | part_info . error_code == 2 }
81
+ errored_partitions << errored unless errored . nil?
82
+ end
83
+
84
+ errored_partitions . each do |partition_info |
85
+ @logger . error "Corrupt message code received for #{ request } to partition #{ partition_info . partition } "
86
+
87
+ # {"topic" => {"partition" => [message, message] }}
88
+ request . messages_for_topics . each do |topic , messages_for_partition |
89
+ messages_for_partition . fetch ( partition_info . partition , [ ] ) . each do |message |
90
+ @logger . error "Message key: #{ message . key } "
91
+ @logger . error "Message value: #{ message . value } "
92
+ end
93
+ end
94
+ end
95
+
96
+ resp
75
97
end
76
98
77
99
def fetch_offsets ( **options )
Original file line number Diff line number Diff line change @@ -69,6 +69,31 @@ def close
69
69
describe "#produce" do
70
70
let ( :message ) { Kafka ::Protocol ::Message . new ( key : "yo" , value : "lo" ) }
71
71
72
+ # This spec's only function is to exercise the error handling code path
73
+ it "gives me a console if a partition is in error" do
74
+ response = Kafka ::Protocol ::ProduceResponse . new
75
+ errored_partition_info = Kafka ::Protocol ::ProduceResponse ::PartitionInfo . new (
76
+ partition : 3 , error_code : 2 , offset : 0 , timestamp : Time . now . to_s
77
+ )
78
+ topic_info = Kafka ::Protocol ::ProduceResponse ::TopicInfo . new (
79
+ topic : "articles" , partitions : [ errored_partition_info ]
80
+ )
81
+ allow ( response ) . to receive ( :topics ) { [ topic_info ] }
82
+ connection . mock_response ( response )
83
+
84
+ actual_response = broker . produce (
85
+ required_acks : -1 , # -1 means all replicas must ack
86
+ timeout : 1 ,
87
+ messages_for_topics : {
88
+ "yolos" => {
89
+ 3 => [ message ] ,
90
+ }
91
+ }
92
+ )
93
+
94
+ expect ( actual_response ) . to eq response
95
+
96
+ end
72
97
it "waits for a response if acknowledgements are required" do
73
98
response = Kafka ::Protocol ::ProduceResponse . new
74
99
connection . mock_response ( response )
You can’t perform that action at this time.
0 commit comments