You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Phillip Henry (JIRA)" <ji...@apache.org> on 2009/05/13 00:38:50 UTC

[jira] Created: (AMQ-2249) The pool is not being informed that invalid PooledSessions are being thrown away

The pool is not being informed that invalid PooledSessions are being thrown away
--------------------------------------------------------------------------------

                 Key: AMQ-2249
                 URL: https://issues.apache.org/activemq/browse/AMQ-2249
             Project: ActiveMQ
          Issue Type: Bug
          Components: Broker
    Affects Versions: 5.2.0
         Environment: Windows XP using ActiveMQ in conjunction with Jencks, Spring and JOTM.
            Reporter: Phillip Henry


PooledConnection.close() calls rollback() on the internal session. However, when the internal session is an instance of  ActiveMQXASession, this always results in a TransactionInProgressException being thrown (and subsequently caught). Unfortunately, in this path of execution, the session pool is not informed.

The sessionPool knows nothing about the session being discarded and ultimately, GenericObjectPool.borrowObject() blocks forever since _numActive is never decremented.

I think the pool should at least be told that the session has been invalidated (this is not a full fix but should at least stop any hanging threads). Below is a partial patch (I'll work on a full solution when I have time):

Index: activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java
===================================================================
--- activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (revision 768326)
+++ activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (working copy)
@@ -120,6 +120,7 @@
                         LOG.trace("Ignoring exception as discarding session: " + e1, e1);
                     }
                     session = null;
+                    sessionPool.invalidateSession(this);
                     return;
                 }
             }
Index: activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java
===================================================================
--- activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (revision 768326)
+++ activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (working copy)
@@ -59,6 +59,14 @@
             throw JMSExceptionSupport.create(e);
         }
     }
