@@ -185,7 +185,49 @@ func newPartitionProducer(client *client, topic string, options *ProducerOptions
185
185
} else {
186
186
p .userProvidedProducerName = false
187
187
}
188
- err := p .grabCnx ()
188
+ // retry to create producer when failed with maxRetry
189
+ var maxRetry int
190
+ if p .options .MaxReconnectToBroker == nil {
191
+ maxRetry = - 1
192
+ } else {
193
+ maxRetry = int (* p .options .MaxReconnectToBroker )
194
+ }
195
+
196
+ var delayReconnectTime time.Duration
197
+ defaultBackoff := internal.DefaultBackoff {}
198
+
199
+ var err error
200
+ for maxRetry != 0 {
201
+ if p .options .BackoffPolicy == nil {
202
+ delayReconnectTime = defaultBackoff .Next ()
203
+ } else {
204
+ delayReconnectTime = p .options .BackoffPolicy .Next ()
205
+ }
206
+
207
+ atomic .AddUint64 (& p .epoch , 1 )
208
+ err = p .grabCnx ()
209
+ if err == nil {
210
+ break
211
+ }
212
+ p .log .WithError (err ).Error ("Failed to create producer at newPartitionProducer" )
213
+ errMsg := err .Error ()
214
+ if strings .Contains (errMsg , errTopicNotFount ) {
215
+ // when topic is not found, do not attempt to reconnect
216
+ p .log .Warn ("Failed to create producer due to Topic Not Found" )
217
+ break
218
+ }
219
+
220
+ if strings .Contains (errMsg , "TopicTerminatedError" ) {
221
+ p .log .Info ("Topic was terminated, failing pending messages, will not create producer" )
222
+ break
223
+ }
224
+
225
+ if maxRetry > 0 {
226
+ maxRetry --
227
+ }
228
+ logger .WithError (err ).Error ("Failed to create producer at newPartitionProducer retry to create producer" , delayReconnectTime )
229
+ time .Sleep (delayReconnectTime )
230
+ }
189
231
if err != nil {
190
232
p .batchFlushTicker .Stop ()
191
233
logger .WithError (err ).Error ("Failed to create producer at newPartitionProducer" )
0 commit comments