[ https://issues.apache.org/jira/browse/OAK-8917?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17045679#comment-17045679 ]
Olivier Jolit edited comment on OAK-8917 at 2/26/20 4:35 PM: ------------------------------------------------------------- Hello, I did indeed reproduce without my custom security provider, I reproduce with the {{OpenSecurityProvider}}. I actually wrote a main that reproduces this behavior quite simply. I give it below with the [^effective-pom.xml]and the [^output] attached. The only notable thing is that I maven-shade commons-io and guava because of dependency conflicts with the other dependencies in other modules. {code:java} import org.apache.jackrabbit.api.JackrabbitRepository; import org.apache.jackrabbit.oak.Oak; import org.apache.jackrabbit.oak.jcr.Jcr; import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore; import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDataSourceFactory; import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentNodeStoreBuilder; import org.apache.jackrabbit.oak.spi.commit.ThreeWayConflictHandler; import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider; import org.apache.jackrabbit.oak.spi.security.SecurityProvider; import org.apache.jackrabbit.oak.spi.state.NodeStore; import javax.jcr.Repository; public class CreateRepositoryConflicts { public static final String host = "xxx"; public static final String db = "xxx"; public static final String password = "xxx"; public static final String port = "xxx"; private static Repository repository; private static NodeStore nodeStore; public static void main(String[] args) { System.out.println("Creating OAK repository first time"); createRepository(); shutdown(); System.out.println("Creating OAK repository second time"); createRepository(); shutdown(); } public static void createRepository() { String schema = "oak"; String user = "oak"; String sqlDriverClassName = "org.postgresql.Driver"; SecurityProvider openSecurityProvider = new OpenSecurityProvider(); nodeStore = RDBDocumentNodeStoreBuilder.newRDBDocumentNodeStoreBuilder() .setRDBConnection(RDBDataSourceFactory.forJdbcUrl("jdbc:postgresql://" + host + ":" + port + "/" + db + "?currentSchema= " + schema, user, password, sqlDriverClassName)).build(); repository = new Jcr(new Oak(nodeStore)).with(openSecurityProvider).createRepository(); } public static void shutdown() { if (repository instanceof JackrabbitRepository) { System.out.println("Shutting down JCR..."); try { ((JackrabbitRepository) repository).shutdown(); } catch (Throwable e) { System.out.println("Could not close JCR repo: " + e.getMessage()); e.printStackTrace(); } } if (nodeStore instanceof DocumentNodeStore) { System.out.println("Disposing NodeStore..."); try { ((DocumentNodeStore) nodeStore).dispose(); } catch (Throwable e) { System.out.println("Could not dispose NodeStore: " + e.getMessage()); e.printStackTrace(); } } } } {code} was (Author: olivier.jolit): Hello, I did indeed reproduce without my custom security provider, I reproduce with the {{OpenSecurityProvider}}. I actually wrote a main that reproduces this behavior quite simply. I give it below with the [^effective-pom.xml]and the [^output] attached. {code:java} import org.apache.jackrabbit.api.JackrabbitRepository; import org.apache.jackrabbit.oak.Oak; import org.apache.jackrabbit.oak.jcr.Jcr; import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore; import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDataSourceFactory; import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentNodeStoreBuilder; import org.apache.jackrabbit.oak.spi.commit.ThreeWayConflictHandler; import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider; import org.apache.jackrabbit.oak.spi.security.SecurityProvider; import org.apache.jackrabbit.oak.spi.state.NodeStore; import javax.jcr.Repository; public class CreateRepositoryConflicts { public static final String host = "xxx"; public static final String db = "xxx"; public static final String password = "xxx"; public static final String port = "xxx"; private static Repository repository; private static NodeStore nodeStore; public static void main(String[] args) { System.out.println("Creating OAK repository first time"); createRepository(); shutdown(); System.out.println("Creating OAK repository second time"); createRepository(); shutdown(); } public static void createRepository() { String schema = "oak"; String user = "oak"; String sqlDriverClassName = "org.postgresql.Driver"; SecurityProvider openSecurityProvider = new OpenSecurityProvider(); nodeStore = RDBDocumentNodeStoreBuilder.newRDBDocumentNodeStoreBuilder() .setRDBConnection(RDBDataSourceFactory.forJdbcUrl("jdbc:postgresql://" + host + ":" + port + "/" + db + "?currentSchema= " + schema, user, password, sqlDriverClassName)).build(); repository = new Jcr(new Oak(nodeStore)).with(openSecurityProvider).createRepository(); } public static void shutdown() { if (repository instanceof JackrabbitRepository) { System.out.println("Shutting down JCR..."); try { ((JackrabbitRepository) repository).shutdown(); } catch (Throwable e) { System.out.println("Could not close JCR repo: " + e.getMessage()); e.printStackTrace(); } } if (nodeStore instanceof DocumentNodeStore) { System.out.println("Disposing NodeStore..."); try { ((DocumentNodeStore) nodeStore).dispose(); } catch (Throwable e) { System.out.println("Could not dispose NodeStore: " + e.getMessage()); e.printStackTrace(); } } } } {code} > Thousands ConflitException on .createRepository() > ------------------------------------------------- > > Key: OAK-8917 > URL: https://issues.apache.org/jira/browse/OAK-8917 > Project: Jackrabbit Oak > Issue Type: Bug > Components: core > Affects Versions: 1.24.0 > Reporter: Olivier Jolit > Priority: Minor > Attachments: effective-pom.xml, output > > > I use OAK in my Spring Boot application to store user content (bookmarks). > Users will write to OAK via REST calls. > So I create a repository (in a Spring Bean) on my application startup with: > {code:java} > public OakBookmarkService() { > RDBDocumentNodeStoreBuilder.newRDBDocumentNodeStoreBuilder() > > .setRDBConnection(RDBDataSourceFactory.forJdbcUrl("jdbc:postgresql://" + host > + ":" + port + "/" + db + "?currentSchema= " + schema, user, password, > sqlDriverClassName)).build() > SecurityProvider securityProvider = new > BookmarksSecurityProvider(rolesProvider); > ThreeWayConflictHandler threeWayConflictHandler = new > BookmarkConflictHandler(); > repository = new Jcr(new > Oak(store)).with(securityProvider).with(threeWayConflictHandler).createRepository(); > > ... > }{code} > The issue I have is that this creation of the repository throws thousands of > ConflitExceptions like: > {code:java} > The node 1:/jcr:system already existed in revision > r170631ac223-0-1 (older than base r17063a941e2-0-1), commit revision: > r17063a95314-0-1 {code} > Which prevent my application from starting. > Deleting all the tables in my PostgreSQL database between each startup of my > server fixes this issue but is obviously not expected. So it seems to me that > OAK tries to recreate the default nodes in the database even though they > already exist. > I see in the documentation > ([https://jackrabbit.apache.org/oak/docs/construct.html]) that I need to > logout and dispose of the node store after each use. Do I have to do this > when the server stops ? How to ensure this is done even when the server > crashes in this case ? > Or should I create the node store at the beginning of each REST call and > dispose of it at the end every time ? For now I only create a session and > close it for each call and am assuming creating the store each time is too > expensive. > Also, my conflict handler (that always returns Resolution.OURS for now) does > not seem to be called in this scenario, which surprises me. -- This message was sent by Atlassian Jira (v8.3.4#803005)