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)