diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java index c86236f630..3389f9b6cb 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java @@ -80,6 +80,7 @@ public class FileStore extends AbstractFileStore { */ private static final String SEGMENT_COUNT = "SEGMENT_COUNT"; + private static GarbageCollectionStrategy newGarbageCollectionStrategy() { if (Boolean.getBoolean("gc.classic")) { return new SynchronizedGarbageCollectionStrategy(new DefaultGarbageCollectionStrategy()); @@ -502,6 +503,7 @@ public class FileStore extends AbstractFileStore { } catch (ExecutionException | UncheckedExecutionException e) { SegmentNotFoundException snfe = asSegmentNotFoundException(e, id); snfeListener.notify(id, snfe); + stats.notify(id, snfe); throw snfe; } } diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java index 3a4546cdb8..f2219a3901 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java @@ -25,6 +25,9 @@ import javax.management.openmbean.CompositeData; import org.apache.jackrabbit.api.stats.TimeSeries; import org.apache.jackrabbit.oak.commons.IOUtils; +import org.apache.jackrabbit.oak.segment.SegmentId; +import org.apache.jackrabbit.oak.segment.SegmentNotFoundException; +import org.apache.jackrabbit.oak.segment.SegmentNotFoundExceptionListener; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; import org.apache.jackrabbit.oak.stats.CounterStats; import org.apache.jackrabbit.oak.stats.MeterStats; @@ -32,23 +35,26 @@ import org.apache.jackrabbit.oak.stats.StatisticsProvider; import org.apache.jackrabbit.oak.stats.StatsOptions; import org.jetbrains.annotations.NotNull; -public class FileStoreStats implements FileStoreStatsMBean, FileStoreMonitor { +public class FileStoreStats implements FileStoreStatsMBean, FileStoreMonitor, SegmentNotFoundExceptionListener { public static final String SEGMENT_REPO_SIZE = "SEGMENT_REPO_SIZE"; public static final String SEGMENT_WRITES = "SEGMENT_WRITES"; public static final String JOURNAL_WRITES = "JOURNAL_WRITES"; - + private static final String SNFE_COUNT = "SNFE_COUNT"; + private final StatisticsProvider statisticsProvider; private final FileStore store; private final MeterStats writeStats; private final CounterStats repoSize; private final MeterStats journalWriteStats; - + private final CounterStats snfeCountStats; + public FileStoreStats(StatisticsProvider statisticsProvider, FileStore store, long initialSize) { this.statisticsProvider = statisticsProvider; this.store = store; this.writeStats = statisticsProvider.getMeter(SEGMENT_WRITES, StatsOptions.DEFAULT); this.repoSize = statisticsProvider.getCounterStats(SEGMENT_REPO_SIZE, StatsOptions.DEFAULT); this.journalWriteStats = statisticsProvider.getMeter(JOURNAL_WRITES, StatsOptions.DEFAULT); + this.snfeCountStats = statisticsProvider.getCounterStats(SNFE_COUNT, StatsOptions.DEFAULT); repoSize.inc(initialSize); } @@ -56,6 +62,12 @@ public class FileStoreStats implements FileStoreStatsMBean, FileStoreMonitor { repoSize.inc(initialSize); } + //~-----------------------------< SegmentNotFoundExceptionListener > + @Override + public void notify(@NotNull SegmentId id, @NotNull SegmentNotFoundException snfe) { + snfeCountStats.inc(); + } + //~-----------------------------< FileStoreMonitor > @Override @@ -68,7 +80,7 @@ public class FileStoreStats implements FileStoreStatsMBean, FileStoreMonitor { public void reclaimed(long size) { repoSize.dec(size); } - + @Override public void flushed() { journalWriteStats.mark(); @@ -110,12 +122,12 @@ public class FileStoreStats implements FileStoreStatsMBean, FileStoreMonitor { IOUtils.humanReadableByteCount(getApproximateSize()), getTarFileCount()); } - + @Override public long getJournalWriteStatsAsCount() { return journalWriteStats.getCount(); } - + @Override public CompositeData getJournalWriteStatsAsCompositeData() { return asCompositeData(getTimeSeries(JOURNAL_WRITES), JOURNAL_WRITES);