You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Suriyan (JIRA)" <ji...@apache.org> on 2010/07/09 20:24:51 UTC
[jira] Created: (AMQ-2820) Deadlock occur in the RegionBroker.java
when remove stale connection
Deadlock occur in the RegionBroker.java when remove stale connection
--------------------------------------------------------------------
Key: AMQ-2820
URL: https://issues.apache.org/activemq/browse/AMQ-2820
Project: ActiveMQ
Issue Type: Bug
Components: Broker
Affects Versions: 5.3.2, 5.3.1, 5.3.0, 5.2.0, 5.1.0, 5.0.0
Reporter: Suriyan
Priority: Minor
{code:title=RegionBroker.java|borderStyle=solid}
213 @Override
214 public void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception {
215 String clientId = info.getClientId();
216 if (clientId == null) {
217 throw new InvalidClientIDException("No clientID specified for connection request");
218 }
219 synchronized (clientIdSet) {
220 ConnectionContext oldContext = clientIdSet.get(clientId);
221 if (oldContext != null) {
222 if (context.isFaultTolerant() || context.isNetworkConnection()){
223 //remove the old connection
224 try{
225 removeConnection(oldContext, info, new Exception("remove stale client"));
226 }catch(Exception e){
227 LOG.warn("Failed to remove stale connection ",e);
228 }
229 }else{
230 throw new InvalidClientIDException("Broker: " + getBrokerName() + " - Client: " + clientId + " already connected from "
231 + oldContext.getConnection().getRemoteAddress());
232 }
233 } else {
234 clientIdSet.put(clientId, context);
235 }
236 }
237
238 connections.add(context.getConnection());
239 }
240
241 @Override
242 public void removeConnection(ConnectionContext context, ConnectionInfo info, Throwable error) throws Exception {
243 String clientId = info.getClientId();
244 if (clientId == null) {
245 throw new InvalidClientIDException("No clientID specified for connection disconnect request");
246 }
247 synchronized (clientIdSet) {
248 ConnectionContext oldValue = clientIdSet.get(clientId);
249 // we may be removing the duplicate connection, not the first
250 // connection to be created
251 // so lets check that their connection IDs are the same
252 if (oldValue == context) {
253 if (isEqual(oldValue.getConnectionId(), info.getConnectionId())) {
254 clientIdSet.remove(clientId);
255 }
256 }
257 }
258 connections.remove(context.getConnection());
259 }
{code}
In the removeConnection(...) method need to synchronized for clientIdSet object. Deadlock will occur when removeConnection(...) is called in the synchronized(clientIdSet) context from the addConnection(...) method (line 225).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Commented: (AMQ-2820) Deadlock occur in the
RegionBroker.java when remove stale connection
Posted by "Rob Davies (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/activemq/browse/AMQ-2820?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=60567#action_60567 ]
Rob Davies commented on AMQ-2820:
---------------------------------
The thread would already have the lock on clientIdSet before calling removeConnection() - so not sure why you think there would be a deadlock - do you have a stacktrace ?
> Deadlock occur in the RegionBroker.java when remove stale connection
> --------------------------------------------------------------------
>
> Key: AMQ-2820
> URL: https://issues.apache.org/activemq/browse/AMQ-2820
> Project: ActiveMQ
> Issue Type: Bug
> Components: Broker
> Affects Versions: 5.0.0, 5.1.0, 5.2.0, 5.3.0, 5.3.1, 5.3.2
> Reporter: Suriyan
> Priority: Minor
>
> {code:title=RegionBroker.java|borderStyle=solid}
> 213 @Override
> 214 public void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception {
> 215 String clientId = info.getClientId();
> 216 if (clientId == null) {
> 217 throw new InvalidClientIDException("No clientID specified for connection request");
> 218 }
> 219 synchronized (clientIdSet) {
> 220 ConnectionContext oldContext = clientIdSet.get(clientId);
> 221 if (oldContext != null) {
> 222 if (context.isFaultTolerant() || context.isNetworkConnection()){
> 223 //remove the old connection
> 224 try{
> 225 removeConnection(oldContext, info, new Exception("remove stale client"));
> 226 }catch(Exception e){
> 227 LOG.warn("Failed to remove stale connection ",e);
> 228 }
> 229 }else{
> 230 throw new InvalidClientIDException("Broker: " + getBrokerName() + " - Client: " + clientId + " already connected from "
> 231 + oldContext.getConnection().getRemoteAddress());
> 232 }
> 233 } else {
> 234 clientIdSet.put(clientId, context);
> 235 }
> 236 }
> 237
> 238 connections.add(context.getConnection());
> 239 }
> 240
> 241 @Override
> 242 public void removeConnection(ConnectionContext context, ConnectionInfo info, Throwable error) throws Exception {
> 243 String clientId = info.getClientId();
> 244 if (clientId == null) {
> 245 throw new InvalidClientIDException("No clientID specified for connection disconnect request");
> 246 }
> 247 synchronized (clientIdSet) {
> 248 ConnectionContext oldValue = clientIdSet.get(clientId);
> 249 // we may be removing the duplicate connection, not the first
> 250 // connection to be created
> 251 // so lets check that their connection IDs are the same
> 252 if (oldValue == context) {
> 253 if (isEqual(oldValue.getConnectionId(), info.getConnectionId())) {
> 254 clientIdSet.remove(clientId);
> 255 }
> 256 }
> 257 }
> 258 connections.remove(context.getConnection());
> 259 }
> {code}
> In the removeConnection(...) method need to synchronized for clientIdSet object. Deadlock will occur when removeConnection(...) is called in the synchronized(clientIdSet) context from the addConnection(...) method (line 225).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Commented: (AMQ-2820) Deadlock occur in the
RegionBroker.java when remove stale connection
Posted by "Suriyan (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/activemq/browse/AMQ-2820?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=60570#action_60570 ]
Suriyan commented on AMQ-2820:
------------------------------
Sorry, I've misunderstand in Java synchronization.
Thanks for your comment.
> Deadlock occur in the RegionBroker.java when remove stale connection
> --------------------------------------------------------------------
>
> Key: AMQ-2820
> URL: https://issues.apache.org/activemq/browse/AMQ-2820
> Project: ActiveMQ
> Issue Type: Bug
> Components: Broker
> Affects Versions: 5.0.0, 5.1.0, 5.2.0, 5.3.0, 5.3.1, 5.3.2
> Reporter: Suriyan
> Priority: Minor
>
> {code:title=RegionBroker.java|borderStyle=solid}
> 213 @Override
> 214 public void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception {
> 215 String clientId = info.getClientId();
> 216 if (clientId == null) {
> 217 throw new InvalidClientIDException("No clientID specified for connection request");
> 218 }
> 219 synchronized (clientIdSet) {
> 220 ConnectionContext oldContext = clientIdSet.get(clientId);
> 221 if (oldContext != null) {
> 222 if (context.isFaultTolerant() || context.isNetworkConnection()){
> 223 //remove the old connection
> 224 try{
> 225 removeConnection(oldContext, info, new Exception("remove stale client"));
> 226 }catch(Exception e){
> 227 LOG.warn("Failed to remove stale connection ",e);
> 228 }
> 229 }else{
> 230 throw new InvalidClientIDException("Broker: " + getBrokerName() + " - Client: " + clientId + " already connected from "
> 231 + oldContext.getConnection().getRemoteAddress());
> 232 }
> 233 } else {
> 234 clientIdSet.put(clientId, context);
> 235 }
> 236 }
> 237
> 238 connections.add(context.getConnection());
> 239 }
> 240
> 241 @Override
> 242 public void removeConnection(ConnectionContext context, ConnectionInfo info, Throwable error) throws Exception {
> 243 String clientId = info.getClientId();
> 244 if (clientId == null) {
> 245 throw new InvalidClientIDException("No clientID specified for connection disconnect request");
> 246 }
> 247 synchronized (clientIdSet) {
> 248 ConnectionContext oldValue = clientIdSet.get(clientId);
> 249 // we may be removing the duplicate connection, not the first
> 250 // connection to be created
> 251 // so lets check that their connection IDs are the same
> 252 if (oldValue == context) {
> 253 if (isEqual(oldValue.getConnectionId(), info.getConnectionId())) {
> 254 clientIdSet.remove(clientId);
> 255 }
> 256 }
> 257 }
> 258 connections.remove(context.getConnection());
> 259 }
> {code}
> In the removeConnection(...) method need to synchronized for clientIdSet object. Deadlock will occur when removeConnection(...) is called in the synchronized(clientIdSet) context from the addConnection(...) method (line 225).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.