mirror of
				https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka.git
				synced 2025-11-04 04:27:48 +00:00 
			
		
		
		
	Added logic to conditionally enable internal data
This commit is contained in:
		@@ -37,11 +37,13 @@ using std::move;
 | 
			
		||||
using std::string;
 | 
			
		||||
using std::chrono::milliseconds;
 | 
			
		||||
using std::unique_ptr;
 | 
			
		||||
using std::get;
 | 
			
		||||
 | 
			
		||||
namespace cppkafka {
 | 
			
		||||
 | 
			
		||||
Producer::Producer(Configuration config)
 | 
			
		||||
: KafkaHandleBase(move(config)), message_payload_policy_(PayloadPolicy::COPY_PAYLOAD) {
 | 
			
		||||
: KafkaHandleBase(move(config)), message_payload_policy_(PayloadPolicy::COPY_PAYLOAD),
 | 
			
		||||
  has_internal_data_(false) {
 | 
			
		||||
    char error_buffer[512];
 | 
			
		||||
    auto config_handle = get_configuration().get_handle();
 | 
			
		||||
    rd_kafka_conf_set_opaque(config_handle, this);
 | 
			
		||||
@@ -67,12 +69,7 @@ void Producer::produce(const MessageBuilder& builder) {
 | 
			
		||||
    const Buffer& payload = builder.payload();
 | 
			
		||||
    const Buffer& key = builder.key();
 | 
			
		||||
    const int policy = static_cast<int>(message_payload_policy_);
 | 
			
		||||
    void* opaque = builder.user_data();
 | 
			
		||||
    unique_ptr<MessageInternal> internal_data;
 | 
			
		||||
    if (get_configuration().get_delivery_report_callback()) {
 | 
			
		||||
        internal_data.reset(new MessageInternal(builder.user_data(), builder.internal()));
 | 
			
		||||
        opaque = internal_data.get();
 | 
			
		||||
    }
 | 
			
		||||
    LoadResult load_result = load_internal(builder.user_data(), builder.internal());
 | 
			
		||||
    auto result = rd_kafka_producev(get_handle(),
 | 
			
		||||
                                    RD_KAFKA_V_TOPIC(builder.topic().data()),
 | 
			
		||||
                                    RD_KAFKA_V_PARTITION(builder.partition()),
 | 
			
		||||
@@ -80,10 +77,10 @@ void Producer::produce(const MessageBuilder& builder) {
 | 
			
		||||
                                    RD_KAFKA_V_TIMESTAMP(builder.timestamp().count()),
 | 
			
		||||
                                    RD_KAFKA_V_KEY((void*)key.get_data(), key.get_size()),
 | 
			
		||||
                                    RD_KAFKA_V_VALUE((void*)payload.get_data(), payload.get_size()),
 | 
			
		||||
                                    RD_KAFKA_V_OPAQUE(opaque),
 | 
			
		||||
                                    RD_KAFKA_V_OPAQUE(get<0>(load_result)),
 | 
			
		||||
                                    RD_KAFKA_V_END);
 | 
			
		||||
    check_error(result);
 | 
			
		||||
    internal_data.release(); //data has been passed-on to rdkafka so we release ownership
 | 
			
		||||
    get<1>(load_result).release(); //data has been passed-on to rdkafka so we release ownership
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Producer::produce(const Message& message) {
 | 
			
		||||
@@ -91,12 +88,7 @@ void Producer::produce(const Message& message) {
 | 
			
		||||
    const Buffer& key = message.get_key();
 | 
			
		||||
    const int policy = static_cast<int>(message_payload_policy_);
 | 
			
		||||
    int64_t duration = message.get_timestamp() ? message.get_timestamp().get().get_timestamp().count() : 0;
 | 
			
		||||
    void* opaque = message.get_user_data();
 | 
			
		||||
    unique_ptr<MessageInternal> internal_data;
 | 
			
		||||
    if (get_configuration().get_delivery_report_callback()) {
 | 
			
		||||
        internal_data.reset(new MessageInternal(message.get_user_data(), message.internal()));
 | 
			
		||||
        opaque = internal_data.get();
 | 
			
		||||
    }
 | 
			
		||||
    LoadResult load_result = load_internal(message.get_user_data(), message.internal());
 | 
			
		||||
    auto result = rd_kafka_producev(get_handle(),
 | 
			
		||||
                                    RD_KAFKA_V_TOPIC(message.get_topic().data()),
 | 
			
		||||
                                    RD_KAFKA_V_PARTITION(message.get_partition()),
 | 
			
		||||
@@ -104,10 +96,10 @@ void Producer::produce(const Message& message) {
 | 
			
		||||
                                    RD_KAFKA_V_TIMESTAMP(duration),
 | 
			
		||||
                                    RD_KAFKA_V_KEY((void*)key.get_data(), key.get_size()),
 | 
			
		||||
                                    RD_KAFKA_V_VALUE((void*)payload.get_data(), payload.get_size()),
 | 
			
		||||
                                    RD_KAFKA_V_OPAQUE(opaque),
 | 
			
		||||
                                    RD_KAFKA_V_OPAQUE(get<0>(load_result)),
 | 
			
		||||
                                    RD_KAFKA_V_END);
 | 
			
		||||
    check_error(result);
 | 
			
		||||
    internal_data.release(); //data has been passed-on to rdkafka so we release ownership
 | 
			
		||||
    get<1>(load_result).release(); //data has been passed-on to rdkafka so we release ownership
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Producer::poll() {
 | 
			
		||||
@@ -127,4 +119,16 @@ void Producer::flush(milliseconds timeout) {
 | 
			
		||||
    check_error(result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Producer::LoadResult Producer::load_internal(void* user_data, InternalPtr internal) {
 | 
			
		||||
    unique_ptr<MessageInternal> internal_data;
 | 
			
		||||
    if (!has_internal_data_ && internal) {
 | 
			
		||||
        has_internal_data_ = true; //enable once for this producer
 | 
			
		||||
    }
 | 
			
		||||
    if (has_internal_data_ && get_configuration().get_delivery_report_callback()) {
 | 
			
		||||
        internal_data.reset(new MessageInternal(user_data, internal));
 | 
			
		||||
        user_data = internal_data.get(); //point to the internal data
 | 
			
		||||
    }
 | 
			
		||||
    return LoadResult(user_data, move(internal_data));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // cppkafka
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user