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;
}