Added logic to conditionally enable internal data

This commit is contained in:
accelerated
2018-06-05 09:07:00 -04:00
parent 597c026555
commit f746653841
8 changed files with 125 additions and 57 deletions

View File

@@ -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