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]

Reply via email to