You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Chris Poulsen (JIRA)" <ji...@apache.org> on 2017/08/14 07:50:01 UTC

[jira] [Updated] (JCR-4172) JCAManagedConnection only considers the most recent handle when getting session

     [ https://issues.apache.org/jira/browse/JCR-4172?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Chris Poulsen updated JCR-4172:
-------------------------------
    Attachment: jca-managed-connection-get-session-fix.patch

attach patch

> JCAManagedConnection only considers the most recent handle when getting session
> -------------------------------------------------------------------------------
>
>                 Key: JCR-4172
>                 URL: https://issues.apache.org/jira/browse/JCR-4172
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-jca
>    Affects Versions: 2.15.5
>         Environment: JTA/JCA enabled env.
>            Reporter: Chris Poulsen
>         Attachments: jca-managed-connection-get-session-fix.patch
>
>
> The code for checking JCASessionHandle validity only considers the most recent handle, even though there are several valid handles for the underlying session.
> Steps to reproduce in a JCA environment:
> Start TX
> Session s1 = repository.login( credentials() );
> Session s2 = repository.login( credentials() );
> s1.getRootNode();
> The exception thrown is: 
> java.lang.IllegalStateException: Inactive logical session handle called
> 	at org.apache.jackrabbit.jca.JCAManagedConnection.getSession(JCAManagedConnection.java:350)
> 	at org.apache.jackrabbit.jca.JCASessionHandle.getSession(JCASessionHandle.java:90)
> 	at org.apache.jackrabbit.jca.JCASessionHandle.getRootNode(JCASessionHandle.java:141)
> 	at AppTest$3.doInTransactionWithoutResult(AppTest.java:121)
> 	at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:34)
> 	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:139)
> 	at AppTest.txSessionAffinity(AppTest.java:115)
> The getSession looks like this:
>     /**
>      * Return the session.
>      */
>     public Session getSession(JCASessionHandle handle) {
>         synchronized (handles) {
>             if ((handles.size() > 0) && (handles.get(0) == handle)) {
>                 return session;
>             } else {
>                 throw new java.lang.IllegalStateException("Inactive logical session handle called");
>             }
>         }
>     }
> I think the:
>     if ((handles.size() > 0) && (handles.get(0) == handle)) {
> Should be:
>     if ( handles.contains( handle ) ) {
> I've tried rolling my own JCA archive with this code and then things work like expected.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)