Index: src/main/java/org/apache/jackrabbit/mongomk/impl/action/FetchCommitsAction.java =================================================================== --- src/main/java/org/apache/jackrabbit/mongomk/impl/action/FetchCommitsAction.java (revision 1436926) +++ src/main/java/org/apache/jackrabbit/mongomk/impl/action/FetchCommitsAction.java (working copy) @@ -16,6 +16,7 @@ */ package org.apache.jackrabbit.mongomk.impl.action; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; @@ -137,38 +138,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, commits); - LOG.debug("Found list of valid revisions for max revision {}: {}", - toRevisionId, validCommits); - - return validCommits; + return commits; + } finally { + dbCursor.close(); + } } } Index: src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandNew.java =================================================================== --- src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandNew.java (revision 1436926) +++ src/main/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandNew.java (working copy) @@ -169,7 +169,11 @@ private void prepareCommit() throws Exception { commit.setAffectedPaths(affectedPaths); - commit.setBaseRevisionId(mongoSync.getHeadRevisionId()); + if (branchId == null) { + commit.setBaseRevisionId(mongoSync.getHeadRevisionId()); + } else { + commit.setBaseRevisionId(baseRevisionId); + } commit.setRevisionId(revisionId); if (commit.getBranchId() == null && branchId != null) { commit.setBranchId(branchId); @@ -192,9 +196,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 +306,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();