diff --git a/src/connection.rs b/src/connection.rs index e55c086d..6b9b8c0a 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -431,9 +431,11 @@ impl ConnectionSender { producer_id: u64, producer_name: Option, options: ProducerOptions, + epoch: u64, + user_provided_producer_name: bool, ) -> Result { let request_id = self.request_id.get(); - let msg = messages::create_producer(topic, producer_name, producer_id, request_id, options); + let msg = messages::create_producer(topic, producer_name, producer_id, request_id, options, epoch, user_provided_producer_name); self.send_message(msg, RequestKey::RequestId(request_id), |resp| { resp.command.producer_success }) @@ -1227,6 +1229,8 @@ pub(crate) mod messages { producer_id: u64, request_id: u64, options: ProducerOptions, + epoch: u64, + user_provided_producer_name: bool, ) -> Message { Message { command: proto::BaseCommand { @@ -1235,6 +1239,7 @@ pub(crate) mod messages { topic, producer_id, request_id, + user_provided_producer_name: Some(user_provided_producer_name), producer_name, encrypted: options.encrypted, metadata: options @@ -1247,6 +1252,7 @@ pub(crate) mod messages { .collect(), schema: options.schema, producer_access_mode: options.access_mode, + epoch: Some(epoch), ..Default::default() }), ..Default::default() diff --git a/src/producer.rs b/src/producer.rs index 9a8c00ec..85e76939 100644 --- a/src/producer.rs +++ b/src/producer.rs @@ -433,6 +433,8 @@ struct TopicProducer { batch: Option>, compression: Option, options: ProducerOptions, + epoch: std::sync::atomic::AtomicU64, + user_provided_producer_name: bool, } impl TopicProducer { @@ -455,6 +457,8 @@ impl TopicProducer { let batch_byte_size = options.batch_byte_size; let compression = options.compression.clone(); let mut connection = client.manager.get_connection(&addr).await?; + let epoch = std::sync::atomic::AtomicU64::new(0); + let user_provided_producer_name = name.is_some(); let producer_name = retry_create_producer( &client, @@ -464,6 +468,8 @@ impl TopicProducer { producer_id, name, &options, + &epoch, + user_provided_producer_name, ) .await?; @@ -481,6 +487,8 @@ impl TopicProducer { batch, compression, options, + epoch, + user_provided_producer_name, }) } @@ -727,6 +735,8 @@ impl TopicProducer { self.id, Some(self.name.clone()), &self.options, + &self.epoch, + self.user_provided_producer_name, ) .await?; diff --git a/src/retry_op.rs b/src/retry_op.rs index 74f3f529..5c41b760 100644 --- a/src/retry_op.rs +++ b/src/retry_op.rs @@ -156,6 +156,8 @@ pub async fn retry_create_producer( producer_id: u64, producer_name: Option, options: &ProducerOptions, + epoch: &std::sync::atomic::AtomicU64, + user_provided_producer_name: bool, ) -> Result { *connection = client.manager.get_connection(&addr).await?; let mut current_retries = 0u32; @@ -174,6 +176,8 @@ pub async fn retry_create_producer( producer_id, producer_name.clone(), options.clone(), + epoch.fetch_add(1, std::sync::atomic::Ordering::Relaxed), + user_provided_producer_name ) .await {