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 to...@apache.org on 2017/06/08 10:04:00 UTC

svn commit: r1798039 - in /jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite: CompositeCheckpointMBean.java CompositeNodeStore.java

Author: tomekr
Date: Thu Jun  8 10:04:00 2017
New Revision: 1798039

URL: http://svn.apache.org/viewvc?rev=1798039&view=rev
Log:
OAK-6315: Create CheckpointMBean implementation for the composite node store

Added support for the creation and expiring dates.

Modified:
    jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeCheckpointMBean.java
    jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java

Modified: jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeCheckpointMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeCheckpointMBean.java?rev=1798039&r1=1798038&r2=1798039&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeCheckpointMBean.java (original)
+++ jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeCheckpointMBean.java Thu Jun  8 10:04:00 2017
@@ -20,6 +20,11 @@ import org.apache.jackrabbit.oak.commons
 
 import javax.management.openmbean.OpenDataException;
 import javax.management.openmbean.TabularDataSupport;
+import java.util.Date;
+import java.util.Map;
+import java.util.stream.StreamSupport;
+
+import static org.apache.jackrabbit.oak.composite.CompositeNodeStore.CHECKPOINT_METADATA;
 
 public class CompositeCheckpointMBean extends AbstractCheckpointMBean {
 
@@ -42,12 +47,35 @@ public class CompositeCheckpointMBean ex
     @Override
     protected void collectCheckpoints(TabularDataSupport tab) throws OpenDataException {
         for (String id : store.checkpoints()) {
-            tab.put(id, toCompositeData(id, "", "", store.checkpointInfo(id)));
+            Map<String, String> info = store.allCheckpointInfo(id);
+            tab.put(id, toCompositeData(
+                    id,
+                    getDate(info, CHECKPOINT_METADATA + "created"),
+                    getDate(info, CHECKPOINT_METADATA + "expires"),
+                    store.checkpointInfo(id)));
         }
     }
 
     @Override
     public long getOldestCheckpointCreationTimestamp() {
-        return 0;
+        return StreamSupport.stream(store.checkpoints().spliterator(), false)
+                .map(store::allCheckpointInfo)
+                .map(i -> i.get(CHECKPOINT_METADATA + "created"))
+                .mapToLong(l -> l == null ? 0 : Long.valueOf(l))
+                .sorted()
+                .findFirst()
+                .orElse(0);
+    }
+
+    private static String getDate(Map<String, String> info, String name) {
+        String p = info.get(name);
+        if (p == null) {
+            return "NA";
+        }
+        try {
+            return new Date(Long.valueOf(p)).toString();
+        } catch (NumberFormatException e) {
+            return "NA";
+        }
     }
 }

Modified: jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java?rev=1798039&r1=1798038&r2=1798039&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java Thu Jun  8 10:04:00 2017
@@ -59,6 +59,7 @@ import static com.google.common.collect.
 import static com.google.common.collect.Sets.difference;
 import static com.google.common.collect.Sets.filter;
 import static com.google.common.collect.Sets.newHashSet;
+import static java.lang.System.currentTimeMillis;
 import static org.apache.jackrabbit.oak.commons.PathUtils.isAncestor;
 import static org.apache.jackrabbit.oak.composite.ModifiedPathDiff.getModifiedPaths;
 
@@ -88,7 +89,9 @@ public class CompositeNodeStore implemen
 
     private static final Logger LOG = LoggerFactory.getLogger(CompositeNodeStore.class);
 
-    private static final String CHECKPOINT_ID_PREFIX = "composite.checkpoint.";
+    static final String CHECKPOINT_METADATA = "composite.checkpoint.";
+
+    private static final String CHECKPOINT_METADATA_MOUNT = CHECKPOINT_METADATA + "mount.";
 
     private final TreeSet<String> ignoreReadOnlyWritePaths;
 
@@ -234,23 +237,20 @@ public class CompositeNodeStore implemen
         if (props == null) {
             return false;
         }
-        for (MountedNodeStore mns : ctx.getNonDefaultStores()) {
-            if (!props.containsKey(CHECKPOINT_ID_PREFIX + mns.getMount().getName())) {
-                return false;
-            }
-        }
-        return true;
+        return props.containsKey(CHECKPOINT_METADATA + "created");
     }
 
     @Override
     public String checkpoint(long lifetime, Map<String, String> properties) {
         Map<String, String> globalProperties = newHashMap(properties);
+        globalProperties.put(CHECKPOINT_METADATA + "created", Long.toString(currentTimeMillis()));
+        globalProperties.put(CHECKPOINT_METADATA + "expires", Long.toString(currentTimeMillis() + lifetime));
         for (MountedNodeStore mns : ctx.getNonDefaultStores()) {
             if (mns.getMount().isReadOnly()) {
                 continue;
             }
             String checkpoint = mns.getNodeStore().checkpoint(lifetime, properties);
-            globalProperties.put(CHECKPOINT_ID_PREFIX + mns.getMount().getName(), checkpoint);
+            globalProperties.put(CHECKPOINT_METADATA_MOUNT + mns.getMount().getName(), checkpoint);
         }
         return ctx.getGlobalStore().getNodeStore().checkpoint(lifetime, globalProperties);
     }
@@ -268,20 +268,21 @@ public class CompositeNodeStore implemen
         return copyOf(filterKeys(ctx.getGlobalStore().getNodeStore().checkpointInfo(checkpoint), new Predicate<String>() {
             @Override
             public boolean apply(String input) {
-                return !input.startsWith(CHECKPOINT_ID_PREFIX);
+                return !input.startsWith(CHECKPOINT_METADATA);
             }
         }));
     }
 
+    Map<String, String> allCheckpointInfo(String checkpoint) {
+        return ctx.getGlobalStore().getNodeStore().checkpointInfo(checkpoint);
+    }
+
     @Override
     public NodeState retrieve(String checkpoint) {
         if (!checkpointExists(ctx.getGlobalStore().getNodeStore(), checkpoint)) {
             return null;
         }
         Map<String, String> props = ctx.getGlobalStore().getNodeStore().checkpointInfo(checkpoint);
-        if (props == null) {
-            return null;
-        }
         Map<MountedNodeStore, NodeState> nodeStates = newHashMap();
         nodeStates.put(ctx.getGlobalStore(), ctx.getGlobalStore().getNodeStore().retrieve(checkpoint));
         for (MountedNodeStore nodeStore : ctx.getNonDefaultStores()) {
@@ -327,7 +328,7 @@ public class CompositeNodeStore implemen
 
     private String getPartialCheckpointName(MountedNodeStore nodeStore, String globalCheckpoint, Map<String, String> globalCheckpointProperties) {
         Set<String> validCheckpointNames = ImmutableSet.copyOf(nodeStore.getNodeStore().checkpoints());
-        String result = globalCheckpointProperties.get(CHECKPOINT_ID_PREFIX + nodeStore.getMount().getName());
+        String result = globalCheckpointProperties.get(CHECKPOINT_METADATA_MOUNT + nodeStore.getMount().getName());
         if (result != null && validCheckpointNames.contains(result)) {
             return result;
         }