diff --git a/core/model-vocabulary/src/main/java/org/eclipse/rdf4j/model/vocabulary/CONFIG.java b/core/model-vocabulary/src/main/java/org/eclipse/rdf4j/model/vocabulary/CONFIG.java index bc9096e4386..52b3fac5744 100644 --- a/core/model-vocabulary/src/main/java/org/eclipse/rdf4j/model/vocabulary/CONFIG.java +++ b/core/model-vocabulary/src/main/java/org/eclipse/rdf4j/model/vocabulary/CONFIG.java @@ -277,6 +277,12 @@ public static final class Native { */ public final static IRI namespaceIDCacheSize = createIRI(NAMESPACE, "native.namespaceIDCacheSize"); + /** + * tag:rdf4j.org,2025:config/native.memoryMappedTxnStatusFile + */ + public final static IRI memoryMappedTxnStatusFile = createIRI(NAMESPACE, + "native.memoryMappedTxnStatusFile"); + // ValueStore WAL configuration properties /** tag:rdf4j.org,2023:config/native.walMaxSegmentBytes */ public final static IRI walMaxSegmentBytes = createIRI(NAMESPACE, "native.walMaxSegmentBytes"); diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeSailStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeSailStore.java index cc84e1a08bb..2bf1954a954 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeSailStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeSailStore.java @@ -80,6 +80,7 @@ class NativeSailStore implements SailStore { private final ContextStore contextStore; private final boolean walEnabled; + private final Boolean memoryMappedTxnStatusFileEnabled; /** * A lock to control concurrent access by {@link NativeSailSink} to the TripleStore, ValueStore, and NamespaceStore. @@ -99,7 +100,7 @@ class NativeSailStore implements SailStore { public NativeSailStore(File dataDir, String tripleIndexes) throws IOException, SailException { this(dataDir, tripleIndexes, false, ValueStore.VALUE_CACHE_SIZE, ValueStore.VALUE_ID_CACHE_SIZE, ValueStore.NAMESPACE_CACHE_SIZE, ValueStore.NAMESPACE_ID_CACHE_SIZE, - -1L, -1, -1, null, -1L, -1L, null, false, false, true); + -1L, -1, -1, null, -1L, -1L, null, false, false, true, null); } /** @@ -114,7 +115,7 @@ public NativeSailStore(File dataDir, String tripleIndexes, boolean forceSync, in throws IOException, SailException { this(dataDir, tripleIndexes, forceSync, valueCacheSize, valueIDCacheSize, namespaceCacheSize, namespaceIDCacheSize, walMaxSegmentBytes, walQueueCapacity, walBatchBufferBytes, walSyncPolicy, - walSyncIntervalMillis, walIdlePollIntervalMillis, walDirectoryName, false, false, true); + walSyncIntervalMillis, walIdlePollIntervalMillis, walDirectoryName, false, false, true, null); } public NativeSailStore(File dataDir, String tripleIndexes, boolean forceSync, int valueCacheSize, @@ -122,9 +123,11 @@ public NativeSailStore(File dataDir, String tripleIndexes, boolean forceSync, in int walQueueCapacity, int walBatchBufferBytes, ValueStoreWalConfig.SyncPolicy walSyncPolicy, long walSyncIntervalMillis, long walIdlePollIntervalMillis, String walDirectoryName, - boolean walSyncBootstrapOnOpen, boolean walAutoRecoverOnOpen, boolean walEnabled) + boolean walSyncBootstrapOnOpen, boolean walAutoRecoverOnOpen, boolean walEnabled, + Boolean memoryMappedTxnStatusFileEnabled) throws IOException, SailException { this.walEnabled = walEnabled; + this.memoryMappedTxnStatusFileEnabled = memoryMappedTxnStatusFileEnabled; NamespaceStore createdNamespaceStore = null; ValueStoreWAL createdWal = null; ValueStore createdValueStore = null; @@ -171,7 +174,7 @@ public NativeSailStore(File dataDir, String tripleIndexes, boolean forceSync, in } createdValueStore = new ValueStore(dataDir, forceSync, valueCacheSize, valueIDCacheSize, namespaceCacheSize, namespaceIDCacheSize, createdWal); - createdTripleStore = new TripleStore(dataDir, tripleIndexes, forceSync); + createdTripleStore = new TripleStore(dataDir, tripleIndexes, forceSync, memoryMappedTxnStatusFileEnabled); // Assign fields required by ContextStore before constructing it namespaceStore = createdNamespaceStore; diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java index 6b3c77d94fa..e5f31939c84 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/NativeStore.java @@ -144,6 +144,8 @@ protected SailStore createSailStore(File dataDir) throws IOException, SailExcept private volatile int namespaceIDCacheSize = ValueStore.NAMESPACE_ID_CACHE_SIZE; + private volatile Boolean memoryMappedTxnStatusFileEnabled; + private SailStore store; // used to decide if store is writable, is true if the store was writable during initialization @@ -276,6 +278,14 @@ public void setNamespaceIDCacheSize(int namespaceIDCacheSize) { this.namespaceIDCacheSize = namespaceIDCacheSize; } + public Boolean getMemoryMappedTxnStatusFileEnabled() { + return memoryMappedTxnStatusFileEnabled; + } + + public void setMemoryMappedTxnStatusFileEnabled(Boolean memoryMappedTxnStatusFileEnabled) { + this.memoryMappedTxnStatusFileEnabled = memoryMappedTxnStatusFileEnabled; + } + @Experimental public void setWalMaxSegmentBytes(long walMaxSegmentBytes) { this.walMaxSegmentBytes = walMaxSegmentBytes; @@ -492,7 +502,8 @@ protected void initializeInternal() throws SailException { walDirectoryName, walSyncBootstrapOnOpen, walAutoRecoverOnOpen, - walEnabled); + walEnabled, + memoryMappedTxnStatusFileEnabled); this.store = new SnapshotSailStore(mainStore, MemoryOverflowIntoNativeStore::new) { @Override diff --git a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java index 88e60a3eaa4..ccb1b4c4943 100644 --- a/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java +++ b/core/sail/nativerdf/src/main/java/org/eclipse/rdf4j/sail/nativerdf/TripleStore.java @@ -80,12 +80,6 @@ class TripleStore implements Closeable { */ private static final String INDEXES_KEY = "triple-indexes"; - /** - * System property that enables the experimental {@link MemoryMappedTxnStatusFile} implementation instead of the - * default {@link TxnStatusFile}. - */ - private static final String MEMORY_MAPPED_TXN_STATUS_FILE_ENABLED_PROP = "org.eclipse.rdf4j.sail.nativerdf.MemoryMappedTxnStatusFile.enabled"; - /** * The version number for the current triple store. *