@@ -366,9 +366,6 @@ class CPPKAFKA_API BufferedProducer {
366
366
367
367
template <typename BuilderType>
368
368
TrackerPtr add_tracker (BuilderType& builder) {
369
- if (!has_internal_data_ && (max_number_retries_ > 0 )) {
370
- has_internal_data_ = true ; // enable once
371
- }
372
369
if (has_internal_data_ && !builder.internal ()) {
373
370
// Add message tracker only if it hasn't been added before
374
371
TrackerPtr tracker = std::make_shared<Tracker>(SenderType::Async, max_number_retries_);
@@ -426,8 +423,7 @@ BufferedProducer<BufferType>::BufferedProducer(Configuration config)
426
423
427
424
template <typename BufferType>
428
425
void BufferedProducer<BufferType>::add_message(const MessageBuilder& builder) {
429
- add_tracker (const_cast <MessageBuilder&>(builder));
430
- do_add_message (builder, MessagePriority::Low, true );
426
+ add_message (Builder (builder)); // make ConcreteBuilder
431
427
}
432
428
433
429
template <typename BufferType>
@@ -438,19 +434,26 @@ void BufferedProducer<BufferType>::add_message(Builder builder) {
438
434
439
435
template <typename BufferType>
440
436
void BufferedProducer<BufferType>::produce(const MessageBuilder& builder) {
441
- add_tracker (const_cast <MessageBuilder&>(builder));
442
- async_produce (builder, true );
437
+ if (has_internal_data_) {
438
+ MessageBuilder builder_copy (builder.clone ());
439
+ add_tracker (builder_copy);
440
+ async_produce (builder_copy, true );
441
+ }
442
+ else {
443
+ async_produce (builder, true );
444
+ }
443
445
}
444
446
445
447
template <typename BufferType>
446
448
void BufferedProducer<BufferType>::sync_produce(const MessageBuilder& builder) {
447
- TrackerPtr tracker = add_tracker (const_cast <MessageBuilder&>(builder));
448
- if (tracker) {
449
+ if (has_internal_data_) {
450
+ MessageBuilder builder_copy (builder.clone ());
451
+ TrackerPtr tracker = add_tracker (builder_copy);
449
452
// produce until we succeed or we reach max retry limit
450
453
std::future<bool > should_retry;
451
454
do {
452
455
should_retry = tracker->get_new_future ();
453
- produce_message (builder );
456
+ produce_message (builder_copy );
454
457
wait_for_acks ();
455
458
}
456
459
while (should_retry.get ());
@@ -576,6 +579,9 @@ size_t BufferedProducer<BufferType>::get_flushes_in_progress() const {
576
579
577
580
template <typename BufferType>
578
581
void BufferedProducer<BufferType>::set_max_number_retries(size_t max_number_retries) {
582
+ if (!has_internal_data_ && (max_number_retries > 0 )) {
583
+ has_internal_data_ = true ; // enable once
584
+ }
579
585
max_number_retries_ = max_number_retries;
580
586
}
581
587
@@ -638,12 +644,12 @@ void BufferedProducer<BufferType>::async_produce(BuilderType&& builder, bool thr
638
644
if (test_params && test_params->force_produce_error_ ) {
639
645
throw HandleException (Error (RD_KAFKA_RESP_ERR_UNKNOWN));
640
646
}
641
- produce_message (std::forward<BuilderType>( builder) );
647
+ produce_message (builder);
642
648
}
643
649
catch (const HandleException& ex) {
644
650
// If we have a flush failure callback and it returns true, we retry producing this message later
645
651
CallbackInvoker<FlushFailureCallback> callback (" flush failure" , flush_failure_callback_, &producer_);
646
- if (!callback || callback (std::forward<BuilderType>( builder) , ex.get_error ())) {
652
+ if (!callback || callback (builder, ex.get_error ())) {
647
653
TrackerPtr tracker = std::static_pointer_cast<Tracker>(builder.internal ());
648
654
if (tracker && tracker->num_retries_ > 0 ) {
649
655
--tracker->num_retries_ ;
@@ -671,7 +677,7 @@ void BufferedProducer<BufferType>::on_delivery_report(const Message& message) {
671
677
// Get tracker data
672
678
TestParameters* test_params = get_test_parameters ();
673
679
TrackerPtr tracker = has_internal_data_ ?
674
- std::static_pointer_cast<Tracker>(MessageInternal::load (const_cast <Message&>(message))->internal_ ) : nullptr ;
680
+ std::static_pointer_cast<Tracker>(MessageInternal::load (const_cast <Message&>(message))->get_internal () ) : nullptr ;
675
681
bool should_retry = false ;
676
682
if (message.get_error () || (test_params && test_params->force_delivery_error_ )) {
677
683
// We should produce this message again if we don't have a produce failure callback
0 commit comments