On 15.1.13 10:23, Marcel Reutegger wrote:

I looked into why 2 tests failing in MicroKernelIT for MongoMK. One of
them is conflictingMove test. This test passes for MicroKernelImpl and it
looks like the reason is MicroKernelImpl always commits against head. Take
a look at CommitBuilder around line 112. There's a check whether baseRevId
is not equal to currentHead, and if so, the staged tree is reset to
currentHead and the operation is retried. This effectively means that the
operation is committed against head, right?

hmm, not sure. I'd first have to look at the code. if it just blindly commits to
head then it's certainly wrong and it also means it wouldn't detect the
conflict, right? So, I guess what it does is some kind of rebase.

Yes, the H2 MK does some kind of rebase if the commit is not against the current head: it tries to reapply all changes against the current head an later tries to merge the resulting changes into trunk. However this results in a race condition. See https://issues.apache.org/jira/browse/OAK-532


We recently changed CommitCommand to commit against baseRevisionId
instead
of head but I'm thinking maybe we should change it back to committing
against head? Or maybe we commit against baseRevisionId but we add some
kind of a conflicting commit detection (although I'm not too sure how we'd
detect conflicting commits easily). WDYT?

this is missing right now. merging with the *head* revision tree is done in
CommitCommandNew.mergeNodes(). that is, mergeNodes() basically does
the rebase I mentioned above. I recently added a FIXME to this method.
I think this is the place where we'd need to find out if there is a conflict.


In a nutshell here is what I think we should do: MK.commit should fail on all but conflicts which are trivially merged. This will not be a problem for oak-core since oak-core applies changes to private branches and will merge these on Session.save. Before merging, branches are rebased and that's the place where the more complicated conflict handling should go. Due to rebasing the subsequent merge will not conflict any more.

See my POC work on https://issues.apache.org/jira/browse/OAK-536 for how such a rebase operation could look like. Note that the current implementation is not complete yet since it just throws an exception on conflicts. I will soon update this to a more complete implementation which correctly annotates conflicts such that oak-core can further handle these.

Also note how such an implementation will also solve OAK-464 and OAK-548.

Michael

Reply via email to