Index: src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java (revision 1597026) +++ src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java (working copy) @@ -242,6 +242,45 @@ return name; } + public synchronized boolean clearCheckpoints(long rmThresholdMs) { + long now = System.currentTimeMillis() + rmThresholdMs; + + // try 5 times + for (int i = 0; i < 5; i++) { + if (commitSemaphore.tryAcquire()) { + try { + refreshHead(); + store.getTracker().getWriter().flush(); + + SegmentNodeState state = head.get(); + SegmentNodeBuilder builder = state.builder(); + + NodeBuilder checkpoints = builder.child("checkpoints"); + for (String n : checkpoints.getChildNodeNames()) { + NodeBuilder cp = checkpoints.getChildNode(n); + PropertyState ts = cp.getProperty("timestamp"); + if (ts == null || ts.getType() != Type.LONG + || now > ts.getValue(Type.LONG)) { + cp.remove(); + } + } + + SegmentNodeState newState = builder.getNodeState(); + store.getTracker().getWriter().flush(); + if (store.setHead(state, newState)) { + refreshHead(); + return true; + } + + } finally { + commitSemaphore.release(); + } + } + } + + return false; + } + @Override @CheckForNull public NodeState retrieve(@Nonnull String checkpoint) { NodeState cp = head.get()