Author: mduerig
Date: Wed Apr 20 10:06:06 2016
New Revision: 1740105

URL: http://svn.apache.org/viewvc?rev=1740105&view=rev
Log:
OAK-3348: Cross gc sessions might introduce references to pre-compacted segments
FIXMEs related to OAK-3348

Modified:
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
    
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
    
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
    
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
    
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
    
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
    
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
    
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackup.java
 Wed Apr 20 10:06:06 2016
@@ -53,6 +53,7 @@ public class FileStoreBackup {
         FileStore backup = builder.build();
         try {
             SegmentNodeState state = backup.getHead();
+            // FIXME OAK-3348 Use dedicated implementation instead of 
compactor.
             // This is allows us to decouple and fix problems for online 
compaction independent
             // of backup / restore.
 //            Compactor compactor = new Compactor(backup.getTracker());

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
 Wed Apr 20 10:06:06 2016
@@ -50,6 +50,7 @@ public class FileStoreRestore {
         FileStore store = FileStore.builder(destination).build();
         SegmentNodeState current = store.getHead();
         try {
+            // FIXME OAK-3348 Use dedicated implementation instead of 
compactor.
             // This is allows us to decouple and fix problems for online 
compaction independent
             // of backup / restore.
             // compactor.setDeepCheckLargeBinaries(true);

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/RecordCache.java
 Wed Apr 20 10:06:06 2016
@@ -36,10 +36,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * FIXME OAK-3348 XXX document
+ * FIXME OAK-3348 document
  */
+// FIXME OAK-3348 implement monitoring for this cache
+// FIXME OAK-3348 unit test
 public class RecordCache<T> {
     private static final Logger LOG = 
LoggerFactory.getLogger(RecordCache.class);
+    // FIXME OAK-3348 make this a feature flag
     private static final int RETENTION_THRESHOLD = 1;
 
     private final ConcurrentMap<Integer, Cache<T>> generations = 
newConcurrentMap();
@@ -68,6 +71,9 @@ public class RecordCache<T> {
     }
 
     /**
+     * FIXME OAK-3348 The getCache might get called multiple times per 
generation
+     * as per the comment below. Either come up with a fix for this race
+     * or clearly state that API consumers need to be prepared for this.
      */
     protected Cache<T> getCache(int generation) {
         return Cache.disabled();
@@ -163,6 +169,10 @@ public class RecordCache<T> {
 
         @Override
         public synchronized void put(T key, RecordId value, int cost) {
+            // FIXME OAK-3348 Validate and optimise the eviction strategy.
+            // Nodes with many children should probably get a boost to
+            // protecting them from preemptive eviction. Also it might be
+            // necessary to implement pinning (e.g. for checkpoints).
             while (size >= capacity) {
                 int d = maps.size() - 1;
                 int removed = maps.remove(d).size();

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBlob.java
 Wed Apr 20 10:06:06 2016
@@ -173,6 +173,8 @@ public class SegmentBlob extends Record
             return true;
         }
 
+        // FIXME OAK-3348 check / test deduplication of large SegmentBlob 
instances
+        // FIXME OAK-3348 Can we do something similar for long strings?
         if (object instanceof SegmentBlob) {
             SegmentBlob that = (SegmentBlob) object;
             if (this.length() != that.length()) {

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentBufferWriter.java
 Wed Apr 20 10:06:06 2016
@@ -161,6 +161,7 @@ public class SegmentBufferWriter impleme
         buffer[4] = 0; // reserved
         buffer[5] = 0; // refcount
 
+        // FIXME OAK-3348 document change in format
         buffer[GC_GEN_OFFSET] = (byte) (generation >> 24);
         buffer[GC_GEN_OFFSET + 1] = (byte) (generation >> 16);
         buffer[GC_GEN_OFFSET + 2] = (byte) (generation >> 8);
@@ -170,6 +171,9 @@ public class SegmentBufferWriter impleme
         roots.clear();
         blobrefs.clear();
 
+        // FIXME OAK-3348 Don't write the GC generation into the segment info
+        // as it is now available from the segment header. Update the tooling
+        // accordingly (SegmentGraph).
         String metaInfo = "{\"wid\":\"" + wid + '"' +
             ",\"sno\":" + tracker.getNextSegmentNo() +
             ",\"gc\":" + generation +

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStore.java
 Wed Apr 20 10:06:06 2016
@@ -193,6 +193,8 @@ public class SegmentNodeStore implements
      *          of {@code c.call()} otherwise.
      * @throws Exception
      */
+    // FIXME OAK-3348 Remove and use an exclusive locking mechanism of the 
FileStore
+    // instead. See FileStore.forceCompact
     boolean locked(Callable<Boolean> c) throws Exception {
         if (commitSemaphore.tryAcquire()) {
             try {
@@ -213,6 +215,8 @@ public class SegmentNodeStore implements
      *          of {@code c.call()} otherwise.
      * @throws Exception
      */
+    // FIXME OAK-3348 Remove and use an exclusive locking mechanism of the 
FileStore
+    // instead. See FileStore.forceCompact
     boolean locked(Callable<Boolean> c, long timeout, TimeUnit unit) throws 
Exception {
         if (commitSemaphore.tryAcquire(timeout, unit)) {
             try {

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentParser.java
 Wed Apr 20 10:06:06 2016
@@ -410,6 +410,7 @@ public class SegmentParser {
 
         Segment segment = nodeId.getSegment();
         int offset = nodeId.getOffset();
+        // FIXME OAK-3348 Call onString for the node id, which was introduced 
here
         //segment.readRecordId(offset);
         offset += RECORD_ID_BYTES;
         RecordId templateId = segment.readRecordId(offset);

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
 Wed Apr 20 10:06:06 2016
@@ -246,6 +246,7 @@ public class SegmentTracker {
         segmentCache.put(id, segment, segment.size());
     }
 
+    // FIXME OAK-3348 Improve retrieving current GC generation.
     // See also the comments in FileStore regarding initialisation and
     // cyclic dependencies.
     public int getGcGen() {
@@ -330,6 +331,8 @@ public class SegmentTracker {
         return getSegmentId(msb, lsb);
     }
 
+    // FIXME OAK-3348 with clean brutal we need to remove those ids that have 
been cleaned
+    // i.e. those whose segment was from an old generation
     public synchronized void clearSegmentIdTables(CompactionStrategy strategy) 
{
         for (SegmentIdTable table : tables) {
             table.clearSegmentIdTables(strategy);

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentVersion.java
 Wed Apr 20 10:06:06 2016
@@ -42,6 +42,7 @@ public enum SegmentVersion {
 
     V_11((byte) 11);
 
+    // FIXME OAK-3348 upgrade to version 12
 
     /**
      * Latest segment version

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 Wed Apr 20 10:06:06 2016
@@ -82,6 +82,7 @@ import org.slf4j.LoggerFactory;
  * Converts nodes, properties, and values to records, which are written to 
segments.
  * FIXME OAK-3348 doc thread safety properties
  */
+// FIXME OAK-3348 Improve the way how SegmentWriter instances are created.
 public class SegmentWriter {
     private static final Logger LOG = 
LoggerFactory.getLogger(SegmentWriter.class);
 
@@ -123,6 +124,10 @@ public class SegmentWriter {
 
     private final RecordCache<String> nodeCache;
 
+    // FIXME OAK-3348 Do we need a deduplication cache also for binaries?
+    // Probably/preferably not as long binaries are already de-duplicated
+    // by rewriting its list of block ids and because we should recommend
+    // using a data store for big binaries.
 
     private final SegmentStore store;
 
@@ -144,14 +149,17 @@ public class SegmentWriter {
     /**
      * @param store     store to write to
      * @param version   segment version to write
+     * FIXME OAK-3348 document
      */
     public SegmentWriter(SegmentStore store, SegmentVersion version, 
WriteOperationHandler writeOperationHandler) {
         this(store, version, writeOperationHandler, new RecordCache<String>());
     }
 
+    // FIXME OAK-3348 There should be a cleaner way for adding the cached 
nodes from the compactor
     public void addCachedNodes(int generation, Cache<String> cache) {
         nodeCache.put(cache, generation);
 
+        // FIXME OAK-3348 find a better way to evict the cache from within the 
cache itself
         stringCache.clearUpTo(generation - 1);
         templateCache.clearUpTo(generation - 1);
         nodeCache.clearUpTo(generation - 1);
@@ -254,6 +262,10 @@ public class SegmentWriter {
             }));
     }
 
+    public void dropCache() {
+        // FIXME OAK-3348 remove
+    }
+
     // FIXME OAK-3348 document: not thread safe
     private abstract class SegmentWriteOperation implements WriteOperation {
         private SegmentBufferWriter writer;
@@ -883,6 +895,7 @@ public class SegmentWriter {
 
             RecordId nodeId = null;
             if (state instanceof SegmentNodeState) {
+                // FIXME OAK-3348 offline compaction could remove those ids
                 byte[] id = ((Record) state).getRecordId().toArray();
                 nodeId = writeBlock(id, 0, id.length);
             }

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/WriteOperationHandler.java
 Wed Apr 20 10:06:06 2016
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.IOException;
 
 /**
+ * FIXME OAK-3348 document
  */
 interface WriteOperationHandler {
     interface WriteOperation {

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/compaction/CompactionStrategy.java
 Wed Apr 20 10:06:06 2016
@@ -28,6 +28,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+// FIXME OAK-3348 Refactor this into a proper AST. Identify and remove 
"legacy" parts
 public class CompactionStrategy {
     private static final Logger LOG = 
LoggerFactory.getLogger(CompactionStrategy.class);
 
@@ -114,6 +115,7 @@ public class CompactionStrategy {
 
     private boolean forceAfterFail = FORCE_AFTER_FAIL_DEFAULT;
 
+    // FIXME OAK-3348 Make the lock wait time configurable
     private int lockWaitTime = 60;
 
     private long compactionStart = currentTimeMillis();

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
 Wed Apr 20 10:06:06 2016
@@ -391,6 +391,13 @@ public class FileStore implements Segmen
             checkNotNull(builder.directory).mkdirs();
         }
 
+        // FIXME OAK-3348 Improve the setup of FileStore and SegmentTracker.
+        // SegmentTracker and FileStore have a cyclic dependency, which we 
should
+        // try to break. Here we pass along a not fully initialised instances 
of the
+        // FileStore to the SegmentTracker, which in turn is in later invoked 
to write
+        // the initial node state. Notably before this instance is fully 
initialised!
+        // Once consequence of this is that we cannot reliably determine the 
current
+        // GC generation while writing the initial head state. See further 
below.
         if (builder.cacheSize < 0) {
             this.tracker = new SegmentTracker(this, 0, version);
         } else if (builder.cacheSize > 0) {
@@ -542,6 +549,8 @@ public class FileStore implements Segmen
         log.debug("TarMK readers {}", this.readers);
     }
 
+    // FIXME OAK-3348 hack: We cannot determine the current GC generation 
before
+    // the FileStore is fully initialised so just return 0 for now.
     public int getGcGen() {
         if (head == null) {
             return 0;  // not fully initialised
@@ -558,7 +567,7 @@ public class FileStore implements Segmen
 
         Runtime runtime = Runtime.getRuntime();
         long avail = runtime.totalMemory() - runtime.freeMemory();
-        long delta = 0;
+        long delta = 0;  // FIXME OAK-3348 what value should we use for delta?
         long needed = delta * compactionStrategy.getMemoryThreshold();
         if (needed >= avail) {
             gcMonitor.skipped(
@@ -870,10 +879,11 @@ public class FileStore implements Segmen
 
         // Do actual cleanup outside of the lock to prevent blocking
         // concurrent writers for a long time
-        int generation = getGcGen() - 1;
+        int generation = getGcGen() - 1;  // FIXME OAK-3348 make the 
generation threshold configurable
         Set<UUID> reclaim = newHashSet();
         for (TarReader reader : cleaned.keySet()) {
             reader.mark(bulkRefs, reclaim, generation);
+            // FIXME OAK-3348 log at debug level
             log.info("Size of bulk references/reclaim set {}/{}", 
bulkRefs.size(), reclaim.size());
             if (shutdown) {
                 gcMonitor.info("TarMK GC #{}: cleanup interrupted", gcCount);
@@ -1002,8 +1012,10 @@ public class FileStore implements Segmen
         gcMonitor.info("TarMK GC #{}: compaction started, strategy={}", 
gcCount, compactionStrategy);
         Stopwatch watch = Stopwatch.createStarted();
 
+        // FIXME OAK-3348 Make the capacity and initial depth of the 
deduplication cache configurable
         final DeduplicationCache<String> nodeCache = new 
DeduplicationCache<String>(1000000, 20);
 
+        // FIXME OAK-3348 this way of compacting has not progress logging and 
cannot be cancelled
         int gcGeneration = tracker.getGcGen() + 1;
         SegmentWriter writer = new SegmentWriter(this, 
tracker.getSegmentVersion(),
             new SegmentBufferWriter(this, tracker.getSegmentVersion(), "c", 
gcGeneration),
@@ -1046,7 +1058,8 @@ public class FileStore implements Segmen
             if (success) {
                 tracker.getWriter().addCachedNodes(gcGeneration, nodeCache);
                 tracker.clearSegmentIdTables(compactionStrategy);
-                gcMonitor.compacted(new long[0], new long[0], new long[0]);
+                // FIXME OAK-3348 refactor GCMonitor: there is no more 
compaction map stats
+                gcMonitor.compacted(new long[]{}, new long[]{}, new long[]{});
             } else {
                 gcMonitor.info("TarMK GC #{}: compaction gave up compacting 
concurrent commits after {} cycles.",
                     gcCount, cycles - 1);
@@ -1057,6 +1070,7 @@ public class FileStore implements Segmen
                             "Most likely compaction didn't get exclusive 
access to the store.", gcCount);
                     }
                 }
+                // FIXME OAK-3348 giving up leaves garbage that will only be 
cleaned up 2 generations later!
             }
 
             gcMonitor.info("TarMK GC #{}: compaction completed in {} ({} ms), 
after {} cycles",
@@ -1122,6 +1136,8 @@ public class FileStore implements Segmen
         return new SegmentNodeState(head.get());
     }
 
+    // FIXME OAK-3348 Maybe us a lock implementation that could expedite 
important commits
+    // like compaction and checkpoints. See OAK-4015. Needs to be evaluated.
     private ReadWriteLock rwLock = new ReentrantReadWriteLock();
 
     @Override
@@ -1148,7 +1164,8 @@ public class FileStore implements Segmen
         closeAndLogOnFail(diskSpaceThread);
         try {
             flush();
-            // FIXME OAK-3348 XXX replace with some sort of close call 
tracker.getWriter().dropCache();
+            // FIXME OAK-3348 Replace this with a way to "close" the 
underlying SegmentBufferWriter(s)
+            // tracker.getWriter().dropCache();
             fileStoreLock.writeLock().lock();
             try {
                 closeAndLogOnFail(writer);

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java
 Wed Apr 20 10:06:06 2016
@@ -741,7 +741,7 @@ class TarReader implements Closeable {
             UUID id = new UUID(entry.msb(), entry.lsb());
             if ((!isDataSegmentId(entry.lsb()) && !bulkRefs.remove(id)) ||
                 (isDataSegmentId(entry.lsb()) && entry.generation() < 
generation)) {
-                // non references bulk segment or old data segment
+                // non referenced bulk segment or old data segment
                 reclaim.add(id);
             } else {
                 if (isDataSegmentId(entry.lsb())) {

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarWriter.java
 Wed Apr 20 10:06:06 2016
@@ -475,6 +475,7 @@ class TarWriter implements Closeable {
         return header;
     }
 
+    // FIXME OAK-3348 this method is not used anymore. Remove unless we decide
     // to offer an alternative cleanup strategy based on reachability, in which
     // case it will still be needed
     /**

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreBackupTest.java
 Wed Apr 20 10:06:06 2016
@@ -43,6 +43,7 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
 @Ignore
+// FIXME OAK-3348 FileStoreBackupTest
 public class FileStoreBackupTest {
 
     private File src;

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompactionAndCleanupIT.java
 Wed Apr 20 10:06:06 2016
@@ -88,7 +88,7 @@ public class CompactionAndCleanupIT {
     }
 
     @Test
-    @Ignore
+    @Ignore  // FIXME OAK-3348 fix failing test compactionNoBinaryClone
     public void compactionNoBinaryClone() throws Exception {
         // 2MB data, 5MB blob
         final int blobSize = 5 * 1024 * 1024;
@@ -374,6 +374,7 @@ public class CompactionAndCleanupIT {
                     nodeStore.merge(preGCBuilder, EmptyHook.INSTANCE, 
CommitInfo.EMPTY);
                 }
 
+                // FIXME OAK-3348 need to compact twice because of the 
generation cleanup threshold
                 // (currently hard coded to 2);
                 fileStore.compact();
                 fileStore.compact();
@@ -495,7 +496,7 @@ public class CompactionAndCleanupIT {
     }
 
     @Test
-    @Ignore
+    @Ignore  // FIXME OAK-3348 fix failing test propertyRetention
     public void propertyRetention() throws IOException, CommitFailedException {
         FileStore fileStore = 
FileStore.builder(getFileStoreFolder()).withMaxFileSize(1).build();
         try {

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
 Wed Apr 20 10:06:06 2016
@@ -52,7 +52,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
-@Ignore
+@Ignore // FIXME OAK-3348 fix SegmentGraphTest
 public class SegmentGraphTest {
     private final Set<UUID> segments = newHashSet(
         UUID.fromString("5be0c2ea-b6ba-4f80-acad-657a20f920b6"),

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
 Wed Apr 20 10:06:06 2016
@@ -92,6 +92,7 @@ public class SegmentIdFactoryTest {
     /**
      * OAK-2049 - error for data segments
      */
+    // FIXME OAK-3348 fix test
 //    @Test(expected = IllegalStateException.class)
 //    public void dataAIOOBE() {
 //        SegmentId id = factory.newDataSegmentId();

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
 Wed Apr 20 10:06:06 2016
@@ -38,7 +38,7 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.osgi.framework.ServiceRegistration;
 
-@Ignore
+@Ignore  // FIXME OAK-3348 fix failing test SegmentNodeStoreServiceTest
 public class SegmentNodeStoreServiceTest {
 
     @Rule

Modified: 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java?rev=1740105&r1=1740104&r2=1740105&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentSizeTest.java
 Wed Apr 20 10:06:06 2016
@@ -37,7 +37,7 @@ import org.junit.Test;
 /**
  * Test case for ensuring that segment size remains within bounds.
  */
-@Ignore
+@Ignore  // FIXME OAK-3348 fix failing test SegmentSizeTest
 public class SegmentSizeTest {
 
     @Test


Reply via email to