Daniil Kirilyuk created QPID-8491:
-------------------------------------

             Summary: Connection leak when using CPP qpid-proton client
                 Key: QPID-8491
                 URL: https://issues.apache.org/jira/browse/QPID-8491
             Project: Qpid
          Issue Type: Bug
          Components: Broker-J
    Affects Versions: qpid-java-broker-8.0.2
            Reporter: Daniil Kirilyuk
         Attachments: broker.log, simple_recv.cpp

Issue is similar to QPID-8477: when broker is configured to accept limited 
number of connections from certain client and client is not well behaved, there 
is a possibility to exceed configured connection limit.

*Steps to reproduce*

1. Configure broker to allow only 1 connection

 

3. Prepare certificates

 

4. Install Qpid::Proton 0.28.0

wget 
[http://archive.apache.org/dist/qpid/proton/0.28.0/qpid-proton-0.28.0.tar.gz]

gunzip qpid-proton-0.28.0.tar.gz

mkdir -p qpid-proton-0.28.0/build && pushd qpid-proton-0.28.0/build && cmake .. 
&& make all && popd

5. Replace and edit example *qpid-proton-0.28.0/cpp/examples/simple_recv.cpp* 
with the one attached

6. Build again

cd qpid-proton-0.28.0/build

make

7. Start clients

./cpp/examples/simple_recv & ./cpp/examples/simple_recv

 8. Check connection count
curl 
[http://admin_user:password@your_broker_host:http_administration_port/api/latest/querybroker/VirtualHost?select=connectionCount]

*Analysis:*

Client outputs following error message:

{{Connection error}}
{{[0x1c4fac0]:unable to find an open available channel within limit of 0}}
{{[0x1c4fac0]:process error -2}}

In broker log following stacktrace is seen:
{noformat}
2020-12-09 11:03:32,252 WARN  [IO-/10.112.45.3:45094] 
(o.a.q.s.p.v.f.FrameHandler) - Unexpected exception handling frame
org.apache.qpid.server.util.ConnectionScopedRuntimeException: Unexpected state, 
client has sent frame in an illegal order.  Required state: OPENED, actual 
state: CLOSED
        at 
org.apache.qpid.server.protocol.v1_0.AMQPConnection_1_0Impl.assertState(AMQPConnection_1_0Impl.java:1768)
        at 
org.apache.qpid.server.protocol.v1_0.AMQPConnection_1_0Impl.receiveBegin(AMQPConnection_1_0Impl.java:701)
        at 
org.apache.qpid.server.protocol.v1_0.type.transport.Begin.invoke(Begin.java:230)
        at 
org.apache.qpid.server.protocol.v1_0.AMQPConnection_1_0Impl.received(AMQPConnection_1_0Impl.java:515)
        at 
org.apache.qpid.server.protocol.v1_0.AMQPConnection_1_0Impl.receive(AMQPConnection_1_0Impl.java:480)
        at 
org.apache.qpid.server.protocol.v1_0.framing.FrameHandler.parse(FrameHandler.java:224)
        at 
org.apache.qpid.server.protocol.v1_0.AMQPConnection_1_0Impl.onReceive(AMQPConnection_1_0Impl.java:1312)
        at 
org.apache.qpid.server.transport.AbstractAMQPConnection.lambda$received$2(AbstractAMQPConnection.java:576)
        at java.security.AccessController.doPrivileged(Native Method)
        at 
org.apache.qpid.server.transport.AbstractAMQPConnection.received(AbstractAMQPConnection.java:571)
        at 
org.apache.qpid.server.transport.MultiVersionProtocolEngine.received(MultiVersionProtocolEngine.java:135)
        at 
org.apache.qpid.server.transport.NonBlockingConnection.processAmqpData(NonBlockingConnection.java:611)
        at 
org.apache.qpid.server.transport.NonBlockingConnectionTLSDelegate.processData(NonBlockingConnectionTLSDelegate.java:141)
        at 
org.apache.qpid.server.transport.NonBlockingConnection.doRead(NonBlockingConnection.java:496)
        at 
org.apache.qpid.server.transport.NonBlockingConnection.doWork(NonBlockingConnection.java:270)
        at 
org.apache.qpid.server.transport.NetworkConnectionScheduler.processConnection(NetworkConnectionScheduler.java:134)
        at 
org.apache.qpid.server.transport.SelectorThread$ConnectionProcessor.processConnection(SelectorThread.java:575)
        at 
org.apache.qpid.server.transport.SelectorThread$SelectionTask.performSelect(SelectorThread.java:366)
        at 
org.apache.qpid.server.transport.SelectorThread$SelectionTask.run(SelectorThread.java:97)
        at 
org.apache.qpid.server.transport.SelectorThread.run(SelectorThread.java:533)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at 
org.apache.qpid.server.bytebuffer.QpidByteBufferFactory.lambda$null$0(QpidByteBufferFactory.java:464)
        at java.lang.Thread.run(Thread.java:748)
{noformat}
 Error is triggered by following callback in qpid-proton cpp client:
{noformat}
void on_connection_open (proton::connection &c) {
 c.open_session();
 }
{noformat}
Broker receives session opening call AMQPConnection_1_0Impl.receiveBegin(). 
During the check whether connection is opened or not ( 
AMQPConnection_1_0Impl.assertState() ) an exception is thrown, which isn't 
handled and connection remains not closed.

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to