Details
-
Bug
-
Status: Resolved
-
Critical
-
Resolution: Won't Fix
-
0.5
-
None
-
None
Description
I created a test (rev 1433995), while reasoning about the optimization we are working on in OAK-535. It seem it uncovers a race condition in the commit command. I was already wondering in the past if something like this can happen, and now it looks like there is indeed a problem.
Without having further analyzed the sporadic test failure I see, I think it is caused by the optimistic commit protocol implemented in CommitCommandNew. The internal retry loop saves the nodes, then saves the commit and finally save head revision. IIUC this exposes a commit even though it is not yet valid and the command may flag it as failed later when it cannot save the head revision. And this is indeed the case when I set a breakpoint for the failed commit and look inside the commits collection I can see that the commit in question is flagged as failed.
The exception then looks like this:
org.apache.jackrabbit.mk.api.MicroKernelException: java.lang.Exception: Commit with revision 134 could not be found
at org.apache.jackrabbit.mongomk.impl.MongoMicroKernel.merge(MongoMicroKernel.java:214)
at org.apache.jackrabbit.mongomk.impl.MongoMKBranchMergeTest$1.run(MongoMKBranchMergeTest.java:362)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.Exception: Commit with revision 134 could not be found
at org.apache.jackrabbit.mongomk.impl.action.FetchCommitAction.execute(FetchCommitAction.java:65)
at org.apache.jackrabbit.mongomk.impl.command.CommitCommandNew.readBranchIdFromBaseCommit(CommitCommandNew.java:145)
at org.apache.jackrabbit.mongomk.impl.command.CommitCommandNew.execute(CommitCommandNew.java:96)
at org.apache.jackrabbit.mongomk.impl.command.CommitCommandNew.execute(CommitCommandNew.java:56)
at org.apache.jackrabbit.mongomk.impl.command.MergeCommand.execute(MergeCommand.java:118)
at org.apache.jackrabbit.mongomk.impl.command.MergeCommand.execute(MergeCommand.java:51)
at org.apache.jackrabbit.mongomk.impl.command.DefaultCommandExecutor.execute(DefaultCommandExecutor.java:38)
at org.apache.jackrabbit.mongomk.impl.MongoNodeStore.merge(MongoNodeStore.java:146)
at org.apache.jackrabbit.mongomk.impl.MongoMicroKernel.merge(MongoMicroKernel.java:212)
... 2 more