Author: chetanm
Date: Mon Mar 31 10:02:56 2014
New Revision: 1583283
URL: http://svn.apache.org/r1583283
Log:
OAK-1646 - MarkSweepGarbageCollector - Improvements in exception handling and
initialization
Minor changes related to log messages
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/GarbageCollectorFileState.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/GarbageCollectorFileState.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/GarbageCollectorFileState.java?rev=1583283&r1=1583282&r2=1583283&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/GarbageCollectorFileState.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/GarbageCollectorFileState.java
Mon Mar 31 10:02:56 2014
@@ -31,7 +31,7 @@ import org.apache.jackrabbit.oak.commons
* Also, manages any temporary files needed as well as external sorting.
*
*/
-public class GarbageCollectorFileState {
+class GarbageCollectorFileState {
private static final String GC_DIR = "gc";
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java?rev=1583283&r1=1583282&r2=1583283&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/MarkSweepGarbageCollector.java
Mon Mar 31 10:02:56 2014
@@ -38,6 +38,7 @@ import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.base.StandardSystemProperty;
+import com.google.common.base.Stopwatch;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -95,9 +96,6 @@ public class MarkSweepGarbageCollector i
/** The batch count. */
private int batchCount = DEFAULT_BATCH_COUNT;
- /** Flag to indicate whether to run in a debug mode **/
- private final boolean debugMode = Boolean.getBoolean("debugModeGC") ||
LOG.isDebugEnabled();
-
/** Flag to indicate the state of the gc **/
private String state = NOT_RUNNING;
@@ -224,12 +222,14 @@ public class MarkSweepGarbageCollector i
*/
public void markAndSweep() throws Exception {
try {
- LOG.debug("Starting garbage collector");
+ Stopwatch sw = Stopwatch.createStarted();
+ LOG.info("Starting Blob garbage collection");
mark();
- sweep();
+ int deleteCount = sweep();
- LOG.debug("garbage collector finished");
+ LOG.info("Blob garbage collection completed in {}. Number of blobs
" +
+ "deleted [{}]", sw.toString(), deleteCount);
} finally {
fs.complete();
state = NOT_RUNNING;
@@ -242,7 +242,7 @@ public class MarkSweepGarbageCollector i
* @throws Exception
* the exception
*/
- public void mark() throws Exception {
+ private void mark() throws Exception {
state = MARKING;
LOG.debug("Starting mark phase of the garbage collector");
@@ -275,7 +275,7 @@ public class MarkSweepGarbageCollector i
* @throws IOException
* Signals that an I/O exception has occurred.
*/
- protected void difference() throws IOException {
+ private void difference() throws IOException {
LOG.debug("Starting difference phase of the garbage collector");
FileLineDifferenceIterator<String> iter = new
FileLineDifferenceIterator<String>(
@@ -314,7 +314,8 @@ public class MarkSweepGarbageCollector i
* @throws IOException
* Signals that an I/O exception has occurred.
*/
- public void sweep() throws IOException {
+ private int sweep() throws IOException {
+ int count = 0;
try {
state = SWEEPING;
LOG.debug("Starting sweep phase of the garbage collector");
@@ -342,7 +343,7 @@ public class MarkSweepGarbageCollector i
LineIterator iterator =
FileUtils.lineIterator(fs.getGcCandidates(),
Charsets.UTF_8.name());
List<String> ids = Lists.newArrayList();
- int count = 0;
+
while (iterator.hasNext()) {
ids.add(iterator.next());
@@ -361,9 +362,10 @@ public class MarkSweepGarbageCollector i
executorService.shutdown();
executorService.awaitTermination(100, TimeUnit.MINUTES);
} catch (InterruptedException e) {
- LOG.error("Exception while waiting for termination of the
executor service", e);
- LOG.error("Immediately shutdown");
+ LOG.error("Exception while waiting for termination of the
executor service. ExecutorService " +
+ "would be immediately shutdown", e);
executorService.shutdownNow();
+ Thread.currentThread().interrupt();
}
count -= exceptionQueue.size();
@@ -378,12 +380,12 @@ public class MarkSweepGarbageCollector i
IOUtils.closeQuietly(writer);
}
- LOG.info("Blobs deleted count - " + count);
LOG.debug("Ending sweep phase of the garbage collector");
} finally {
fs.complete();
state = NOT_RUNNING;
}
+ return count;
}
/**
@@ -430,7 +432,7 @@ public class MarkSweepGarbageCollector i
@Override
public void run() {
try {
- LOG.debug("Deleting blobs : " + ids);
+ LOG.debug("Blob ids to be deleted {}", ids);
boolean deleted =
blobStore.deleteChunks(ids,
(maxLastModifiedInterval > 0 ?
System.currentTimeMillis()
@@ -439,7 +441,7 @@ public class MarkSweepGarbageCollector i
exceptionQueue.addAll(ids);
}
} catch (Exception e) {
- LOG.error("Error in deleting blobs - " + ids, e);
+ LOG.error("Error occurred while deleting blob with ids [{}]",
ids, e);
exceptionQueue.addAll(ids);
}
}
@@ -462,10 +464,12 @@ public class MarkSweepGarbageCollector i
private int count = 0;
+ private boolean debugMode = LOG.isTraceEnabled();
+
@Override
public void addReference(String blobId) {
if (debugMode) {
- LOG.debug("BlobId : " + blobId);
+ LOG.trace("BlobId : {}",blobId);
}
try {
@@ -480,7 +484,7 @@ public class MarkSweepGarbageCollector i
}
if (debugMode) {
- LOG.debug("chunkId : " + id);
+ LOG.trace("chunkId : {}",id);
}
count++;
}
@@ -493,7 +497,8 @@ public class MarkSweepGarbageCollector i
throw new RuntimeException("Error in
retrieving references", e);
}
- LOG.info("Marked Reference : " + count);
+ LOG.info("Number of valid blob references marked
under mark phase of " +
+ "Blob garbage collection [{}]",count);
}
}
);
@@ -544,7 +549,7 @@ public class MarkSweepGarbageCollector i
// sort the file
fs.sort(fs.getAvailableRefs());
- LOG.debug("Ending retrieving all blobs : " + blobsCount);
+ LOG.debug("Ending retrieving all blobs : {}", blobsCount);
} catch (Exception e) {
LOG.error("Error retrieving available blob ids", e);
} finally {