Author: mduerig
Date: Thu Oct  6 09:03:32 2016
New Revision: 1763533

URL: http://svn.apache.org/viewvc?rev=1763533&view=rev
Log:
OAK-4138: Decouple revision cleanup from the flush thread
Schedule cleanup instead of executing it on the flush thread

Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1763533&r1=1763532&r2=1763533&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
 Thu Oct  6 09:03:32 2016
@@ -202,11 +202,6 @@ public class FileStore implements Segmen
     private final GCJournal gcJournal;
 
     /**
-     * Flag to request revision cleanup during the next flush.
-     */
-    private final AtomicBoolean cleanupNeeded = new AtomicBoolean(false);
-
-    /**
      * List of old tar file generations that are waiting to be removed. They 
can
      * not be removed immediately, because they first need to be closed, and 
the
      * JVM needs to release the memory mapped file references.
@@ -524,9 +519,7 @@ public class FileStore implements Segmen
             if (!gcOptions.isPaused()) {
                 logAndClear(segmentWriter.getNodeWriteTimeStats(), 
segmentWriter.getNodeCompactTimeStats());
                 log(segmentWriter.getNodeCacheOccupancyInfo());
-                if (compact()) {
-                    cleanupNeeded.set(cleanup);
-                }
+                compact();
                 logAndClear(segmentWriter.getNodeWriteTimeStats(), 
segmentWriter.getNodeCompactTimeStats());
                 log(segmentWriter.getNodeCacheOccupancyInfo());
             } else {
@@ -736,11 +729,6 @@ public class FileStore implements Segmen
             }
         });
 
-        if (cleanupNeeded.getAndSet(false)) {
-            // FIXME OAK-4138: Decouple revision cleanup from the flush thread
-            fileReaper.add(cleanup());
-        }
-
         fileReaper.reap();
     }
 
@@ -1024,25 +1012,43 @@ public class FileStore implements Segmen
             }
 
             if (success) {
+                gcScheduler.execute(format("TarMK cleanup [%s]", directory), 
new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            fileReaper.add(cleanup());
+                        } catch (IOException e) {
+                            gcListener.error("TarMK GC #" + GC_COUNT + ": 
cleanup failed", e);
+                        }
+                    }
+                });
+
                 gcListener.compacted(SUCCESS, newGeneration);
                 gcListener.info("TarMK GC #{}: compaction succeeded in {} ({} 
ms), after {} cycles",
                         GC_COUNT, watch, watch.elapsed(MILLISECONDS), cycles);
                 return true;
             } else {
-                gcListener.info("TarMK GC #{}: cleaning up after failed 
compaction", GC_COUNT);
-
-                Predicate<Integer> cleanupPredicate = new Predicate<Integer>() 
{
+                gcScheduler.execute(format("TarMK cleanup [%s]", directory), 
new Runnable() {
                     @Override
-                    public boolean apply(Integer generation) {
-                        return generation == newGeneration;
+                    public void run() {
+                        try {
+                            gcListener.info("TarMK GC #{}: cleaning up after 
failed compaction", GC_COUNT);
+                            Predicate<Integer> cleanupPredicate = new 
Predicate<Integer>() {
+                                @Override
+                                public boolean apply(Integer generation) {
+                                    return generation == newGeneration;
+                                }
+                            };
+                            fileReaper.add(cleanup(cleanupPredicate,
+                                "gc-count=" + GC_COUNT +
+                                ",gc-status=failed" +
+                                ",store-generation=" + (newGeneration - 1) +
+                                ",reclaim-predicate=(generation==" + 
newGeneration + ")"));
+                        } catch (IOException e) {
+                            gcListener.error("TarMK GC #" + GC_COUNT + ": 
cleanup failed", e);
+                        }
                     }
-                };
-                fileReaper.add(cleanup(cleanupPredicate,
-                    "gc-count=" + GC_COUNT +
-                    ",gc-status=failed" +
-                    ",store-generation=" + (newGeneration - 1) +
-                    ",reclaim-predicate=(generation==" + newGeneration + ")"));
-
+                });
                 gcListener.compacted(FAILURE, newGeneration);
                 gcListener.info("TarMK GC #{}: compaction failed after {} ({} 
ms), and {} cycles",
                         GC_COUNT, watch, watch.elapsed(MILLISECONDS), cycles);
@@ -1442,7 +1448,7 @@ public class FileStore implements Segmen
      * Trigger a garbage collection cycle
      */
     public void gc() {
-        gcScheduler.execute(format("TarMK compaction thread [%s]", directory), 
new Runnable() {
+        gcScheduler.execute(format("TarMK compaction [%s]", directory), new 
Runnable() {
             @Override
             public void run() {
                 try {


Reply via email to