Index: oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java (date 1548149137000) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java (date 1558706540000) @@ -24,6 +24,7 @@ import org.apache.jackrabbit.oak.segment.file.FileStore; import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder; import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; @@ -61,7 +62,7 @@ @Test public void testRecovery() throws StorageException, URISyntaxException, IOException { - SegmentArchiveManager manager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + SegmentArchiveManager manager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); SegmentArchiveWriter writer = manager.create("data00000a.tar"); List uuids = new ArrayList<>(); Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java (date 1559212644000) @@ -16,10 +16,7 @@ */ package org.apache.jackrabbit.oak.segment.split; -import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; -import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; -import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; -import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; +import org.apache.jackrabbit.oak.segment.spi.monitor.*; import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFileReader; @@ -86,7 +83,7 @@ } private Optional getLastArchive() throws IOException { - SegmentArchiveManager manager = roPersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + SegmentArchiveManager manager = roPersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); List archives = manager.listArchives(); if (archives.isEmpty()) { return Optional.empty(); @@ -97,14 +94,14 @@ } @Override - public SegmentArchiveManager createArchiveManager(boolean memoryMapping, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) throws IOException { + public SegmentArchiveManager createArchiveManager(boolean memoryMapping, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor, RemoteStoreMonitor remoteStoreMonitor) throws IOException { if (lastRoArchive.isPresent()) { return new SplitSegmentArchiveManager( - roPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor), - rwPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor), + roPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor, remoteStoreMonitor), + rwPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor, new RemoteStoreMonitorAdapter()), lastRoArchive.get()); } else { - return rwPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor); + return rwPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor, new RemoteStoreMonitorAdapter()); } } Index: oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java (date 1548149137000) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java (date 1558706540000) @@ -21,6 +21,7 @@ import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; import org.apache.jackrabbit.oak.segment.file.tar.TarFileTest; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; import org.junit.Before; import org.junit.ClassRule; import org.junit.Ignore; @@ -42,7 +43,7 @@ public void setUp() throws IOException { try { container = azurite.getContainer("oak-test"); - archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); } catch (StorageException | InvalidKeyException | URISyntaxException e) { throw new IOException(e); } Index: oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java (date 1548149137000) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java (date 1558706540000) @@ -20,6 +20,7 @@ import com.microsoft.azure.storage.blob.CloudBlobContainer; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; import org.apache.jackrabbit.oak.segment.file.tar.TarWriterTest; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; import org.junit.Before; import org.junit.ClassRule; @@ -40,7 +41,7 @@ try { monitor = new TestFileStoreMonitor(); container = azurite.getContainer("oak-test"); - archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, false, new IOMonitorAdapter(), monitor); + archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, false, new IOMonitorAdapter(), monitor, new RemoteStoreMonitorAdapter()); } catch (StorageException | InvalidKeyException | URISyntaxException e) { throw new IOException(e); } Index: oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java (date 1548149137000) +++ oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java (date 1559142678000) @@ -37,10 +37,7 @@ import org.apache.jackrabbit.oak.segment.azure.tool.SegmentCopy; import org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.SegmentStoreType; import org.apache.jackrabbit.oak.segment.file.FileStore; -import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; -import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; -import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; -import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; +import org.apache.jackrabbit.oak.segment.spi.monitor.*; import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFileReader; import org.apache.jackrabbit.oak.segment.spi.persistence.ManifestFile; @@ -88,11 +85,12 @@ assertEquals(0, code); IOMonitor ioMonitor = new IOMonitorAdapter(); + RemoteStoreMonitor remoteStoreMonitor = new RemoteStoreMonitorAdapter(); FileStoreMonitor fileStoreMonitor = new FileStoreMonitorAdapter(); SegmentArchiveManager srcArchiveManager = srcPersistence.createArchiveManager(false, false, ioMonitor, - fileStoreMonitor); + fileStoreMonitor, remoteStoreMonitor); SegmentArchiveManager destArchiveManager = destPersistence.createArchiveManager(false, false, ioMonitor, - fileStoreMonitor); + fileStoreMonitor, remoteStoreMonitor); checkArchives(srcArchiveManager, destArchiveManager); checkJournal(srcPersistence, destPersistence); Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java (date 1559129976000) @@ -73,6 +73,7 @@ .withDirectory(directory) .withTarRecovery(recovery) .withIOMonitor(ioMonitor) + .withRemoteStoreMonitor(remoteStoreMonitor) .withMemoryMapping(memoryMapping) .withReadOnly() .withPersistence(builder.getPersistence()) Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java (date 1559129976000) @@ -52,6 +52,7 @@ import org.apache.jackrabbit.oak.segment.file.tar.TarFiles; import org.apache.jackrabbit.oak.segment.file.tar.TarRecovery; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; import org.apache.jackrabbit.oak.segment.spi.persistence.Buffer; import org.apache.jackrabbit.oak.spi.blob.BlobStore; @@ -128,6 +129,8 @@ protected final IOMonitor ioMonitor; + protected final RemoteStoreMonitor remoteStoreMonitor; + AbstractFileStore(final FileStoreBuilder builder) { this.directory = builder.getDirectory(); this.tracker = new SegmentTracker(new SegmentIdFactory() { @@ -148,6 +151,7 @@ this.memoryMapping = builder.getMemoryMapping(); this.offHeapAccess = builder.getOffHeapAccess(); this.ioMonitor = builder.getIOMonitor(); + this.remoteStoreMonitor = builder.getRemoteStoreMonitor(); this.segmentBufferMonitor = new SegmentBufferMonitor(builder.getStatsProvider()); } Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java (date 1559212970000) @@ -47,9 +47,7 @@ import org.apache.jackrabbit.oak.segment.file.proc.Proc.Backend; import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration; import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; -import org.apache.jackrabbit.oak.segment.spi.monitor.CompositeIOMonitor; -import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; -import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; +import org.apache.jackrabbit.oak.segment.spi.monitor.*; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; import org.apache.jackrabbit.oak.segment.tool.iotrace.IOTraceLogWriter; import org.apache.jackrabbit.oak.segment.tool.iotrace.IOTraceMonitor; @@ -135,6 +133,9 @@ @NotNull private final Set ioMonitors = newHashSet(); + @NotNull + private final Set remoteStoreMonitors = newHashSet(); + private boolean strictVersionCheck; private boolean built; @@ -325,6 +326,12 @@ return this; } + @NotNull + public FileStoreBuilder withRemoteStoreMonitor(@NotNull RemoteStoreMonitor remoteStoreMonitor){ + remoteStoreMonitors.add(checkNotNull(remoteStoreMonitor)); + return this; + } + /** * Log IO reads at debug level to the passed logger * @param logger logger for logging IO reads @@ -521,6 +528,12 @@ : new CompositeIOMonitor(ioMonitors); } + RemoteStoreMonitor getRemoteStoreMonitor() { + return remoteStoreMonitors.isEmpty() + ? new RemoteStoreMonitorAdapter() + : new CompositeRemoteStoreMonitor(remoteStoreMonitors); + } + boolean getStrictVersionCheck() { return strictVersionCheck; } Index: oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveReader.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveReader.java (date 1548149137000) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveReader.java (date 1559546733000) @@ -37,13 +37,19 @@ import com.microsoft.azure.storage.blob.CloudBlobDirectory; import com.microsoft.azure.storage.blob.CloudBlockBlob; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveReader; import org.apache.jackrabbit.oak.segment.spi.persistence.Buffer; +import org.apache.jackrabbit.oak.stats.StatisticsProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class AzureSegmentArchiveReader implements SegmentArchiveReader { static final boolean OFF_HEAP = getBoolean("access.off.heap"); + private static final Logger log = LoggerFactory.getLogger(AzureSegmentArchiveReader.class); + private final CloudBlobDirectory archiveDirectory; private final IOMonitor ioMonitor; @@ -54,9 +60,12 @@ private Boolean hasGraph; - AzureSegmentArchiveReader(CloudBlobDirectory archiveDirectory, IOMonitor ioMonitor) throws IOException { + private final RemoteStoreMonitor azureStoreMonitor; + + AzureSegmentArchiveReader(CloudBlobDirectory archiveDirectory, IOMonitor ioMonitor, RemoteStoreMonitor remoteStoreMonitor) throws IOException { this.archiveDirectory = archiveDirectory; this.ioMonitor = ioMonitor; + this.azureStoreMonitor = remoteStoreMonitor; long length = 0; for (CloudBlob blob : AzureUtilities.getBlobs(archiveDirectory).collect(Collectors.toList())) { Map metadata = blob.getMetadata(); @@ -112,7 +121,8 @@ if (hasGraph == null) { try { getGraph(); - } catch (IOException ignore) { } + } catch (IOException ignore) { + } } return hasGraph; } @@ -147,9 +157,17 @@ } private CloudBlockBlob getBlob(String name) throws IOException { + Stopwatch stopwatch = Stopwatch.createStarted(); try { - return archiveDirectory.getBlockBlobReference(name); + CloudBlockBlob blob = archiveDirectory.getBlockBlobReference(name); + azureStoreMonitor.requestDuration(stopwatch.elapsed(TimeUnit.NANOSECONDS)); + log.info("Request to repo"); + azureStoreMonitor.requestCount(); + return blob; } catch (URISyntaxException | StorageException e) { + azureStoreMonitor.requestDuration(stopwatch.elapsed(TimeUnit.NANOSECONDS)); + log.error("Request error to repo"); + azureStoreMonitor.requestError(); throw new IOException(e); } } Index: oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentStoreMigrator.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentStoreMigrator.java (date 1548149137000) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentStoreMigrator.java (date 1558706540000) @@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.persistence.Buffer; import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFileReader; @@ -131,9 +132,9 @@ return; } SegmentArchiveManager sourceManager = source.createArchiveManager(false, false, new IOMonitorAdapter(), - new FileStoreMonitorAdapter()); + new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); SegmentArchiveManager targetManager = target.createArchiveManager(false, false, new IOMonitorAdapter(), - new FileStoreMonitorAdapter()); + new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); for (String archiveName : sourceManager.listArchives()) { log.info("{}/{} -> {}", sourceName, archiveName, targetName); try (SegmentArchiveReader reader = sourceManager.forceOpen(archiveName)) { Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java (date 1558706540000) @@ -30,6 +30,7 @@ import org.apache.jackrabbit.oak.segment.file.LocalManifestFile; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.ManifestFile; @@ -62,7 +63,7 @@ @Override public SegmentArchiveManager createArchiveManager(boolean memoryMapping, boolean offHeapAccess, IOMonitor ioMonitor, - FileStoreMonitor fileStoreMonitor) { + FileStoreMonitor fileStoreMonitor, RemoteStoreMonitor remoteStoreMonitor) { return new SegmentTarManager(directory, fileStoreMonitor, ioMonitor, memoryMapping, offHeapAccess); } Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/CompositeRemoteStoreMonitor.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/CompositeRemoteStoreMonitor.java (date 1559212607000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/CompositeRemoteStoreMonitor.java (date 1559212607000) @@ -0,0 +1,51 @@ +package org.apache.jackrabbit.oak.segment.spi.monitor; + +import org.apache.jackrabbit.oak.spi.whiteboard.Registration; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Set; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Sets.newConcurrentHashSet; +import static java.util.Collections.emptySet; + +public class CompositeRemoteStoreMonitor implements RemoteStoreMonitor { + + private static final Logger LOG = LoggerFactory.getLogger(CompositeRemoteStoreMonitor.class); + + private final Set remoteStoreMonitors; + + public CompositeRemoteStoreMonitor(@NotNull Iterable remoteStoreMonitors){ + this.remoteStoreMonitors = newConcurrentHashSet(checkNotNull(remoteStoreMonitors)); + } + + public CompositeRemoteStoreMonitor() {this(emptySet());} + + @NotNull + public Registration registerRemoteStoreMonitor(@NotNull RemoteStoreMonitor remoteStoreMonitor){ + remoteStoreMonitors.add(checkNotNull(remoteStoreMonitor)); + return () -> remoteStoreMonitors.remove(remoteStoreMonitor); + } + + @Override + public void requestCount() { + LOG.info("in composite remote store request count"); + remoteStoreMonitors.forEach(remoteStoreMonitor -> + remoteStoreMonitor.requestCount()); + } + + @Override + public void requestError() { + LOG.info("in composite remote store request count error"); + remoteStoreMonitors.forEach(remoteStoreMonitor -> + remoteStoreMonitor.requestError()); + } + + @Override + public void requestDuration(long duration) { + LOG.info("in composite remote store request count duration"); + remoteStoreMonitors.forEach(remoteStoreMonitor -> + remoteStoreMonitor.requestDuration(duration)); + } +} Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java (date 1559129388000) @@ -52,6 +52,7 @@ import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; import org.apache.jackrabbit.oak.segment.spi.persistence.Buffer; @@ -122,6 +123,8 @@ private FileStoreMonitor fileStoreMonitor; + private RemoteStoreMonitor remoteStoreMonitor; + private long maxFileSize; private boolean readOnly; @@ -166,6 +169,11 @@ return this; } + public Builder withRemoteStoreMonitor(RemoteStoreMonitor remoteStoreMonitor) { + this.remoteStoreMonitor = checkNotNull(remoteStoreMonitor); + return this; + } + public Builder withMaxFileSize(long maxFileSize) { checkArgument(maxFileSize > 0); this.maxFileSize = maxFileSize; @@ -197,6 +205,7 @@ checkState(tarRecovery != null, "TAR recovery strategy not specified"); checkState(ioMonitor != null, "I/O monitor not specified"); checkState(readOnly || fileStoreMonitor != null, "File store statistics not specified"); + checkState(remoteStoreMonitor != null, "Remote store statistics not specified"); checkState(readOnly || maxFileSize != 0, "Max file size not specified"); if (persistence == null) { persistence = new TarPersistence(directory); @@ -224,6 +233,10 @@ return fileStoreMonitor; } + public RemoteStoreMonitor getRemoteStoreMonitor() { + return remoteStoreMonitor; + } + public long getMaxFileSize() { return maxFileSize; } @@ -233,7 +246,7 @@ } private SegmentArchiveManager buildArchiveManager() throws IOException { - return persistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, readOnly && fileStoreMonitor == null ? new FileStoreMonitorAdapter() : fileStoreMonitor); + return persistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, readOnly && fileStoreMonitor == null ? new FileStoreMonitorAdapter() : fileStoreMonitor, remoteStoreMonitor); } } @@ -493,7 +506,7 @@ } /** - * @return the number of segments in the segment store + * @return the number of segments in the segment store */ public int segmentCount() { int count = 0; Index: oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java (date 1548149137000) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java (date 1558706540000) @@ -45,6 +45,7 @@ import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; import org.apache.jackrabbit.oak.segment.spi.persistence.Buffer; @@ -108,7 +109,7 @@ SegmentArchiveManager archiveManager = null; try { archiveManager = persistence.createArchiveManager(false, false, new IOMonitorAdapter(), - new FileStoreMonitorAdapter()); + new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); } catch (IOException e) { throw new IllegalArgumentException( "Could not access the Azure Storage. Please verify the path provided!"); Index: oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java (date 1548149137000) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java (date 1558706540000) @@ -22,6 +22,7 @@ import com.microsoft.azure.storage.blob.CloudBlobDirectory; import com.microsoft.azure.storage.blob.CloudBlockBlob; import com.microsoft.azure.storage.blob.ListBlobItem; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFile; import org.apache.jackrabbit.oak.segment.spi.persistence.ManifestFile; @@ -49,8 +50,8 @@ } @Override - public SegmentArchiveManager createArchiveManager(boolean mmap, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) { - return new AzureArchiveManager(segmentstoreDirectory, ioMonitor, fileStoreMonitor); + public SegmentArchiveManager createArchiveManager(boolean mmap, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor, RemoteStoreMonitor remoteStoreMonitor) { + return new AzureArchiveManager(segmentstoreDirectory, ioMonitor, fileStoreMonitor, remoteStoreMonitor); } @Override Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java (date 1558706540000) @@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.segment.file.proc.Proc.Backend; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveReader; @@ -55,7 +56,7 @@ FileStoreProcBackend(AbstractFileStore fileStore, SegmentNodeStorePersistence persistence) throws IOException { this.fileStore = fileStore; this.persistence = persistence; - this.archiveManager = persistence.createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + this.archiveManager = persistence.createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); } @Override Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitorAdapter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitorAdapter.java (date 1559201911000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitorAdapter.java (date 1559201911000) @@ -0,0 +1,27 @@ +package org.apache.jackrabbit.oak.segment.spi.monitor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RemoteStoreMonitorAdapter implements RemoteStoreMonitor { + + private static final Logger log = LoggerFactory.getLogger(RemoteStoreMonitorAdapter.class); + + @Override + public void requestCount() { + // Intentionally left blank + log.info("RemoteStoreMonitorAdapter - request count"); + } + + @Override + public void requestError() { + // Intentionally left blank + log.info("RemoteStoreMonitorAdapter - request error count"); + } + + @Override + public void requestDuration(long duration) { + // Intentionally left blank + log.info("RemoteStoreMonitorAdapter - request time count"); + } +} Index: oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java (date 1548149137000) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManager.java (date 1558706540000) @@ -22,6 +22,7 @@ import com.microsoft.azure.storage.blob.CloudBlobDirectory; import com.microsoft.azure.storage.blob.CloudBlockBlob; import com.microsoft.azure.storage.blob.CopyStatus; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; @@ -59,10 +60,13 @@ private final FileStoreMonitor monitor; - public AzureArchiveManager(CloudBlobDirectory cloudBlobDirectory, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) { + private final RemoteStoreMonitor azureRemoteStoreMonitor; + + public AzureArchiveManager(CloudBlobDirectory cloudBlobDirectory, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor, RemoteStoreMonitor remoteStoreMonitor) { this.cloudBlobDirectory = cloudBlobDirectory; this.ioMonitor = ioMonitor; this.monitor = fileStoreMonitor; + this.azureRemoteStoreMonitor = remoteStoreMonitor; } @Override @@ -91,7 +95,7 @@ if (!archiveDirectory.getBlockBlobReference("closed").exists()) { throw new IOException("The archive " + archiveName + " hasn't been closed correctly."); } - return new AzureSegmentArchiveReader(archiveDirectory, ioMonitor); + return new AzureSegmentArchiveReader(archiveDirectory, ioMonitor, azureRemoteStoreMonitor); } catch (StorageException | URISyntaxException e) { throw new IOException(e); } @@ -100,12 +104,12 @@ @Override public SegmentArchiveReader forceOpen(String archiveName) throws IOException { CloudBlobDirectory archiveDirectory = getDirectory(archiveName); - return new AzureSegmentArchiveReader(archiveDirectory, ioMonitor); + return new AzureSegmentArchiveReader(archiveDirectory, ioMonitor, azureRemoteStoreMonitor); } @Override public SegmentArchiveWriter create(String archiveName) throws IOException { - return new AzureSegmentArchiveWriter(getDirectory(archiveName), ioMonitor, monitor); + return new AzureSegmentArchiveWriter(getDirectory(archiveName), ioMonitor, monitor, azureRemoteStoreMonitor); } @Override Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java (date 1558706540000) @@ -22,6 +22,7 @@ import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; /** * This type is a main entry point for the segment node store persistence. It's @@ -44,7 +45,7 @@ * @throws IOException */ SegmentArchiveManager createArchiveManager(boolean memoryMapping, boolean offHeapAccess, IOMonitor ioMonitor, - FileStoreMonitor fileStoreMonitor) throws IOException; + FileStoreMonitor fileStoreMonitor, RemoteStoreMonitor remoteStoreMonitor) throws IOException; /** * Check if the segment store already contains any segments Index: oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriter.java (date 1548149137000) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriter.java (date 1559138909000) @@ -38,17 +38,24 @@ import org.apache.jackrabbit.oak.segment.azure.queue.SegmentWriteQueue; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveWriter; import org.apache.jackrabbit.oak.segment.spi.persistence.Buffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class AzureSegmentArchiveWriter implements SegmentArchiveWriter { + private static final Logger log = LoggerFactory.getLogger(AzureSegmentArchiveWriter.class); + private final CloudBlobDirectory archiveDirectory; private final IOMonitor ioMonitor; private final FileStoreMonitor monitor; + private final RemoteStoreMonitor azureRemoteStoreMonitor; + private final Optional queue; private Map index = Collections.synchronizedMap(new LinkedHashMap<>()); @@ -59,10 +66,11 @@ private volatile boolean created = false; - public AzureSegmentArchiveWriter(CloudBlobDirectory archiveDirectory, IOMonitor ioMonitor, FileStoreMonitor monitor) { + public AzureSegmentArchiveWriter(CloudBlobDirectory archiveDirectory, IOMonitor ioMonitor, FileStoreMonitor monitor, RemoteStoreMonitor remoteStoreMonitor) { this.archiveDirectory = archiveDirectory; this.ioMonitor = ioMonitor; this.monitor = monitor; + this.azureRemoteStoreMonitor = remoteStoreMonitor; this.queue = SegmentWriteQueue.THREADS > 0 ? Optional.of(new SegmentWriteQueue(this::doWriteEntry)) : Optional.empty(); } @@ -200,9 +208,17 @@ } private CloudBlockBlob getBlob(String name) throws IOException { + Stopwatch stopwatch = Stopwatch.createStarted(); try { - return archiveDirectory.getBlockBlobReference(name); + CloudBlockBlob blob =archiveDirectory.getBlockBlobReference(name); + azureRemoteStoreMonitor.requestDuration(stopwatch.elapsed(TimeUnit.NANOSECONDS)); + azureRemoteStoreMonitor.requestCount(); + log.info("Request to azure store"); + return blob; } catch (URISyntaxException | StorageException e) { + azureRemoteStoreMonitor.requestDuration(stopwatch.elapsed(TimeUnit.NANOSECONDS)); + azureRemoteStoreMonitor.requestError(); + log.error("Request error to azure store"); throw new IOException(e); } } Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreRegistrar.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreRegistrar.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreRegistrar.java (date 1559128748000) @@ -52,12 +52,7 @@ import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions; import org.apache.jackrabbit.oak.segment.compaction.SegmentRevisionGC; import org.apache.jackrabbit.oak.segment.compaction.SegmentRevisionGCMBean; -import org.apache.jackrabbit.oak.segment.file.FileStore; -import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder; -import org.apache.jackrabbit.oak.segment.file.FileStoreGCMonitor; -import org.apache.jackrabbit.oak.segment.file.FileStoreStatsMBean; -import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; -import org.apache.jackrabbit.oak.segment.file.MetricsIOMonitor; +import org.apache.jackrabbit.oak.segment.file.*; import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; import org.apache.jackrabbit.oak.segment.split.SplitPersistence; @@ -228,7 +223,7 @@ .withMemoryMapping(cfg.getMemoryMapping()) .withGCMonitor(gcMonitor) .withIOMonitor(new MetricsIOMonitor(cfg.getStatisticsProvider())) - .withStatisticsProvider(cfg.getStatisticsProvider()) + .withRemoteStoreMonitor(new MetricsRemoteStoreMonitor(cfg.getStatisticsProvider())) .withGCOptions(gcOptions); if (cfg.hasCustomBlobStore() && cfg.getBlobStore() != null) { Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsRemoteStoreMonitor.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsRemoteStoreMonitor.java (date 1559295582000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsRemoteStoreMonitor.java (date 1559295582000) @@ -0,0 +1,48 @@ +package org.apache.jackrabbit.oak.segment.file; + +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; +import org.apache.jackrabbit.oak.stats.CounterStats; +import org.apache.jackrabbit.oak.stats.StatisticsProvider; +import org.apache.jackrabbit.oak.stats.StatsOptions; +import org.apache.jackrabbit.oak.stats.TimerStats; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.TimeUnit; + +public class MetricsRemoteStoreMonitor extends RemoteStoreMonitorAdapter { + + private static final Logger log = LoggerFactory.getLogger(MetricsRemoteStoreMonitor.class); + + public static final String REQUEST_COUNT = "REQUEST_COUNT"; + public static final String REQUEST_ERROR = "REQUEST_ERROR"; + public static final String REQUEST_DURATION = "REQUEST_DURATION"; + + private final CounterStats requestCountStats; + private final CounterStats requestErrorStats; + private final TimerStats requestDurationStats; + + public MetricsRemoteStoreMonitor(@NotNull StatisticsProvider statisticsProvider) { + requestCountStats = statisticsProvider.getCounterStats(REQUEST_COUNT, StatsOptions.DEFAULT); + requestErrorStats = statisticsProvider.getCounterStats(REQUEST_ERROR, StatsOptions.DEFAULT); + requestDurationStats = statisticsProvider.getTimer(REQUEST_DURATION, StatsOptions.METRICS_ONLY); + } + + @Override + public void requestCount() { + log.info("MetricsRemoteStoreMonitor - request count inc"); + requestCountStats.inc(); } + + @Override + public void requestError() { + log.info("MetricsRemoteStoreMonitor - request count error inc"); + requestErrorStats.inc(); + } + + @Override + public void requestDuration(long duration) { + log.info("MetricsRemoteStoreMonitor - request time inc"); + requestDurationStats.update(duration, TimeUnit.NANOSECONDS); + } +} Index: oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java (date 1548149137000) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java (date 1558706540000) @@ -31,6 +31,7 @@ import org.apache.jackrabbit.oak.segment.file.tar.binaries.InvalidBinaryReferencesIndexException; import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter; +import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveReader; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; @@ -134,7 +135,7 @@ splitFileStore.close(); splitFileStore = null; - SegmentArchiveManager manager = splitPersistence.createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + SegmentArchiveManager manager = splitPersistence.createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter()); for (String archive : manager.listArchives()) { SegmentArchiveReader reader = manager.open(archive); BinaryReferencesIndexLoader.parseBinaryReferencesIndex(reader.getBinaryReferences()); Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitor.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitor.java (date 1558706540000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitor.java (date 1558706540000) @@ -0,0 +1,11 @@ +package org.apache.jackrabbit.oak.segment.spi.monitor; + +public interface RemoteStoreMonitor { + + public void requestCount(); + + public void requestError(); + + public void requestDuration(long duration); + +} Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (date 1548149137000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (date 1559129976000) @@ -157,6 +157,7 @@ .withMemoryMapping(memoryMapping) .withTarRecovery(recovery) .withIOMonitor(ioMonitor) + .withRemoteStoreMonitor(remoteStoreMonitor) .withFileStoreMonitor(stats) .withMaxFileSize(builder.getMaxFileSize() * MB) .withPersistence(builder.getPersistence())