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

Jukka Zitting resolved JCR-2870.
--------------------------------

       Resolution: Fixed
    Fix Version/s: 2.2.3
         Assignee: Jukka Zitting

Nice work, thanks! I committed the patch in revision 1065622 and merged it to 
the 2.2 branch in revision 1065623.

As a longer term solution it would be cleaner to make the RepositoryConfig 
objects stateless and move the ConnectionFactory to the RepositoryContext 
object where it would be tied to the lifecycle of the containing repository 
instance. But we can do that in a separate improvement issue.

> Transient Repository cannot be used more than once when configured with 
> DataSources
> -----------------------------------------------------------------------------------
>
>                 Key: JCR-2870
>                 URL: https://issues.apache.org/jira/browse/JCR-2870
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-core
>    Affects Versions: 2.1.2, 2.1.3, 2.2.0, 2.2.1
>         Environment: WindowsXP, Linux, Oracle, Derby
>            Reporter: Chris Schmidt
>            Assignee: Jukka Zitting
>             Fix For: 2.2.3
>
>         Attachments: jackrabbit-transient-issue.zip, jcr-2870.patch
>
>
> The TransientRepository cannot be used more than once when the repository is 
> configured with the DataSources construct. This has been verified with both 
> Oracle and Derby configurations. Once the TransientRepository closes for the 
> first time, the ConnectionFactory class sets a boolean value named closed to 
> 'true'.  Thereafter, any use of the ConnectionFactory throws a runtime 
> exception.
> The following stacktrace is thrown on the second attempt to utilize the 
> repository:
> 2011-01-25 08:12:14 DatabaseFileSystem [ERROR] failed to initialize file 
> system
> java.lang.IllegalStateException: this factory has already been closed
>       at 
> org.apache.jackrabbit.core.util.db.ConnectionFactory.sanityCheck(ConnectionFactory.java:213)
>       at 
> org.apache.jackrabbit.core.util.db.ConnectionFactory.getDataBaseType(ConnectionFactory.java:134)
>       at 
> org.apache.jackrabbit.core.fs.db.DbFileSystem.getDataSource(DbFileSystem.java:228)
>       at 
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.init(DatabaseFileSystem.java:190)
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfigurationParser$6.getFileSystem(RepositoryConfigurationParser.java:1057)
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfig.getFileSystem(RepositoryConfig.java:892)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:284)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:602)
>       at 
> org.apache.jackrabbit.core.TransientRepository$1.getRepository(TransientRepository.java:179)
>       at 
> org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:279)
>       at 
> org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:375)
>       at 
> org.apache.jackrabbit.commons.AbstractRepository.login(AbstractRepository.java:123)
>       ...
>       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)
> 2011-01-25 08:12:14 RepositoryImpl [ERROR] failed to start Repository: File 
> system initialization failure.
> javax.jcr.RepositoryException: File system initialization failure.
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfigurationParser$6.getFileSystem(RepositoryConfigurationParser.java:1060)
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfig.getFileSystem(RepositoryConfig.java:892)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:284)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:602)
>       at 
> org.apache.jackrabbit.core.TransientRepository$1.getRepository(TransientRepository.java:179)
>       at 
> org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:279)
>       at 
> org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:375)
>       at 
> org.apache.jackrabbit.commons.AbstractRepository.login(AbstractRepository.java:123)
>       at 
> TransientRepositoryTest.addNodeToRepository(TransientRepositoryTest.java:32)
>       at 
> TransientRepositoryTest.shouldNotFailWhenUsingTransientRepositoryTwice(TransientRepositoryTest.java:26)
>       ...
>       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)
> Caused by: org.apache.jackrabbit.core.fs.FileSystemException: failed to 
> initialize file system
>       at 
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.init(DatabaseFileSystem.java:210)
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfigurationParser$6.getFileSystem(RepositoryConfigurationParser.java:1057)
>       ... 42 more
> Caused by: java.lang.IllegalStateException: this factory has already been 
> closed
>       at 
> org.apache.jackrabbit.core.util.db.ConnectionFactory.sanityCheck(ConnectionFactory.java:213)
>       at 
> org.apache.jackrabbit.core.util.db.ConnectionFactory.getDataBaseType(ConnectionFactory.java:134)
>       at 
> org.apache.jackrabbit.core.fs.db.DbFileSystem.getDataSource(DbFileSystem.java:228)
>       at 
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.init(DatabaseFileSystem.java:190)
>       ... 43 more
> 2011-01-25 08:12:14 RepositoryImpl [ERROR] Error while closing Version 
> Manager.
> java.lang.NullPointerException
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.doShutdown(RepositoryImpl.java:1117)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.shutdown(RepositoryImpl.java:1063)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:388)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:602)
>       at 
> org.apache.jackrabbit.core.TransientRepository$1.getRepository(TransientRepository.java:179)
>       at 
> org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:279)
>       at 
> org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:375)
>       at 
> org.apache.jackrabbit.commons.AbstractRepository.login(AbstractRepository.java:123)
>       at 
> TransientRepositoryTest.addNodeToRepository(TransientRepositoryTest.java:32)
>       at 
> TransientRepositoryTest.shouldNotFailWhenUsingTransientRepositoryTwice(TransientRepositoryTest.java:26)
>       ...
>       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)
> 2011-01-25 08:12:14 RepositoryImpl [ERROR] In addition to startup fail, 
> another unexpected problem occurred while shutting down the repository again.
> java.lang.NullPointerException
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.doShutdown(RepositoryImpl.java:1136)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.shutdown(RepositoryImpl.java:1063)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:388)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:602)
>       at 
> org.apache.jackrabbit.core.TransientRepository$1.getRepository(TransientRepository.java:179)
>       at 
> org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:279)
>       at 
> org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:375)
>       at 
> org.apache.jackrabbit.commons.AbstractRepository.login(AbstractRepository.java:123)
>       at 
> TransientRepositoryTest.addNodeToRepository(TransientRepositoryTest.java:32)
>       at 
> TransientRepositoryTest.shouldNotFailWhenUsingTransientRepositoryTwice(TransientRepositoryTest.java:26)
>       ...
>       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)
> javax.jcr.RepositoryException: File system initialization failure.
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfigurationParser$6.getFileSystem(RepositoryConfigurationParser.java:1060)
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfig.getFileSystem(RepositoryConfig.java:892)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:284)
>       at 
> org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:602)
>       at 
> org.apache.jackrabbit.core.TransientRepository$1.getRepository(TransientRepository.java:179)
>       at 
> org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:279)
>       at 
> org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:375)
>       at 
> org.apache.jackrabbit.commons.AbstractRepository.login(AbstractRepository.java:123)
>       at 
> TransientRepositoryTest.addNodeToRepository(TransientRepositoryTest.java:32)
>       at 
> TransientRepositoryTest.shouldNotFailWhenUsingTransientRepositoryTwice(TransientRepositoryTest.java:26)
>       ...
>       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)
> Caused by: org.apache.jackrabbit.core.fs.FileSystemException: failed to 
> initialize file system
>       at 
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.init(DatabaseFileSystem.java:210)
>       at 
> org.apache.jackrabbit.core.config.RepositoryConfigurationParser$6.getFileSystem(RepositoryConfigurationParser.java:1057)
>       ... 42 more
> Caused by: java.lang.IllegalStateException: this factory has already been 
> closed
>       at 
> org.apache.jackrabbit.core.util.db.ConnectionFactory.sanityCheck(ConnectionFactory.java:213)
>       at 
> org.apache.jackrabbit.core.util.db.ConnectionFactory.getDataBaseType(ConnectionFactory.java:134)
>       at 
> org.apache.jackrabbit.core.fs.db.DbFileSystem.getDataSource(DbFileSystem.java:228)
>       at 
> org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.init(DatabaseFileSystem.java:190)
>       ... 43 more

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to