Author: alexparvulescu
Date: Mon Feb  1 10:42:45 2016
New Revision: 1727912

URL: http://svn.apache.org/viewvc?rev=1727912&view=rev
Log:
OAK-3963 Cold Standby optimize sync for checkpoints

Modified:
    
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java

Modified: 
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java?rev=1727912&r1=1727911&r2=1727912&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/client/StandbyApplyDiff.java
 Mon Feb  1 10:42:45 2016
@@ -47,6 +47,8 @@ class StandbyApplyDiff implements NodeSt
 
     private final SegmentStore store;
 
+    private final boolean hasDataStore;
+
     private final RemoteSegmentLoader loader;
 
     private final String path;
@@ -67,6 +69,7 @@ class StandbyApplyDiff implements NodeSt
             RemoteSegmentLoader loader, String path, boolean logOnly) {
         this.builder = builder;
         this.store = store;
+        this.hasDataStore = store.getBlobStore() != null;
         this.loader = loader;
         this.path = path;
         this.logOnly = logOnly;
@@ -125,7 +128,7 @@ class StandbyApplyDiff implements NodeSt
         if (b instanceof SegmentBlob) {
             SegmentBlob sb = (SegmentBlob) b;
             // verify if the blob exists
-            if (sb.isExternal() && b.getReference() == null) {
+            if (sb.isExternal() && hasDataStore && b.getReference() == null) {
                 String blobId = sb.getBlobId();
                 if (blobId != null) {
                     readBlob(blobId, pName);
@@ -154,47 +157,44 @@ class StandbyApplyDiff implements NodeSt
 
     @Override
     public boolean childNodeAdded(String name, NodeState after) {
-        if (!loader.isRunning()) {
-            return false;
-        }
-
-        if (after instanceof SegmentNodeState) {
-            if (log.isTraceEnabled()) {
-                log.trace("childNodeAdded {}, RO:{}", path + name, logOnly);
-            }
-            if (!logOnly) {
-                RecordId id = ((SegmentNodeState) after).getRecordId();
-                builder.setChildNode(name, new SegmentNodeState(id));
-            }
-            return after.compareAgainstBaseState(EmptyNodeState.EMPTY_NODE,
-                    new StandbyApplyDiff(builder.getChildNode(name), store,
-                            loader, path + name + "/", true));
-        }
-        return false;
+        return process(name, "childNodeAdded", EmptyNodeState.EMPTY_NODE,
+                after);
     }
 
     @Override
     public boolean childNodeChanged(String name, NodeState before,
             NodeState after) {
+        return process(name, "childNodeChanged", before, after);
+    }
+
+    private boolean process(String name, String op, NodeState before,
+            NodeState after) {
         if (!loader.isRunning()) {
             return false;
         }
-
         if (after instanceof SegmentNodeState) {
-            RecordId id = ((SegmentNodeState) after).getRecordId();
-
             if (log.isTraceEnabled()) {
-                RecordId oldId = ((SegmentNodeState) before).getRecordId();
-                log.trace("childNodeChanged {}, {} -> {}, RO:{}", path + name,
-                        oldId, id, logOnly);
+                log.trace("{} {}, readonly binary check {}", op, path + name,
+                        logOnly);
             }
             if (!logOnly) {
+                RecordId id = ((SegmentNodeState) after).getRecordId();
                 builder.setChildNode(name, new SegmentNodeState(id));
             }
-
-            return after.compareAgainstBaseState(before, new StandbyApplyDiff(
-                    builder.getChildNode(name), store, loader, path + name
-                            + "/", true));
+            if ("checkpoints".equals(name)) {
+                // if we're on the /checkpoints path, there's no need for a 
deep
+                // traversal to verify binaries
+                return true;
+            }
+            if (hasDataStore) {
+                // has external datastore, we need a deep
+                // traversal to verify binaries
+                return after.compareAgainstBaseState(before,
+                        new StandbyApplyDiff(builder.getChildNode(name), store,
+                                loader, path + name + "/", true));
+            } else {
+                return true;
+            }
         }
         return false;
     }


Reply via email to