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;


Reply via email to