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]