+    
+    public void invalidateSession(PooledSession session) throws JMSException {
+       try {
+            getSessionPool().invalidateObject(session);
+        } catch (Exception e) {
+            throw JMSExceptionSupport.create("Failed to invalidate session: " + e, e);
+        }
+    }
 
     public void returnSession(PooledSession session) throws JMSException {
         // lets check if we are already closed

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (AMQ-2249) The pool is not being informed that invalid PooledSessions are being thrown away

Posted by "Rob Davies (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/activemq/browse/AMQ-2249?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rob Davies resolved AMQ-2249.
-----------------------------

       Resolution: Fixed
    Fix Version/s: 5.3.0

patch applied in revision 813053

> The pool is not being informed that invalid PooledSessions are being thrown away
> --------------------------------------------------------------------------------
>
>                 Key: AMQ-2249
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2249
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.2.0
>         Environment: Windows XP using ActiveMQ in conjunction with Jencks, Spring and JOTM.
>            Reporter: Phillip Henry
>            Assignee: Rob Davies
>             Fix For: 5.3.0
>
>
> PooledConnection.close() calls rollback() on the internal session. However, when the internal session is an instance of  ActiveMQXASession, this always results in a TransactionInProgressException being thrown (and subsequently caught). Unfortunately, in this path of execution, the session pool is not informed.
> The sessionPool knows nothing about the session being discarded and ultimately, GenericObjectPool.borrowObject() blocks forever since _numActive is never decremented.
> I think the pool should at least be told that the session has been invalidated (this is not a full fix but should at least stop any hanging threads). Below is a partial patch (I'll work on a full solution when I have time):
> {code} 
> Index: activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java
> ===================================================================
> --- activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (revision 768326)
> +++ activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (working copy)
> @@ -120,6 +120,7 @@
>                          LOG.trace("Ignoring exception as discarding session: " + e1, e1);
>                      }
>                      session = null;
> +                    sessionPool.invalidateSession(this);
>                      return;
>                  }
>              }
> Index: activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java
> ===================================================================
> --- activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (revision 768326)
> +++ activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (working copy)
> @@ -59,6 +59,14 @@
>              throw JMSExceptionSupport.create(e);
>          }
>      }
> +    
> +    public void invalidateSession(PooledSession session) throws JMSException {
> +       try {
> +            getSessionPool().invalidateObject(session);
> +        } catch (Exception e) {
> +            throw JMSExceptionSupport.create("Failed to invalidate session: " + e, e);
> +        }
> +    }
>  
>      public void returnSession(PooledSession session) throws JMSException {
>          // lets check if we are already closed
> {code} 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Assigned: (AMQ-2249) The pool is not being informed that invalid PooledSessions are being thrown away

Posted by "Rob Davies (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/activemq/browse/AMQ-2249?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rob Davies reassigned AMQ-2249:
-------------------------------

    Assignee: Rob Davies

> The pool is not being informed that invalid PooledSessions are being thrown away
> --------------------------------------------------------------------------------
>
>                 Key: AMQ-2249
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2249
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.2.0
>         Environment: Windows XP using ActiveMQ in conjunction with Jencks, Spring and JOTM.
>            Reporter: Phillip Henry
>            Assignee: Rob Davies
>             Fix For: 5.3.0
>
>
> PooledConnection.close() calls rollback() on the internal session. However, when the internal session is an instance of  ActiveMQXASession, this always results in a TransactionInProgressException being thrown (and subsequently caught). Unfortunately, in this path of execution, the session pool is not informed.
> The sessionPool knows nothing about the session being discarded and ultimately, GenericObjectPool.borrowObject() blocks forever since _numActive is never decremented.
> I think the pool should at least be told that the session has been invalidated (this is not a full fix but should at least stop any hanging threads). Below is a partial patch (I'll work on a full solution when I have time):
> {code} 
> Index: activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java
> ===================================================================
> --- activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (revision 768326)
> +++ activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (working copy)
> @@ -120,6 +120,7 @@
>                          LOG.trace("Ignoring exception as discarding session: " + e1, e1);
>                      }
>                      session = null;
> +                    sessionPool.invalidateSession(this);
>                      return;
>                  }
>              }
> Index: activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java
> ===================================================================
> --- activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (revision 768326)
> +++ activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (working copy)
> @@ -59,6 +59,14 @@
>              throw JMSExceptionSupport.create(e);
>          }
>      }
> +    
> +    public void invalidateSession(PooledSession session) throws JMSException {
> +       try {
> +            getSessionPool().invalidateObject(session);
> +        } catch (Exception e) {
> +            throw JMSExceptionSupport.create("Failed to invalidate session: " + e, e);
> +        }
> +    }
>  
>      public void returnSession(PooledSession session) throws JMSException {
>          // lets check if we are already closed
> {code} 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (AMQ-2249) The pool is not being informed that invalid PooledSessions are being thrown away

Posted by "Phillip Henry (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/activemq/browse/AMQ-2249?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Phillip Henry updated AMQ-2249:
-------------------------------

    Description: 
PooledConnection.close() calls rollback() on the internal session. However, when the internal session is an instance of  ActiveMQXASession, this always results in a TransactionInProgressException being thrown (and subsequently caught). Unfortunately, in this path of execution, the session pool is not informed.

The sessionPool knows nothing about the session being discarded and ultimately, GenericObjectPool.borrowObject() blocks forever since _numActive is never decremented.

I think the pool should at least be told that the session has been invalidated (this is not a full fix but should at least stop any hanging threads). Below is a partial patch (I'll work on a full solution when I have time):
{code} 
Index: activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java
===================================================================
--- activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (revision 768326)
+++ activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (working copy)
@@ -120,6 +120,7 @@
                         LOG.trace("Ignoring exception as discarding session: " + e1, e1);
                     }
                     session = null;
+                    sessionPool.invalidateSession(this);
                     return;
                 }
             }
Index: activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java
===================================================================
--- activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (revision 768326)
+++ activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (working copy)
@@ -59,6 +59,14 @@
             throw JMSExceptionSupport.create(e);
         }
     }
