You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Pavel (Jira)" <ji...@apache.org> on 2019/09/02 12:10:00 UTC

[jira] [Created] (QPID-8359) Coredump when acknowledge call

Pavel created QPID-8359:
---------------------------

             Summary: Coredump when acknowledge call
                 Key: QPID-8359
                 URL: https://issues.apache.org/jira/browse/QPID-8359
             Project: Qpid
          Issue Type: Bug
          Components: C++ Build
    Affects Versions: qpid-cpp-1.38.0
         Environment: *{{}}*
            Reporter: Pavel
             Fix For: Future


We are use using Apache qpid version: 1.38
Internally using: qpid-proton-0.21.0

We got coredump when multiple acknowledge:

 

#0 0x00007f234f09b207 in raise () from /lib64/libc.so.6
#1 0x00007f234f09c8f8 in abort () from /lib64/libc.so.6
#2 0x00007f2352987bc6 in ?? () from /opt/gts/usr/lib64/libbaseshell.so.1.3
#3 <signal handler called>
#4 pni_add_tpwork (delivery=0x7f215802a090)
 at /sw/int/prisma/contint/thirdparty/qpid-proton/000.004.002/8300001.5/x86_64-el7-linux-gnu-nvcc_gcc-v200-relwithdebinfofile/_CPackGTS_Packages/workspace/RPM/BUILD/qpid-proton-0.21.0/proton-c/src/core/engine.c:728
#5 0x00007f235d08f9da in qpid::messaging::amqp::SessionContext::acknowledge (this=this@entry=0x7f21fc000eb0, begin=..., begin@entry=..., end=...)
 at /sw/int/prisma/contint/thirdparty/qpid-cpp/000.009.001/8300001.5/x86_64-el7-linux-gnu-nvcc_gcc-v200-relwithdebinfofile/_CPackGTS_Packages/workspace/RPM/BUILD/qpid-1.38.0/src/qpid/messaging/amqp/SessionContext.cpp:166
#6 0x00007f235d0909b0 in qpid::messaging::amqp::SessionContext::acknowledge (this=<optimized out>, id=..., cumulative=cumulative@entry=true)
 at /sw/int/prisma/contint/thirdparty/qpid-cpp/000.009.001/8300001.5/x86_64-el7-linux-gnu-nvcc_gcc-v200-relwithdebinfofile/_CPackGTS_Packages/workspace/RPM/BUILD/qpid-1.38.0/src/qpid/messaging/amqp/SessionContext.cpp:187
#7 0x00007f235d066e48 in qpid::messaging::amqp::ConnectionContext::acknowledgeLH (this=this@entry=0x7f2178023c70, ssn=..., message=message@entry=0x7f21783e9958, 
cumulative=<optimized out>)

The issue is: delivery has been settled before settlement of same delivery:

From gdb:

(gdb) frame 4
#4 pni_add_tpwork (delivery=0x7f215802a090)
 at /sw/int/prisma/contint/thirdparty/qpid-proton/000.004.002/8300001.5/x86_64-el7-linux-gnu-nvcc_gcc-v200-relwithdebinfofile/_CPackGTS_Packages/workspace/RPM/BUILD/qpid-proton-0.21.0/proton-c/src/core/engine.c:728
728 in /sw/int/prisma/contint/thirdparty/qpid-proton/000.004.002/8300001.5/x86_64-el7-linux-gnu-nvcc_gcc-v200-relwithdebinfofile/_CPackGTS_Packages/workspace/RPM/BUILD/qpid-proton-0.21.0/proton-c/src/core/engine.c
(gdb) print *delivery
$3 = \{local = {condition = {name = 0x7f215802a630, description = 0x7f215802a680, info = 0x7f215802a6d0}, type = 36, data = 0x7f215802a210, annotations = 0x7f215802a420, 
 section_offset = 0, section_number = 0, failed = false, undeliverable = false, settled = true}, remote = {condition = {name = 0x7f215802ad00, description = 0x7f215802ad50, 
 info = 0x7f215802ada0}, type = 0, data = 0x7f215802a8e0, annotations = 0x7f215802aaf0, section_offset = 0, section_number = 0, failed = false, undeliverable = false, 
 settled = true}, link = 0x0, tag = 0x7f215802a180, unsettled_next = 0x7f215802d010, unsettled_prev = 0x0, work_next = 0x7f215802d010, work_prev = 0x0, 
 tpwork_next = 0x7f215802d010, tpwork_prev = 0x0, state = \{id = 3, sending = false, sent = false, init = false}, bytes = 0x7f215802a1d0, context = 0x7f215802afb0, updated = true, 
 settled = true, work = false, tpwork = false, done = true, referenced = false, aborted = false}
(gdb)

The problem occurred 5 times (rarely) when application starts receiving messages, normally does not occur for long time.

I tried to find cause of the issue, but I did not find the real source of problem.
I presume the issue may be fixed by one of the following solutions:

1) Add delivery to record only when the delivery is not in unacked (I presume one delivery stored twice or more in unacked upon several ID, but I can not confirm it from coredump):

qpid::framing::SequenceNumber SessionContext::record(pn_delivery_t* delivery)

 

2) Do settlement only when delivery has not been settled:
void SessionContext::acknowledge(DeliveryMap::iterator begin, DeliveryMap::iterator end)
{
 error.raise();
 for (DeliveryMap::iterator i = begin; i != end; ++i) {
 types::Variant txState;
 if (transaction) {
 QPID_LOG(trace, "Setting disposition for transactional delivery "
 << i->first << " -> " << i->second);
 transaction->acknowledge(i->second);
 } else {
 QPID_LOG(trace, "Setting disposition for delivery " << i->first << " -> " << i->second);
 *if (!pn_delivery_settled(delivery)) {*
 *ry_update(i->second, PN_ACCEPTED);*
 *pn_delivery_settle(i->second); //TODO: different settlement modes?*
 *}*
 }
 }
 unacked.erase(begin, end);
}

 

 



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org