Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandNew.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandNew.java (revision 1436894) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandNew.java (working copy) @@ -169,7 +169,8 @@ private void prepareCommit() throws Exception { commit.setAffectedPaths(affectedPaths); - commit.setBaseRevisionId(mongoSync.getHeadRevisionId()); + commit.setBaseRevisionId(branchId == null? + mongoSync.getHeadRevisionId() : baseRevisionId); commit.setRevisionId(revisionId); if (commit.getBranchId() == null && branchId != null) { commit.setBranchId(branchId); @@ -192,9 +193,13 @@ existingNodes = new HashMap(); for (String path : affectedPaths) { - NodeExistsCommand command = new NodeExistsCommand( - nodeStore, path, mongoSync.getHeadRevisionId()); - command.setBranchId(branchId); + NodeExistsCommand command; + if (branchId == null) { + command = new NodeExistsCommand(nodeStore, path, mongoSync.getHeadRevisionId()); + } else { + command = new NodeExistsCommand(nodeStore, path, baseRevisionId); + command.setBranchId(branchId); + } if (command.execute()) { existingNodes.put(path, command.getNode()); } @@ -298,6 +303,11 @@ * @throws Exception If an exception happens. */ protected boolean saveAndSetHeadRevision() throws Exception { + // Don't update the head revision id for branches. + if (branchId != null) { + return true; + } + long assumedHeadRevision = this.mongoSync.getHeadRevisionId(); MongoSync mongoSync = new SaveAndSetHeadRevisionAction(nodeStore, assumedHeadRevision, revisionId).execute(); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/action/FetchCommitsAction.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/action/FetchCommitsAction.java (revision 1436785) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/action/FetchCommitsAction.java (working copy) @@ -16,12 +16,9 @@ */ package org.apache.jackrabbit.mongomk.impl.action; +import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.Set; import org.apache.jackrabbit.mongomk.impl.MongoNodeStore; import org.apache.jackrabbit.mongomk.impl.model.MongoCommit; @@ -137,38 +134,17 @@ } private List convertToCommits(DBCursor dbCursor) { - Map commits = new HashMap(); - while (dbCursor.hasNext()) { - MongoCommit commitMongo = (MongoCommit) dbCursor.next(); - commits.put(commitMongo.getRevisionId(), commitMongo); - } - dbCursor.close(); - - List validCommits = new LinkedList(); - if (commits.isEmpty()) { - return validCommits; - } - - Set revisions = commits.keySet(); - long currentRevision = (toRevisionId != -1 && revisions.contains(toRevisionId)) ? - toRevisionId : Collections.max(revisions); - - while (true) { - MongoCommit commitMongo = commits.get(currentRevision); - if (commitMongo == null) { - break; + try { + List commits = new ArrayList(); + while (dbCursor.hasNext()) { + commits.add((MongoCommit) dbCursor.next()); } - validCommits.add(commitMongo); - long baseRevision = commitMongo.getBaseRevisionId(); - if (currentRevision == 0L || baseRevision < fromRevisionId) { - break; - } - currentRevision = baseRevision; - } - - LOG.debug("Found list of valid revisions for max revision {}: {}", - toRevisionId, validCommits); + LOG.debug("Found list of valid revisions for max revision {}: {}", + toRevisionId, commits); - return validCommits; + return commits; + } finally { + dbCursor.close(); + } } } Index: oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchMergeTest.java =================================================================== --- oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchMergeTest.java (revision 1436785) +++ oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchMergeTest.java (working copy) @@ -344,7 +344,6 @@ } @Test - @Ignore("OAK-560") public void concurrentNonConflictingMerges() throws Exception { int numThreads = 10; mk.commit("/", "+\"test\":{}", null, null); Index: oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommand.java =================================================================== --- oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommand.java (revision 1436894) +++ oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommand.java (working copy) @@ -171,7 +171,8 @@ private void prepareCommit() throws Exception { commit.setAffectedPaths(affectedPaths); - commit.setBaseRevisionId(mongoSync.getHeadRevisionId()); + commit.setBaseRevisionId(branchId == null? + mongoSync.getHeadRevisionId() : baseRevisionId); commit.setRevisionId(revisionId); if (commit.getBranchId() == null && branchId != null) { commit.setBranchId(branchId); @@ -181,7 +182,7 @@ private void readExistingNodes() { FetchNodesAction action = new FetchNodesAction(nodeStore, affectedPaths, - mongoSync.getHeadRevisionId()); + branchId == null? mongoSync.getHeadRevisionId() : baseRevisionId); action.setBranchId(branchId); action.setValidCommits(validCommits); existingNodes = action.execute(); @@ -282,6 +283,11 @@ * @throws Exception If an exception happens. */ protected boolean saveAndSetHeadRevision() throws Exception { + // Don't update the head revision id for branches. + if (branchId != null) { + return true; + } + long assumedHeadRevision = this.mongoSync.getHeadRevisionId(); MongoSync mongoSync = new SaveAndSetHeadRevisionAction(nodeStore, assumedHeadRevision, revisionId).execute();