+    
+    public void invalidateSession(PooledSession session) throws JMSException {
+       try {
+            getSessionPool().invalidateObject(session);
+        } catch (Exception e) {
+            throw JMSExceptionSupport.create("Failed to invalidate session: " + e, e);
+        }
+    }
 
     public void returnSession(PooledSession session) throws JMSException {
         // lets check if we are already closed
{code} 

  was:
PooledConnection.close() calls rollback() on the internal session. However, when the internal session is an instance of  ActiveMQXASession, this always results in a TransactionInProgressException being thrown (and subsequently caught). Unfortunately, in this path of execution, the session pool is not informed.

The sessionPool knows nothing about the session being discarded and ultimately, GenericObjectPool.borrowObject() blocks forever since _numActive is never decremented.

I think the pool should at least be told that the session has been invalidated (this is not a full fix but should at least stop any hanging threads). Below is a partial patch (I'll work on a full solution when I have time):

Index: activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java
===================================================================
--- activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (revision 768326)
+++ activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (working copy)
@@ -120,6 +120,7 @@
                         LOG.trace("Ignoring exception as discarding session: " + e1, e1);
                     }
                     session = null;
+                    sessionPool.invalidateSession(this);
                     return;
                 }
             }
Index: activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java
===================================================================
--- activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (revision 768326)
+++ activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (working copy)
@@ -59,6 +59,14 @@
             throw JMSExceptionSupport.create(e);
         }
     }
+    
+    public void invalidateSession(PooledSession session) throws JMSException {
+       try {
+            getSessionPool().invalidateObject(session);
+        } catch (Exception e) {
+            throw JMSExceptionSupport.create("Failed to invalidate session: " + e, e);
+        }
+    }
 
     public void returnSession(PooledSession session) throws JMSException {
         // lets check if we are already closed


> The pool is not being informed that invalid PooledSessions are being thrown away
> --------------------------------------------------------------------------------
>
>                 Key: AMQ-2249
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2249
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.2.0
>         Environment: Windows XP using ActiveMQ in conjunction with Jencks, Spring and JOTM.
>            Reporter: Phillip Henry
>
> PooledConnection.close() calls rollback() on the internal session. However, when the internal session is an instance of  ActiveMQXASession, this always results in a TransactionInProgressException being thrown (and subsequently caught). Unfortunately, in this path of execution, the session pool is not informed.
> The sessionPool knows nothing about the session being discarded and ultimately, GenericObjectPool.borrowObject() blocks forever since _numActive is never decremented.
> I think the pool should at least be told that the session has been invalidated (this is not a full fix but should at least stop any hanging threads). Below is a partial patch (I'll work on a full solution when I have time):
> {code} 
> Index: activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java
> ===================================================================
> --- activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (revision 768326)
> +++ activemq-pool/src/main/java/org/apache/activemq/pool/PooledSession.java     (working copy)
> @@ -120,6 +120,7 @@
>                          LOG.trace("Ignoring exception as discarding session: " + e1, e1);
>                      }
>                      session = null;
> +                    sessionPool.invalidateSession(this);
>                      return;
>                  }
>              }
> Index: activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java
> ===================================================================
> --- activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (revision 768326)
> +++ activemq-pool/src/main/java/org/apache/activemq/pool/SessionPool.java       (working copy)
> @@ -59,6 +59,14 @@
>              throw JMSExceptionSupport.create(e);
>          }
>      }
> +    
> +    public void invalidateSession(PooledSession session) throws JMSException {
> +       try {
> +            getSessionPool().invalidateObject(session);
> +        } catch (Exception e) {
> +            throw JMSExceptionSupport.create("Failed to invalidate session: " + e, e);
> +        }
> +    }
>  
>      public void returnSession(PooledSession session) throws JMSException {
>          // lets check if we are already closed
> {code} 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.