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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java (date 1559832789000) @@ -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/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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreRegistrar.java (date 1559832789000) @@ -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-azure/pom.xml IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-azure/pom.xml (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/pom.xml (date 1559913412000) @@ -130,7 +130,7 @@ com.microsoft.azure azure-storage - 5.0.0 + 8.0.0 com.microsoft.azure 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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java (date 1559832789000) @@ -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-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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java (date 1559832789000) @@ -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/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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java (date 1559832963000) @@ -26,11 +26,11 @@ import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder; import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException; import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence; -import org.apache.jackrabbit.oak.segment.file.tar.binaries.BinaryReferencesIndex; import org.apache.jackrabbit.oak.segment.file.tar.binaries.BinaryReferencesIndexLoader; 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 +134,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-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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java (date 1559899150000) @@ -16,12 +16,13 @@ */ package org.apache.jackrabbit.oak.segment.azure; -import com.microsoft.azure.storage.StorageException; +import com.microsoft.azure.storage.*; import com.microsoft.azure.storage.blob.BlobListingDetails; import com.microsoft.azure.storage.blob.CloudAppendBlob; 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; @@ -36,7 +37,9 @@ import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Paths; +import java.util.Date; import java.util.EnumSet; +import java.util.concurrent.TimeUnit; public class AzurePersistence implements SegmentNodeStorePersistence { @@ -49,7 +52,8 @@ } @Override - public SegmentArchiveManager createArchiveManager(boolean mmap, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) { + public SegmentArchiveManager createArchiveManager(boolean mmap, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor, RemoteStoreMonitor remoteStoreMonitor) { + azureRemoteStoreMonitor(remoteStoreMonitor); return new AzureArchiveManager(segmentstoreDirectory, ioMonitor, fileStoreMonitor); } @@ -111,4 +115,32 @@ } } + private void azureRemoteStoreMonitor(RemoteStoreMonitor remoteStoreMonitor){ + + OperationContext operationContext = new OperationContext(); + + operationContext.getGlobalRequestCompletedEventHandler().addListener(new StorageEvent() { + + @Override + public void eventOccurred(RequestCompletedEvent eventArg) { + Date startDate = eventArg.getRequestResult().getStartDate(); + Date stopDate = eventArg.getRequestResult().getStopDate(); + long requestDuration = stopDate.getTime() - startDate.getTime(); + remoteStoreMonitor.requestCount(); + remoteStoreMonitor.requestDuration(requestDuration, TimeUnit.MILLISECONDS); + } + }); + + operationContext.getGlobalErrorReceivingResponseEventHandler().addListener(new StorageEvent() { + @Override + public void eventOccurred(ErrorReceivingResponseEvent eventArg) { + Date startDate = eventArg.getRequestResult().getStartDate(); + Date stopDate = eventArg.getRequestResult().getStopDate(); + long requestDuration = stopDate.getTime() - startDate.getTime(); + remoteStoreMonitor.requestError(); + remoteStoreMonitor.requestDuration(requestDuration, TimeUnit.MILLISECONDS); + } + }); + } + } 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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentStoreMigrator.java (date 1559832963000) @@ -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-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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java (date 1559832963000) @@ -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/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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java (date 1559832963000) @@ -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-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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java (date 1559832963000) @@ -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/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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java (date 1559832963000) @@ -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-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 1559834303000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsRemoteStoreMonitor.java (date 1559834303000) @@ -0,0 +1,40 @@ +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 java.util.concurrent.TimeUnit; + +public class MetricsRemoteStoreMonitor extends RemoteStoreMonitorAdapter { + + 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() { + requestCountStats.inc(); } + + @Override + public void requestError() { + requestErrorStats.inc(); + } + + @Override + public void requestDuration(long duration, TimeUnit timeUnit) { + requestDurationStats.update(duration, timeUnit); + } +} 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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java (date 1559832789000) @@ -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/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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java (date 1559832789000) @@ -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-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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java (date 1559832963000) @@ -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/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 1559834319000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitor.java (date 1559834319000) @@ -0,0 +1,13 @@ +package org.apache.jackrabbit.oak.segment.spi.monitor; + +import java.util.concurrent.TimeUnit; + +public interface RemoteStoreMonitor { + + public void requestCount(); + + public void requestError(); + + public void requestDuration(long duration, TimeUnit timeUnit); + +} 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 1559834319000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/monitor/RemoteStoreMonitorAdapter.java (date 1559834319000) @@ -0,0 +1,22 @@ +package org.apache.jackrabbit.oak.segment.spi.monitor; + +import java.util.concurrent.TimeUnit; + +public class RemoteStoreMonitorAdapter implements RemoteStoreMonitor { + + + @Override + public void requestCount() { + // Intentionally left blank + } + + @Override + public void requestError() { + // Intentionally left blank + } + + @Override + public void requestDuration(long duration, TimeUnit timeUnit) { + // Intentionally left blank + } +} 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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java (date 1559832789000) @@ -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-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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (date 1559832789000) @@ -157,6 +157,7 @@ .withMemoryMapping(memoryMapping) .withTarRecovery(recovery) .withIOMonitor(ioMonitor) + .withRemoteStoreMonitor(remoteStoreMonitor) .withFileStoreMonitor(stats) .withMaxFileSize(builder.getMaxFileSize() * MB) .withPersistence(builder.getPersistence()) 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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java (date 1559832789000) @@ -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/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 (revision 06148d98cdc8daee560989976a3c41761bfb590a) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java (date 1559832789000) @@ -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 RemoteStoreMonitor remoteStoreMonitor; + private boolean strictVersionCheck; private boolean built; @@ -325,6 +326,12 @@ return this; } + @NotNull + public FileStoreBuilder withRemoteStoreMonitor(@NotNull RemoteStoreMonitor remoteStoreMonitor){ + this.remoteStoreMonitor = remoteStoreMonitor; + return this; + } + /** * Log IO reads at debug level to the passed logger * @param logger logger for logging IO reads @@ -521,6 +528,10 @@ : new CompositeIOMonitor(ioMonitors); } + RemoteStoreMonitor getRemoteStoreMonitor() { + return remoteStoreMonitor; + } + boolean getStrictVersionCheck() { return strictVersionCheck; }