Hi,

We are using Apache Qpid Proton C++ library version 0.37 for posting logs
to Azure eventhub in my application. Recently we have seen some crashes in
the field which point to the pn_class_incref() function in Apache Qpid
Proton library. We could not get the Core dump file but we have got the
call stack which looks like below:

0# switch_signal_handler(int) in ./Switch
1# 0x00007F6A401CD520 in /lib/x86_64-linux-gnu/libc.so.6
2# pn_class_incref in /lib/libqpid-proton-core.so.10
3# pn_class_incref in /lib/libqpid-proton-core.so.10
4# proton::sender::send(proton::message const&, proton::binary const&) in
/lib/libqpid-proton-cpp.so.12
5# proton::sender::send(proton::message const&) in
/lib/libqpid-proton-cpp.so.12
6# LogUploaderClient::post_log_to_eventhub(char const*) in ./Switch
7# LogUploaderClient::process_new_log(char*) in ./Switch
8# LogUploaderClient::log_uploader_thread() in ./Switch
9# 0x00007F6A4048F2B3 in /lib/x86_64-linux-gnu/libstdc++.so.6
10# 0x00007F6A4021FB43 in /lib/x86_64-linux-gnu/libc.so.6
11# 0x00007F6A402B1A00 in /lib/x86_64-linux-gnu/libc.so.6

Please find below the implementation of the send method in application:
        bool send(std::string msg)
        {
            if ((msg.size() > 0) && (sendable_) && (sender_.credit() > 0))
            {
                proton::binary bodyBinary(msg.begin(), msg.end());
                proton::message m;
                m.body(bodyBinary);
                m.inferred(true);
                sender_.send(m);
                messages_sent_++;
                return true;
            }

            return false;
        }

Please note that sender_ is an object of proton::sender class.
Please find below the implementation of post_log_to_eventhub() method which
invokes this send method:

void LogUploaderClient::post_log_to_eventhub(const char* buf)
{
    if (log_eventhub_sender_)
    {
        const int32_t max_retries { 15 };
        const int32_t duration { 1 }; //second
        int32_t retry { 0 };

        while (!log_eventhub_sender_->ready())
        {
            retry++;
            if (retry > max_retries)
                break;
            usleep(duration * 1000 * 1000);
        }

        if (log_eventhub_sender_->ready())
        {
            log_eventhub_sender_->send(buf);
        }
    }
}

Unfortunately, we do not see this type of exception in our local lab
environment but it has been observed quite consistently in the field.

Any clue or help to diagnose and resolve this problem would really be
great. Please note that we have this signal handler (switch_signal_handler
function) registered for SIGINT, SIGSEGV and SIGABRT.

Thank you so much!

Best regards,
Arun

Reply via email to