@@ -35,6 +35,7 @@ describe('Producer > sendMessages', () => {
35
35
1 : { nodeId : 1 , produce : jest . fn ( ( ) => createProducerResponse ( topic , 0 ) ) } ,
36
36
2 : { nodeId : 2 , produce : jest . fn ( ( ) => createProducerResponse ( topic , 1 ) ) } ,
37
37
3 : { nodeId : 3 , produce : jest . fn ( ( ) => createProducerResponse ( topic , 2 ) ) } ,
38
+ 4 : { nodeId : 4 , produce : jest . fn ( ( ) => createProducerResponse ( topic , 1 ) ) } ,
38
39
}
39
40
cluster = {
40
41
addTargetTopic : jest . fn ( ) ,
@@ -75,8 +76,8 @@ describe('Producer > sendMessages', () => {
75
76
expect ( brokers [ 2 ] . produce ) . toHaveBeenCalledTimes ( 1 )
76
77
expect ( brokers [ 3 ] . produce ) . toHaveBeenCalledTimes ( 3 )
77
78
expect ( response ) . toEqual ( [
78
- { errorCode : 0 , offset : '0' , partition : 0 , timestamp : '-1' , topicName : 'topic-name' } ,
79
79
{ errorCode : 0 , offset : '1' , partition : 1 , timestamp : '-1' , topicName : 'topic-name' } ,
80
+ { errorCode : 0 , offset : '0' , partition : 0 , timestamp : '-1' , topicName : 'topic-name' } ,
80
81
{ errorCode : 0 , offset : '2' , partition : 2 , timestamp : '-1' , topicName : 'topic-name' } ,
81
82
] )
82
83
} )
@@ -108,4 +109,31 @@ describe('Producer > sendMessages', () => {
108
109
expect ( cluster . refreshMetadata ) . toHaveBeenCalled ( )
109
110
} )
110
111
}
112
+
113
+ test ( 'does not re-produce messages to brokers that are no longer leaders after metadata refresh' , async ( ) => {
114
+ const sendMessages = createSendMessages ( { logger : newLogger ( ) , cluster, partitioner } )
115
+
116
+ brokers [ 2 ] . produce
117
+ . mockImplementationOnce ( ( ) => {
118
+ const e = new Error ( 'Some error broker 1' )
119
+ e . type = 'NOT_LEADER_FOR_PARTITION'
120
+ throw e
121
+ } )
122
+ . mockImplementationOnce ( ( ) => createProducerResponse ( topic , 0 ) )
123
+ cluster . findLeaderForPartitions
124
+ . mockImplementationOnce ( ( ) => partitionsPerLeader )
125
+ . mockImplementationOnce ( ( ) => ( {
126
+ 1 : [ 0 ] ,
127
+ 4 : [ 1 ] , // Broker 4 replaces broker 2 as leader for partition 1
128
+ 3 : [ 2 ] ,
129
+ } ) )
130
+
131
+ const response = await sendMessages ( { topic, messages } )
132
+
133
+ expect ( response ) . toEqual ( [
134
+ { errorCode : 0 , offset : '0' , partition : 0 , timestamp : '-1' , topicName : 'topic-name' } ,
135
+ { errorCode : 0 , offset : '2' , partition : 2 , timestamp : '-1' , topicName : 'topic-name' } ,
136
+ { errorCode : 0 , offset : '1' , partition : 1 , timestamp : '-1' , topicName : 'topic-name' } ,
137
+ ] )
138
+ } )
111
139
} )
0 commit comments