Author: mduerig
Date: Mon Dec 3 15:14:12 2018
New Revision: 1848050
URL: http://svn.apache.org/viewvc?rev=1848050&view=rev
Log:
OAK-7933: Expose number of tar readers as metric
Modified:
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/tar/TarFiles.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=1848050&r1=1848049&r2=1848050&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
Mon Dec 3 15:14:12 2018
@@ -25,6 +25,7 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
import static
org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
import static
org.apache.jackrabbit.oak.segment.file.PrintableBytes.newPrintableBytes;
+import static org.apache.jackrabbit.oak.stats.StatsOptions.DEFAULT;
import static org.apache.jackrabbit.oak.stats.StatsOptions.METRICS_ONLY;
import java.io.IOException;
@@ -53,6 +54,8 @@ import org.apache.jackrabbit.oak.segment
import org.apache.jackrabbit.oak.segment.spi.persistence.RepositoryLock;
import
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.stats.CounterStats;
+import org.apache.jackrabbit.oak.stats.StatisticsProvider;
import org.apache.jackrabbit.oak.stats.TimerStats;
import org.apache.jackrabbit.oak.stats.TimerStats.Context;
import org.jetbrains.annotations.NotNull;
@@ -63,11 +66,15 @@ import org.slf4j.LoggerFactory;
* The storage implementation for tar files.
*/
public class FileStore extends AbstractFileStore {
-
private static final Logger log = LoggerFactory.getLogger(FileStore.class);
-
private static final int MB = 1024 * 1024;
+ /**
+ * Name of the {@link CounterStats counter} exposing the number of {@code
TarReader}
+ * instances in use by {@link TarFiles}.
+ */
+ private static final String TAR_READER_COUNT = "TAR_READER_COUNT";
+
private static GarbageCollectionStrategy newGarbageCollectionStrategy() {
if (Boolean.getBoolean("gc.classic")) {
return new SynchronizedGarbageCollectionStrategy(new
DefaultGarbageCollectionStrategy());
@@ -125,18 +132,20 @@ public class FileStore extends AbstractF
SegmentNodeStorePersistence persistence = builder.getPersistence();
repositoryLock = persistence.lockRepository();
+ StatisticsProvider statsProvider = builder.getStatsProvider();
this.segmentWriter = defaultSegmentWriterBuilder("sys")
.withGeneration(() -> getGcGeneration().nonGC())
.withWriterPool()
.with(builder.getCacheManager()
- .withAccessTracking("WRITE",
builder.getStatsProvider()))
+ .withAccessTracking("WRITE", statsProvider))
.build(this);
newManifestChecker(persistence,
builder.getStrictVersionCheck()).checkAndUpdateManifest();
- this.stats = new FileStoreStats(builder.getStatsProvider(), this, 0);
+ this.stats = new FileStoreStats(statsProvider, this, 0);
+ CounterStats readerCountStats =
statsProvider.getCounterStats(TAR_READER_COUNT, DEFAULT);
TarFiles.Builder tarFilesBuilder = TarFiles.builder()
.withDirectory(directory)
.withMemoryMapping(memoryMapping)
@@ -144,7 +153,8 @@ public class FileStore extends AbstractF
.withIOMonitor(ioMonitor)
.withFileStoreMonitor(stats)
.withMaxFileSize(builder.getMaxFileSize() * MB)
- .withPersistence(builder.getPersistence());
+ .withPersistence(builder.getPersistence())
+ .withReaderCountStats(readerCountStats);
this.tarFiles = tarFilesBuilder.build();
long size = this.tarFiles.size();
@@ -173,7 +183,7 @@ public class FileStore extends AbstractF
this::flush,
generation ->
defaultSegmentWriterBuilder("c")
-
.with(builder.getCacheManager().withAccessTracking("COMPACT",
builder.getStatsProvider()))
+
.with(builder.getCacheManager().withAccessTracking("COMPACT", statsProvider))
.withGeneration(generation)
.withoutWriterPool()
.build(this)
@@ -181,7 +191,7 @@ public class FileStore extends AbstractF
this.snfeListener = builder.getSnfeListener();
- TimerStats flushTimer =
builder.getStatsProvider().getTimer("oak.segment.flush", METRICS_ONLY);
+ TimerStats flushTimer = statsProvider.getTimer("oak.segment.flush",
METRICS_ONLY);
fileStoreScheduler.scheduleWithFixedDelay(format("TarMK flush [%s]",
directory), 5, SECONDS, () -> {
Context timer = flushTimer.time();
try {
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java?rev=1848050&r1=1848049&r2=1848050&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
Mon Dec 3 15:14:12 2018
@@ -55,6 +55,8 @@ import org.apache.jackrabbit.oak.segment
import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
import
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
+import org.apache.jackrabbit.oak.stats.CounterStats;
+import org.apache.jackrabbit.oak.stats.NoopStats;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -126,6 +128,8 @@ public class TarFiles implements Closeab
private SegmentNodeStorePersistence persistence;
+ private CounterStats readerCountStats = NoopStats.INSTANCE;
+
private Builder() {
// Prevent external instantiation.
}
@@ -176,6 +180,11 @@ public class TarFiles implements Closeab
return this;
}
+ public Builder withReaderCountStats(CounterStats readerCountStats) {
+ this.readerCountStats = readerCountStats;
+ return this;
+ }
+
public TarFiles build() throws IOException {
checkState(directory != null, "Directory not specified");
checkState(tarRecovery != null, "TAR recovery strategy not
specified");
@@ -329,9 +338,15 @@ public class TarFiles implements Closeab
*/
private volatile boolean shutdown;
+ /**
+ * Counter exposing the number of {@link TarReader} instances.
+ */
+ private final CounterStats readerCount;
+
private TarFiles(Builder builder) throws IOException {
maxFileSize = builder.maxFileSize;
archiveManager = builder.buildArchiveManager();
+ readerCount = builder.readerCountStats;
Map<Integer, Map<Character, String>> map =
collectFiles(archiveManager);
Integer[] indices = map.keySet().toArray(new Integer[map.size()]);
@@ -350,6 +365,7 @@ public class TarFiles implements Closeab
r = TarReader.open(map.get(index), builder.tarRecovery,
archiveManager);
}
readers = new Node(r, readers);
+ readerCount.inc();
}
if (builder.readOnly) {
return;
@@ -441,6 +457,10 @@ public class TarFiles implements Closeab
return size;
}
+ private static int getSize(Node head) {
+ return Iterables.size(iterable(head));
+ }
+
public int readerCount() {
Node head;
@@ -451,7 +471,7 @@ public class TarFiles implements Closeab
lock.readLock().unlock();
}
- return Iterables.size(iterable(head));
+ return getSize(head);
}
/**
@@ -584,6 +604,7 @@ public class TarFiles implements Closeab
return;
}
readers = new Node(TarReader.open(writer.getFileName(),
archiveManager), readers);
+ readerCount.inc();
writer = newWriter;
}
@@ -713,6 +734,7 @@ public class TarFiles implements Closeab
try {
if (readers == head) {
readers = swept;
+ readerCount.dec(getSize(head) - getSize(swept));
break;
} else {
head = readers;