Uploaded image for project: 'Jackrabbit Oak'
  1. Jackrabbit Oak
  2. OAK-560

MongoMK.commit() not atomic

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Critical
    • Resolution: Won't Fix
    • 0.5
    • None
    • mongomk
    • 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

      Attachments

        Issue Links

          Activity

            People

              mduerig Michael Dürig
              mreutegg Marcel Reutegger
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: