You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by jb...@apache.org on 2025/12/05 16:26:11 UTC
(activemq-artemis) branch main updated: ARTEMIS-5735 avoid race b/w session creation & connection failure
This is an automated email from the ASF dual-hosted git repository.
jbertram pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 6700541d46 ARTEMIS-5735 avoid race b/w session creation & connection failure
6700541d46 is described below
commit 6700541d4604e2602551c8c64dac7d923fcbe165
Author: michaeladada <mi...@gmail.com>
AuthorDate: Fri Dec 5 18:26:06 2025 +0200
ARTEMIS-5735 avoid race b/w session creation & connection failure
---
.../artemis/core/protocol/openwire/OpenWireConnection.java | 10 ++++++++--
.../activemq/artemis/core/server/impl/ActiveMQServerImpl.java | 4 ++++
.../activemq/artemis/core/server/impl/ServerSessionImpl.java | 1 -
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
index 5f329426d2..e414d022b2 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
@@ -1224,6 +1224,14 @@ public class OpenWireConnection extends AbstractRemotingConnection implements Se
return null;
}
}
+
+ // In certain circumstances (e.g. JCA use-cases with the ActiveMQ RA) an OpenWire client can "clean up" a
+ // connection by sending a RemoveInfo command (which will "destroy" this broker-side connection) followed
+ // shortly by a ConnectionInfo command. In order to deal with this we "undestroy" the broker-side connection
+ // here. If we do not "undestroy" the connection here then creating the internal Core session will fail.
+ // See org.apache.activemq.ConnectionCleanupTest#testChangeClientID for a test that executes this scenario.
+ destroyed = false;
+
protocolManager.addConnection(OpenWireConnection.this, info);
} catch (Exception e) {
Response resp = new ExceptionResponse(e);
@@ -1238,8 +1246,6 @@ public class OpenWireConnection extends AbstractRemotingConnection implements Se
}
dispatchAsync(command);
}
- // During a chanceClientID a disconnect could have been sent by the client, and the client will then re-issue a connect packet
- destroyed = false;
return null;
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 4fa48902dc..cbea15b803 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -1926,6 +1926,10 @@ public class ActiveMQServerImpl implements ActiveMQServer {
sessions.put(name, session);
totalSessionCount.incrementAndGet();
+ connection.addFailureListener(session);
+ if (connection.isDestroyed()) {
+ session.close(true);
+ }
if (hasBrokerSessionPlugins()) {
callBrokerSessionPlugins(plugin -> plugin.afterCreateSession(session));
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
index b6ffaea8b3..04b3c49620 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
@@ -286,7 +286,6 @@ public class ServerSessionImpl extends CriticalComponentImpl implements ServerSe
this.defaultAddress = defaultAddress;
- remotingConnection.addFailureListener(this);
this.context = context;
this.sessionExecutor = server.getExecutorFactory().getExecutor();
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@activemq.apache.org
For additional commands, e-mail: commits-help@activemq.apache.org
For further information, visit: https://activemq.apache.org/contact