This is an automated email from the ASF dual-hosted git repository.
tabish pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 568735ddf5 ARTEMIS-5800 Fix AMQP session leak
568735ddf5 is described below
commit 568735ddf5c63d084d92fa024c5a29264e3371ce
Author: iliya <[email protected]>
AuthorDate: Mon Dec 8 19:15:41 2025 +0300
ARTEMIS-5800 Fix AMQP session leak
When a connection is disconnected, it should be destroyed, otherwise the
AMQP session will not be closed on the local close event, which can cause a
session leak.
---
.../broker/ActiveMQProtonRemotingConnection.java | 6 ++++
.../tests/integration/amqp/AmqpSessionTest.java | 33 +++++++++++++++++-----
2 files changed, 32 insertions(+), 7 deletions(-)
diff --git
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ActiveMQProtonRemotingConnection.java
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ActiveMQProtonRemotingConnection.java
index 42ce980431..ad514e1d1e 100644
---
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ActiveMQProtonRemotingConnection.java
+++
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ActiveMQProtonRemotingConnection.java
@@ -144,6 +144,12 @@ public class ActiveMQProtonRemotingConnection extends
AbstractRemotingConnection
@Override
public void disconnect(boolean criticalError) {
+ if (destroyed) {
+ return;
+ }
+
+ destroyed = true;
+
ErrorCondition errorCondition = new ErrorCondition();
errorCondition.setCondition(AmqpSupport.CONNECTION_FORCED);
amqpConnection.close(errorCondition);
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSessionTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSessionTest.java
index 54b17db764..09a7b83579 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSessionTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSessionTest.java
@@ -16,15 +16,10 @@
*/
package org.apache.activemq.artemis.tests.integration.amqp;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-import java.lang.invoke.MethodHandles;
-import java.util.concurrent.TimeUnit;
-
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
+import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
+import org.apache.activemq.artemis.tests.util.Wait;
import org.apache.activemq.transport.amqp.client.AmqpClient;
import org.apache.activemq.transport.amqp.client.AmqpConnection;
import org.apache.activemq.transport.amqp.client.AmqpReceiver;
@@ -39,6 +34,13 @@ import org.junit.jupiter.api.Timeout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.lang.invoke.MethodHandles;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
public class AmqpSessionTest extends AmqpClientTestSupport {
private static final Logger logger =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -113,6 +115,23 @@ public class AmqpSessionTest extends AmqpClientTestSupport
{
connection.close();
}
+ @Test
+ public void testServerSessionCloseOnRemotingConnectionDisconnect() throws
Exception {
+ AmqpClient client = createAmqpClient();
+ AmqpConnection connection = addConnection(client.connect());
+ AmqpSession session = connection.createSession();
+
+ assertNotNull(session);
+
+ for (RemotingConnection remoteConnection :
server.getRemotingService().getConnections()) {
+ remoteConnection.disconnect(true);
+ }
+
+ Wait.assertTrue(connection::isClosed);
+
+ assertEquals(0, server.getSessions().size());
+ }
+
@Test
public void testSessionClosedOnServerEndsClientSession() throws Exception {
doTestSessionClosedOnServerEndsClientSession(false, false);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]