diff --git oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java index b1340a32f3..5392d9ed7f 100644 --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java @@ -49,7 +49,7 @@ public class AzurePersistence implements SegmentNodeStorePersistence { } @Override - public SegmentArchiveManager createArchiveManager(boolean mmap, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) { + public SegmentArchiveManager createArchiveManager(boolean mmap, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) { return new AzureArchiveManager(segmentstoreDirectory, ioMonitor, fileStoreMonitor); } diff --git oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentCopy.java oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentCopy.java index aee3fec271..6a83916d5d 100644 --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentCopy.java +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/SegmentCopy.java @@ -247,9 +247,9 @@ public class SegmentCopy { IOMonitor ioMonitor = new IOMonitorAdapter(); FileStoreMonitor fileStoreMonitor = new FileStoreMonitorAdapter(); - SegmentArchiveManager srcArchiveManager = srcPersistence.createArchiveManager(false, ioMonitor, + SegmentArchiveManager srcArchiveManager = srcPersistence.createArchiveManager(false, false, ioMonitor, fileStoreMonitor); - SegmentArchiveManager destArchiveManager = destPersistence.createArchiveManager(false, ioMonitor, + SegmentArchiveManager destArchiveManager = destPersistence.createArchiveManager(false, false, ioMonitor, fileStoreMonitor); copyArchives(srcArchiveManager, destArchiveManager); diff --git oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java index a3867b9460..37d052dc9a 100644 --- oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java +++ oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java @@ -108,7 +108,7 @@ public class ToolUtils { public static SegmentArchiveManager createArchiveManager(SegmentNodeStorePersistence persistence) { SegmentArchiveManager archiveManager = null; try { - archiveManager = persistence.createArchiveManager(false, new IOMonitorAdapter(), + archiveManager = persistence.createArchiveManager(false, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); } catch (IOException e) { throw new IllegalArgumentException( diff --git oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java index c8f8aeac7a..78e4230481 100644 --- oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java +++ oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java @@ -89,9 +89,9 @@ public abstract class SegmentCopyTestBase { IOMonitor ioMonitor = new IOMonitorAdapter(); FileStoreMonitor fileStoreMonitor = new FileStoreMonitorAdapter(); - SegmentArchiveManager srcArchiveManager = srcPersistence.createArchiveManager(false, ioMonitor, + SegmentArchiveManager srcArchiveManager = srcPersistence.createArchiveManager(false, false, ioMonitor, fileStoreMonitor); - SegmentArchiveManager destArchiveManager = destPersistence.createArchiveManager(false, ioMonitor, + SegmentArchiveManager destArchiveManager = destPersistence.createArchiveManager(false, false, ioMonitor, fileStoreMonitor); checkArchives(srcArchiveManager, destArchiveManager); diff --git oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java index cf359f77fb..04b0461fff 100644 --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java @@ -61,7 +61,7 @@ public class AzureArchiveManagerTest { @Test public void testRecovery() throws StorageException, URISyntaxException, IOException { - SegmentArchiveManager manager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + SegmentArchiveManager manager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); SegmentArchiveWriter writer = manager.create("data00000a.tar"); List uuids = new ArrayList<>(); diff --git oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java index bba4713c9f..baf73c2cea 100644 --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java @@ -42,7 +42,7 @@ public class AzureTarFileTest extends TarFileTest { public void setUp() throws IOException { try { container = azurite.getContainer("oak-test"); - archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); } catch (StorageException | InvalidKeyException | URISyntaxException e) { throw new IOException(e); } diff --git oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java index ab4ee852c2..a0f77b71c6 100644 --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java @@ -40,7 +40,7 @@ public class AzureTarWriterTest extends TarWriterTest { try { monitor = new TestFileStoreMonitor(); container = azurite.getContainer("oak-test"); - archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, new IOMonitorAdapter(), monitor); + archiveManager = new AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true, false, new IOMonitorAdapter(), monitor); } catch (StorageException | InvalidKeyException | URISyntaxException e) { throw new IOException(e); } diff --git oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java index 1337d71dc9..f0616c869f 100644 --- oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java +++ oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/split/SplitPersistenceTest.java @@ -134,7 +134,7 @@ public class SplitPersistenceTest { splitFileStore.close(); splitFileStore = null; - SegmentArchiveManager manager = splitPersistence.createArchiveManager(true, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + SegmentArchiveManager manager = splitPersistence.createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); for (String archive : manager.listArchives()) { SegmentArchiveReader reader = manager.open(archive); BinaryReferencesIndexLoader.parseBinaryReferencesIndex(reader.getBinaryReferences()); diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java index 07332aa718..b514edfbc3 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java @@ -109,6 +109,8 @@ public abstract class AbstractFileStore implements SegmentStore, Closeable { final boolean memoryMapping; + final boolean offHeapAccess; + @NotNull final SegmentCache segmentCache; @@ -144,6 +146,7 @@ public abstract class AbstractFileStore implements SegmentStore, Closeable { builder.getStatsProvider().getMeter("oak.segment.reads", StatsOptions.DEFAULT) ); this.memoryMapping = builder.getMemoryMapping(); + this.offHeapAccess = builder.getOffHeapAccess(); this.ioMonitor = builder.getIOMonitor(); this.segmentBufferMonitor = new SegmentBufferMonitor(builder.getStatsProvider()); } diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java index bb7d1acbb6..abbd0ca0d1 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java @@ -194,9 +194,10 @@ public class FileStore extends AbstractFileStore { } }); - log.info("TarMK opened at {}, mmap={}, size={}", + log.info("TarMK opened at {}, mmap={}, offHeapAccess={}, size={}", directory, memoryMapping, + offHeapAccess, newPrintableBytes(size) ); log.debug("TAR files: {}", tarFiles); diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java index 3b58a9c5bc..8216e61ca2 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java @@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.segment.file; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Sets.newHashSet; +import static java.lang.Boolean.getBoolean; import static org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_STRING_CACHE_MB; import static org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_TEMPLATE_CACHE_MB; import static org.apache.jackrabbit.oak.segment.SegmentCache.DEFAULT_SEGMENT_CACHE_MB; @@ -36,6 +37,7 @@ import java.io.IOException; import java.util.Set; import com.google.common.base.Predicate; + import org.apache.jackrabbit.oak.segment.CacheWeights.NodeCacheWeigher; import org.apache.jackrabbit.oak.segment.CacheWeights.StringCacheWeigher; import org.apache.jackrabbit.oak.segment.CacheWeights.TemplateCacheWeigher; @@ -95,6 +97,8 @@ public class FileStoreBuilder { private boolean memoryMapping = MEMORY_MAPPING_DEFAULT; + private boolean offHeapAccess = getBoolean("access.off.heap"); + private SegmentNodeStorePersistence persistence; @NotNull @@ -133,7 +137,7 @@ public class FileStoreBuilder { private final Set ioMonitors = newHashSet(); private boolean strictVersionCheck; - + private boolean built; /** @@ -251,6 +255,17 @@ public class FileStoreBuilder { return this; } + /** + * Turn off heap access on or off + * @param offHeapAccess + * @return this instance + */ + @NotNull + public FileStoreBuilder withOffHeapAccess(boolean offHeapAccess) { + this.offHeapAccess = offHeapAccess; + return this; + } + /** * Set memory mapping to the default value based on OS properties * @return this instance @@ -337,7 +352,7 @@ public class FileStoreBuilder { this.strictVersionCheck = strictVersionCheck; return this; } - + public FileStoreBuilder withCustomPersistence(SegmentNodeStorePersistence persistence) throws IOException { this.persistence = persistence; return this; @@ -456,6 +471,10 @@ public class FileStoreBuilder { return memoryMapping; } + boolean getOffHeapAccess() { + return offHeapAccess; + } + @NotNull GCListener getGcListener() { return gcListener; @@ -470,7 +489,7 @@ public class FileStoreBuilder { SegmentGCOptions getGcOptions() { return gcOptions; } - + @NotNull SegmentNotFoundExceptionListener getSnfeListener() { return snfeListener; @@ -521,6 +540,7 @@ public class FileStoreBuilder { ", templateDeduplicationCacheSize=" + templateDeduplicationCacheSize + ", nodeDeduplicationCacheSize=" + nodeDeduplicationCacheSize + ", memoryMapping=" + memoryMapping + + ", offHeapAccess=" + offHeapAccess + ", gcOptions=" + gcOptions + '}'; } diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java index 2db0ab8f4d..235b312b50 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreProcBackend.java @@ -55,7 +55,7 @@ class FileStoreProcBackend implements Backend { FileStoreProcBackend(AbstractFileStore fileStore, SegmentNodeStorePersistence persistence) throws IOException { this.fileStore = fileStore; this.persistence = persistence; - this.archiveManager = persistence.createArchiveManager(true, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + this.archiveManager = persistence.createArchiveManager(true, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); } @Override diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java index e7c4ff9f27..160698e07c 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java @@ -19,7 +19,6 @@ package org.apache.jackrabbit.oak.segment.file.tar; import static com.google.common.base.Preconditions.checkState; -import static java.lang.Boolean.getBoolean; import static java.nio.channels.FileChannel.MapMode.READ_ONLY; import static org.apache.jackrabbit.oak.commons.IOUtils.readFully; @@ -36,8 +35,6 @@ import java.nio.channels.FileChannel; */ abstract class FileAccess { - private static final boolean OFF_HEAP = getBoolean("access.off.heap"); - abstract boolean isMemoryMapped(); abstract int length() throws IOException; @@ -87,14 +84,14 @@ abstract class FileAccess { } } - + /** * The implementation that uses random access file (reads are synchronized). - */ + */ static class Random extends FileAccess { private final RandomAccessFile file; - private final FileChannel channel; + protected final FileChannel channel; Random(RandomAccessFile file) { this.file = file; @@ -117,11 +114,8 @@ abstract class FileAccess { public synchronized ByteBuffer read(int position, int length) throws IOException { ByteBuffer entry; - if (OFF_HEAP) { - entry = ByteBuffer.allocateDirect(length); - } else { - entry = ByteBuffer.allocate(length); - } + entry = ByteBuffer.allocate(length); + if (readFully(channel, position, entry) < length) { throw new EOFException(); } @@ -136,4 +130,28 @@ abstract class FileAccess { } + /** + * The implementation that uses random access file (reads are synchronized) + * and off heap access. + */ + static class RandomOffHeap extends Random { + + RandomOffHeap(RandomAccessFile file) { + super(file); + } + + @Override + public synchronized ByteBuffer read(int position, int length) + throws IOException { + ByteBuffer entry; + entry = ByteBuffer.allocateDirect(length); + + if (readFully(channel, position, entry) < length) { + throw new EOFException(); + } + entry.flip(); + return entry; + } + } + } diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/SegmentTarManager.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/SegmentTarManager.java index d6903688a0..87caf93712 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/SegmentTarManager.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/SegmentTarManager.java @@ -18,11 +18,15 @@ */ package org.apache.jackrabbit.oak.segment.file.tar; +import static com.google.common.base.Charsets.UTF_8; +import static java.nio.ByteBuffer.wrap; +import static org.apache.jackrabbit.oak.segment.file.tar.TarConstants.BLOCK_SIZE; + import org.apache.commons.io.filefilter.SuffixFileFilter; +import org.apache.jackrabbit.oak.segment.file.tar.index.Index; 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.persistence.SegmentArchiveManager; -import org.apache.jackrabbit.oak.segment.file.tar.index.Index; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveReader; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveWriter; import org.slf4j.Logger; @@ -41,10 +45,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.CRC32; -import static com.google.common.base.Charsets.UTF_8; -import static java.nio.ByteBuffer.wrap; -import static org.apache.jackrabbit.oak.segment.file.tar.TarConstants.BLOCK_SIZE; - public class SegmentTarManager implements SegmentArchiveManager { /** @@ -65,11 +65,15 @@ public class SegmentTarManager implements SegmentArchiveManager { private final boolean memoryMapping; - public SegmentTarManager(File segmentstoreDir, FileStoreMonitor fileStoreMonitor, IOMonitor ioMonitor, boolean memoryMapping) { + private final boolean offHeapAccess; + + public SegmentTarManager(File segmentstoreDir, FileStoreMonitor fileStoreMonitor, IOMonitor ioMonitor, boolean memoryMapping, + boolean offHeapAccess) { this.segmentstoreDir = segmentstoreDir; this.fileStoreMonitor = fileStoreMonitor; this.ioMonitor = ioMonitor; this.memoryMapping = memoryMapping; + this.offHeapAccess = offHeapAccess; } @Override @@ -102,7 +106,13 @@ public class SegmentTarManager implements SegmentArchiveManager { } } - FileAccess random = new FileAccess.Random(access); + FileAccess random = null; + if (offHeapAccess) { + random = new FileAccess.RandomOffHeap(access); + } else { + random = new FileAccess.Random(access); + } + // prevent the finally block from closing the file // as the returned TarReader will take care of that access = null; diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java index 9047d43ea1..9fade86c55 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java @@ -112,6 +112,8 @@ public class TarFiles implements Closeable { private boolean memoryMapping; + private boolean offHeapAccess; + private TarRecovery tarRecovery; private IOMonitor ioMonitor; @@ -138,6 +140,11 @@ public class TarFiles implements Closeable { return this; } + public Builder withOffHeapAccess(boolean offHeapAccess) { + this.offHeapAccess = offHeapAccess; + return this; + } + public Builder withTarRecovery(TarRecovery tarRecovery) { this.tarRecovery = checkNotNull(tarRecovery); return this; @@ -210,7 +217,7 @@ public class TarFiles implements Closeable { } private SegmentArchiveManager buildArchiveManager() throws IOException { - return persistence.createArchiveManager(memoryMapping, ioMonitor, readOnly && fileStoreMonitor == null ? new FileStoreMonitorAdapter() : fileStoreMonitor); + return persistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, readOnly && fileStoreMonitor == null ? new FileStoreMonitorAdapter() : fileStoreMonitor); } } @@ -354,6 +361,7 @@ public class TarFiles implements Closeable { writer = new TarWriter(archiveManager, writeNumber); } + @Override public void close() throws IOException { shutdown = true; diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java index 3ece84ac09..af1129bf62 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarPersistence.java @@ -19,6 +19,8 @@ package org.apache.jackrabbit.oak.segment.file.tar; import org.apache.commons.io.FileUtils; +import org.apache.jackrabbit.oak.segment.file.LocalGCJournalFile; +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.persistence.GCJournalFile; @@ -27,8 +29,6 @@ import org.apache.jackrabbit.oak.segment.spi.persistence.ManifestFile; import org.apache.jackrabbit.oak.segment.spi.persistence.RepositoryLock; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager; import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence; -import org.apache.jackrabbit.oak.segment.file.LocalGCJournalFile; -import org.apache.jackrabbit.oak.segment.file.LocalManifestFile; import java.io.File; import java.io.IOException; @@ -54,8 +54,9 @@ public class TarPersistence implements SegmentNodeStorePersistence { } @Override - public SegmentArchiveManager createArchiveManager(boolean memoryMapping, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) { - return new SegmentTarManager(directory, fileStoreMonitor, ioMonitor, memoryMapping); + public SegmentArchiveManager createArchiveManager(boolean memoryMapping, boolean offHeapAccess, IOMonitor ioMonitor, + FileStoreMonitor fileStoreMonitor) { + return new SegmentTarManager(directory, fileStoreMonitor, ioMonitor, memoryMapping, offHeapAccess); } @Override diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java index ef21b1b9b1..e4a991227c 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentNodeStorePersistence.java @@ -35,6 +35,7 @@ public interface SegmentNodeStorePersistence { * * @param memoryMapping whether the memory mapping should be used (if the given * persistence supports it) + * @param offHeapAccess whether off heap access for segements should be used * @param ioMonitor object used to monitor segment-related IO access. The * implementation should call the appropriate methods when * accessing segments. @@ -42,7 +43,8 @@ public interface SegmentNodeStorePersistence { * @return segment archive manager * @throws IOException */ - SegmentArchiveManager createArchiveManager(boolean memoryMapping, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) throws IOException; + SegmentArchiveManager createArchiveManager(boolean memoryMapping, boolean offHeapAccess, IOMonitor ioMonitor, + FileStoreMonitor fileStoreMonitor) throws IOException; /** * Check if the segment store already contains any segments diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java index fc2e94c337..350c2e8c84 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/split/SplitPersistence.java @@ -86,7 +86,7 @@ public class SplitPersistence implements SegmentNodeStorePersistence { } private Optional getLastArchive() throws IOException { - SegmentArchiveManager manager = roPersistence.createArchiveManager(false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); + SegmentArchiveManager manager = roPersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new FileStoreMonitorAdapter()); List archives = manager.listArchives(); if (archives.isEmpty()) { return Optional.empty(); @@ -97,14 +97,14 @@ public class SplitPersistence implements SegmentNodeStorePersistence { } @Override - public SegmentArchiveManager createArchiveManager(boolean memoryMapping, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) throws IOException { + public SegmentArchiveManager createArchiveManager(boolean memoryMapping, boolean offHeapAccess, IOMonitor ioMonitor, FileStoreMonitor fileStoreMonitor) throws IOException { if (lastRoArchive.isPresent()) { return new SplitSegmentArchiveManager( - roPersistence.createArchiveManager(memoryMapping, ioMonitor, fileStoreMonitor), - rwPersistence.createArchiveManager(memoryMapping, ioMonitor, fileStoreMonitor), + roPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor), + rwPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor), lastRoArchive.get()); } else { - return rwPersistence.createArchiveManager(memoryMapping, ioMonitor, fileStoreMonitor); + return rwPersistence.createArchiveManager(memoryMapping, offHeapAccess, ioMonitor, fileStoreMonitor); } } diff --git oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java index 55295d40af..a9cb3d8bfc 100644 --- oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java +++ oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java @@ -58,7 +58,7 @@ public class TarFileTest { @Before public void setUp() throws IOException { - archiveManager = new SegmentTarManager(folder.newFolder(), new FileStoreMonitorAdapter(), new IOMonitorAdapter(), false); + archiveManager = new SegmentTarManager(folder.newFolder(), new FileStoreMonitorAdapter(), new IOMonitorAdapter(), false, false); } protected long getWriteAndReadExpectedSize() { diff --git oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java index 964b40ced2..8a96c7f69c 100644 --- oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java +++ oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java @@ -49,7 +49,7 @@ public class TarWriterTest { @Before public void setUp() throws IOException { monitor = new TestFileStoreMonitor(); - archiveManager = new SegmentTarManager(folder.newFolder(), monitor, new IOMonitorAdapter(), false); + archiveManager = new SegmentTarManager(folder.newFolder(), monitor, new IOMonitorAdapter(), false, false); } @Test