You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2014/04/01 11:47:46 UTC
svn commit: r1583584 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecovery.java
Author: chetanm
Date: Tue Apr 1 09:47:46 2014
New Revision: 1583584
URL: http://svn.apache.org/r1583584
Log:
OAK-1295 - Recovery for missing _lastRev updates (WIP)
Avoid unnecessary updates of lastRev on parent where the lastRev is consistent and only lastRev for child needs to be fixed
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecovery.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecovery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecovery.java?rev=1583584&r1=1583583&r2=1583584&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecovery.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/LastRevRecovery.java Tue Apr 1 09:47:46 2014
@@ -20,11 +20,13 @@
package org.apache.jackrabbit.oak.plugins.document;
import java.util.Iterator;
+import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
import javax.annotation.CheckForNull;
import com.google.common.base.Predicate;
+import com.google.common.collect.Maps;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,11 +46,18 @@ public class LastRevRecovery {
public int recover(Iterator<NodeDocument> suspects, int clusterId) {
UnsavedModifications unsaved = new UnsavedModifications();
+ UnsavedModifications unsavedParents = new UnsavedModifications();
+
+ //Map of known last rev of checked paths
+ Map<String, Revision> knownLastRevs = Maps.newHashMap();
while (suspects.hasNext()) {
NodeDocument doc = suspects.next();
Revision currentLastRev = doc.getLastRev().get(clusterId);
+ if (currentLastRev != null) {
+ knownLastRevs.put(doc.getPath(), currentLastRev);
+ }
Revision lostLastRev = determineMissedLastRev(doc, clusterId);
//1. Update lastRev for this doc
@@ -73,11 +82,24 @@ public class LastRevRecovery {
break;
}
path = PathUtils.getParentPath(path);
- unsaved.put(path, lastRevForParents);
+ unsavedParents.put(path, lastRevForParents);
}
}
}
+ for(String parentPath : unsavedParents.getPaths()){
+ Revision calcLastRev = unsavedParents.get(parentPath);
+ Revision knownLastRev = knownLastRevs.get(parentPath);
+
+ //Copy the calcLastRev of parent only if they have changed
+ //In many case it might happen that parent have consistent lastRev
+ //This check ensures that unnecessary updates are not made
+ if(knownLastRev == null
+ || calcLastRev.compareRevisionTime(knownLastRev) > 0){
+ unsaved.put(parentPath, calcLastRev);
+ }
+ }
+
//Note the size before persist as persist operation
//would empty the internal state
int size = unsaved.getPaths().size();