Author: frm
Date: Tue Nov 22 13:59:53 2016
New Revision: 1770841
URL: http://svn.apache.org/viewvc?rev=1770841&view=rev
Log:
OAK-4957 - Add GC status information to SegmentRevisionGCMBean
Contribution by Andrei Dulceanu.
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/DelegatingGCMonitor.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitor.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitorTracker.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/LoggingGCMonitor.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGC.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreGCMonitor.java
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/DelegatingGCMonitor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/DelegatingGCMonitor.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/DelegatingGCMonitor.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/DelegatingGCMonitor.java
Tue Nov 22 13:59:53 2016
@@ -110,5 +110,12 @@ public class DelegatingGCMonitor impleme
gcMonitor.cleaned(reclaimedSize, currentSize);
}
}
+
+ @Override
+ public void updateStatus(String status) {
+ for (GCMonitor gcMonitor : gcMonitors) {
+ gcMonitor.updateStatus(status);
+ }
+ }
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitor.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitor.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitor.java
Tue Nov 22 13:59:53 2016
@@ -70,6 +70,12 @@ public interface GCMonitor {
* @param currentSize number of bytes after garbage collection
*/
void cleaned(long reclaimedSize, long currentSize);
+
+ /**
+ * The garbage collection entered a new phase e.g. idle, estimation, etc.
+ * @param status short summary of the GC phase
+ */
+ void updateStatus(String status);
class Empty implements GCMonitor {
@Override public void info(String message, Object[] arguments) { }
@@ -78,5 +84,6 @@ public interface GCMonitor {
@Override public void skipped(String reason, Object[] arguments) { }
@Override public void compacted() { }
@Override public void cleaned(long reclaimedSize, long currentSize) { }
+ @Override public void updateStatus(String status) { }
}
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitorTracker.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitorTracker.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitorTracker.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/gc/GCMonitorTracker.java
Tue Nov 22 13:59:53 2016
@@ -73,4 +73,10 @@ public class GCMonitorTracker extends Ab
}
}
+ @Override
+ public void updateStatus(String status) {
+ for (GCMonitor gcMonitor : getServices()) {
+ gcMonitor.updateStatus(status);
+ }
+ }
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/LoggingGCMonitor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/LoggingGCMonitor.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/LoggingGCMonitor.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/LoggingGCMonitor.java
Tue Nov 22 13:59:53 2016
@@ -67,4 +67,9 @@ public class LoggingGCMonitor implements
@Override
public void cleaned(long reclaimedSize, long currentSize) {
}
+
+ @Override
+ public void updateStatus(String status) {
+
+ }
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGC.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGC.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGC.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGC.java
Tue Nov 22 13:59:53 2016
@@ -141,6 +141,12 @@ public interface SegmentRevisionGC {
*/
@CheckForNull
String getLastError();
+
+ /**
+ * @return last log message or {@code null} if none.
+ */
+ @Nonnull
+ String getLastLogMessage();
/**
* @return current status.
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java
Tue Nov 22 13:59:53 2016
@@ -150,7 +150,12 @@ public class SegmentRevisionGCMBean
public String getLastError() {
return fileStoreGCMonitor.getLastError();
}
-
+
+ @Override
+ public String getLastLogMessage() {
+ return fileStoreGCMonitor.getLastLogMessage();
+ }
+
@Nonnull
@Override
public String getStatus() {
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=1770841&r1=1770840&r2=1770841&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
Tue Nov 22 13:59:53 2016
@@ -36,6 +36,7 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.segment.SegmentWriterBuilder.segmentWriterBuilder;
import static
org.apache.jackrabbit.oak.segment.file.TarRevisions.EXPEDITE_OPTION;
import static org.apache.jackrabbit.oak.segment.file.TarRevisions.timeout;
+import static org.apache.jackrabbit.oak.segment.compaction.SegmentGCStatus.*;
import java.io.File;
import java.io.IOException;
@@ -722,57 +723,63 @@ public class FileStore extends AbstractF
}
synchronized void run() throws IOException {
- gcListener.info("TarMK GC #{}: started",
GC_COUNT.incrementAndGet());
- GCMemoryBarrier gcMemoryBarrier = new GCMemoryBarrier(
- sufficientMemory, gcListener, GC_COUNT.get(), gcOptions);
-
- boolean sufficientEstimatedGain = true;
- if (gcOptions.isEstimationDisabled()) {
- gcListener.info("TarMK GC #{}: estimation skipped because it
was explicitly disabled", GC_COUNT);
- } else if (gcOptions.isPaused()) {
- gcListener.info("TarMK GC #{}: estimation skipped because
compaction is paused", GC_COUNT);
- } else {
- gcListener.info("TarMK GC #{}: estimation started", GC_COUNT);
- Stopwatch watch = Stopwatch.createStarted();
- Supplier<Boolean> cancel = new
CancelCompactionSupplier(FileStore.this);
- GCEstimation estimate = estimateCompactionGain(cancel);
- if (cancel.get()) {
- gcListener.info("TarMK GC #{}: estimation interrupted: {}.
Skipping compaction.", GC_COUNT, cancel);
- gcMemoryBarrier.close();
- return;
- }
-
- sufficientEstimatedGain = estimate.gcNeeded();
- String gcLog = estimate.gcLog();
- if (sufficientEstimatedGain) {
- gcListener.info(
- "TarMK GC #{}: estimation completed in {} ({} ms).
{}",
- GC_COUNT, watch, watch.elapsed(MILLISECONDS),
gcLog);
+ try {
+ gcListener.info("TarMK GC #{}: started",
GC_COUNT.incrementAndGet());
+ GCMemoryBarrier gcMemoryBarrier = new GCMemoryBarrier(
+ sufficientMemory, gcListener, GC_COUNT.get(),
gcOptions);
+
+ boolean sufficientEstimatedGain = true;
+ if (gcOptions.isEstimationDisabled()) {
+ gcListener.info("TarMK GC #{}: estimation skipped because
it was explicitly disabled", GC_COUNT);
+ } else if (gcOptions.isPaused()) {
+ gcListener.info("TarMK GC #{}: estimation skipped because
compaction is paused", GC_COUNT);
} else {
- gcListener.skipped(
- "TarMK GC #{}: estimation completed in {} ({} ms).
{}",
- GC_COUNT, watch, watch.elapsed(MILLISECONDS),
gcLog);
+ gcListener.info("TarMK GC #{}: estimation started",
GC_COUNT);
+ gcListener.updateStatus(ESTIMATION.message());
+
+ Stopwatch watch = Stopwatch.createStarted();
+ Supplier<Boolean> cancel = new
CancelCompactionSupplier(FileStore.this);
+ GCEstimation estimate = estimateCompactionGain(cancel);
+ if (cancel.get()) {
+ gcListener.info("TarMK GC #{}: estimation interrupted:
{}. Skipping compaction.", GC_COUNT, cancel);
+ gcMemoryBarrier.close();
+ return;
+ }
+
+ sufficientEstimatedGain = estimate.gcNeeded();
+ String gcLog = estimate.gcLog();
+ if (sufficientEstimatedGain) {
+ gcListener.info(
+ "TarMK GC #{}: estimation completed in {} ({}
ms). {}",
+ GC_COUNT, watch, watch.elapsed(MILLISECONDS),
gcLog);
+ } else {
+ gcListener.skipped(
+ "TarMK GC #{}: estimation completed in {} ({}
ms). {}",
+ GC_COUNT, watch, watch.elapsed(MILLISECONDS),
gcLog);
+ }
}
- }
-
- if (sufficientEstimatedGain) {
- if (!gcOptions.isPaused()) {
- logAndClear(segmentWriter.getNodeWriteTimeStats(),
segmentWriter.getNodeCompactTimeStats());
- log(segmentWriter.getNodeCacheOccupancyInfo());
- int gen = compact();
- if (gen > 0) {
- fileReaper.add(cleanupOldGenerations(gen));
- } else if (gen < 0) {
- gcListener.info("TarMK GC #{}: cleaning up after
failed compaction", GC_COUNT);
- fileReaper.add(cleanupGeneration(-gen));
+
+ if (sufficientEstimatedGain) {
+ if (!gcOptions.isPaused()) {
+ logAndClear(segmentWriter.getNodeWriteTimeStats(),
segmentWriter.getNodeCompactTimeStats());
+ log(segmentWriter.getNodeCacheOccupancyInfo());
+ int gen = compact();
+ if (gen > 0) {
+ fileReaper.add(cleanupOldGenerations(gen));
+ } else if (gen < 0) {
+ gcListener.info("TarMK GC #{}: cleaning up after
failed compaction", GC_COUNT);
+ fileReaper.add(cleanupGeneration(-gen));
+ }
+ logAndClear(segmentWriter.getNodeWriteTimeStats(),
segmentWriter.getNodeCompactTimeStats());
+ log(segmentWriter.getNodeCacheOccupancyInfo());
+ } else {
+ gcListener.skipped("TarMK GC #{}: compaction paused",
GC_COUNT);
}
- logAndClear(segmentWriter.getNodeWriteTimeStats(),
segmentWriter.getNodeCompactTimeStats());
- log(segmentWriter.getNodeCacheOccupancyInfo());
- } else {
- gcListener.skipped("TarMK GC #{}: compaction paused",
GC_COUNT);
}
+ gcMemoryBarrier.close();
+ } finally {
+ gcListener.updateStatus(IDLE.message());
}
- gcMemoryBarrier.close();
}
/**
@@ -822,6 +829,7 @@ public class FileStore extends AbstractF
try {
Stopwatch watch = Stopwatch.createStarted();
gcListener.info("TarMK GC #{}: compaction started, gc
options={}", GC_COUNT, gcOptions);
+ gcListener.updateStatus(COMPACTION.message());
SegmentNodeState before = getHead();
Supplier<Boolean> cancel = new
CancelCompactionSupplier(FileStore.this);
@@ -851,6 +859,8 @@ public class FileStore extends AbstractF
gcListener.info("TarMK GC #{}: compaction detected
concurrent commits while compacting. " +
"Compacting these commits. Cycle {} of {}",
GC_COUNT, cycles, gcOptions.getRetryCount());
+ gcListener.updateStatus(COMPACTION_RETRY.message() +
cycles);
+
SegmentNodeState head = getHead();
after = compact(head, writer, cancel);
if (after == null) {
@@ -870,6 +880,8 @@ public class FileStore extends AbstractF
if (forceTimeout > 0) {
gcListener.info("TarMK GC #{}: trying to force compact
remaining commits for {} seconds",
GC_COUNT, forceTimeout);
+
gcListener.updateStatus(COMPACTION_FORCE_COMPACT.message());
+
cycles++;
success = forceCompact(writer, or(cancel,
timeOut(forceTimeout, SECONDS)));
if (!success) {
@@ -1022,6 +1034,7 @@ public class FileStore extends AbstractF
fileStoreLock.writeLock().lock();
try {
gcListener.info("TarMK GC #{}: cleanup started.", GC_COUNT);
+ gcListener.updateStatus(CLEANUP.message());
newWriter();
segmentCache.clear();
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreGCMonitor.java
Tue Nov 22 13:59:53 2016
@@ -29,6 +29,7 @@ import java.util.Date;
import javax.annotation.Nonnull;
+import org.apache.jackrabbit.oak.segment.compaction.SegmentGCStatus;
import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
import org.apache.jackrabbit.oak.stats.Clock;
@@ -43,7 +44,8 @@ public class FileStoreGCMonitor implemen
private long lastRepositorySize;
private long lastReclaimedSize;
private String lastError;
- private String status = "NA";
+ private String lastLogMessage;
+ private String status = SegmentGCStatus.IDLE.message();
public FileStoreGCMonitor(@Nonnull Clock clock) {
this.clock = checkNotNull(clock);
@@ -53,12 +55,12 @@ public class FileStoreGCMonitor implemen
@Override
public void info(String message, Object... arguments) {
- status = arrayFormat(message, arguments).getMessage();
+ lastLogMessage = arrayFormat(message, arguments).getMessage();
}
@Override
public void warn(String message, Object... arguments) {
- status = arrayFormat(message, arguments).getMessage();
+ lastLogMessage = arrayFormat(message, arguments).getMessage();
}
@Override
@@ -71,7 +73,7 @@ public class FileStoreGCMonitor implemen
@Override
public void skipped(String reason, Object... arguments) {
- status = arrayFormat(reason, arguments).getMessage();
+ lastLogMessage = arrayFormat(reason, arguments).getMessage();
}
@Override
@@ -85,6 +87,11 @@ public class FileStoreGCMonitor implemen
lastReclaimedSize = reclaimed;
lastRepositorySize = current;
}
+
+ @Override
+ public void updateStatus(String status) {
+ this.status = status;
+ }
public String getLastCompaction() {
return toString(lastCompaction);
@@ -115,6 +122,11 @@ public class FileStoreGCMonitor implemen
}
@Nonnull
+ public String getLastLogMessage() {
+ return lastLogMessage;
+ }
+
+ @Nonnull
public String getStatus() {
return status;
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentCompactionIT.java
Tue Nov 22 13:59:53 2016
@@ -720,6 +720,11 @@ public class SegmentCompactionIT {
cleaned = true;
delegate.cleaned(reclaimedSize, currentSize);
}
+
+ @Override
+ public void updateStatus(String status) {
+ delegate.updateStatus(status);
+ }
public boolean isCleaned() {
return cleaned;
Modified:
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
(original)
+++
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
Tue Nov 22 13:59:53 2016
@@ -1609,5 +1609,10 @@ public class FileStore implements Segmen
public void cleaned(long reclaimedSize, long currentSize) {
delegatee.cleaned(reclaimedSize, currentSize);
}
+
+ @Override
+ public void updateStatus(String status) {
+ delegatee.updateStatus(status);
+ }
}
}
Modified:
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreGCMonitor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreGCMonitor.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreGCMonitor.java
(original)
+++
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStoreGCMonitor.java
Tue Nov 22 13:59:53 2016
@@ -121,6 +121,11 @@ public class FileStoreGCMonitor extends
repositorySize.getCounter().set(current);
reclaimedSize.getCounter().addAndGet(reclaimed);
}
+
+ @Override
+ @Deprecated
+ public void updateStatus(String status) {
+ }
//------------------------------------------------------------<
GCMonitorMBean >---
Modified:
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java?rev=1770841&r1=1770840&r2=1770841&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java
(original)
+++
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java
Tue Nov 22 13:59:53 2016
@@ -723,6 +723,11 @@ public class SegmentCompactionIT {
cleaned = true;
delegate.cleaned(reclaimedSize, currentSize);
}
+
+ @Override
+ public void updateStatus(String status) {
+ delegate.updateStatus(status);
+ }
public boolean isCleaned() {
return cleaned;