|
@@ -27,6 +27,8 @@ import org.elasticsearch.core.IOUtils;
|
|
|
import org.elasticsearch.index.IndexModule;
|
|
|
import org.elasticsearch.index.IndexSettings;
|
|
|
import org.elasticsearch.index.shard.ShardPath;
|
|
|
+import org.elasticsearch.logging.LogManager;
|
|
|
+import org.elasticsearch.logging.Logger;
|
|
|
import org.elasticsearch.plugins.IndexStorePlugin;
|
|
|
|
|
|
import java.io.IOException;
|
|
@@ -35,7 +37,24 @@ import java.nio.file.Path;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.Set;
|
|
|
|
|
|
+import static org.apache.lucene.store.MMapDirectory.SHARED_ARENA_MAX_PERMITS_SYSPROP;
|
|
|
+
|
|
|
public class FsDirectoryFactory implements IndexStorePlugin.DirectoryFactory {
|
|
|
+ private static final Logger Log = LogManager.getLogger(FsDirectoryFactory.class);
|
|
|
+
|
|
|
+ private static final int sharedArenaMaxPermits;
|
|
|
+ static {
|
|
|
+ String prop = System.getProperty(SHARED_ARENA_MAX_PERMITS_SYSPROP);
|
|
|
+ int value = 1;
|
|
|
+ if (prop != null) {
|
|
|
+ try {
|
|
|
+ value = Integer.parseInt(prop); // ensure it's a valid integer
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ Log.warn(() -> "unable to parse system property [" + SHARED_ARENA_MAX_PERMITS_SYSPROP + "] with value [" + prop + "]", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sharedArenaMaxPermits = value; // default to 1
|
|
|
+ }
|
|
|
|
|
|
private static final FeatureFlag MADV_RANDOM_FEATURE_FLAG = new FeatureFlag("madv_random");
|
|
|
|
|
@@ -70,6 +89,7 @@ public class FsDirectoryFactory implements IndexStorePlugin.DirectoryFactory {
|
|
|
// Use Lucene defaults
|
|
|
final FSDirectory primaryDirectory = FSDirectory.open(location, lockFactory);
|
|
|
if (primaryDirectory instanceof MMapDirectory mMapDirectory) {
|
|
|
+ mMapDirectory = adjustSharedArenaGrouping(mMapDirectory);
|
|
|
Directory dir = new HybridDirectory(lockFactory, setPreload(mMapDirectory, lockFactory, preLoadExtensions));
|
|
|
if (MADV_RANDOM_FEATURE_FLAG.isEnabled() == false) {
|
|
|
dir = disableRandomAdvice(dir);
|
|
@@ -79,7 +99,8 @@ public class FsDirectoryFactory implements IndexStorePlugin.DirectoryFactory {
|
|
|
return primaryDirectory;
|
|
|
}
|
|
|
case MMAPFS:
|
|
|
- Directory dir = setPreload(new MMapDirectory(location, lockFactory), lockFactory, preLoadExtensions);
|
|
|
+ MMapDirectory mMapDirectory = adjustSharedArenaGrouping(new MMapDirectory(location, lockFactory));
|
|
|
+ Directory dir = setPreload(mMapDirectory, lockFactory, preLoadExtensions);
|
|
|
if (MADV_RANDOM_FEATURE_FLAG.isEnabled() == false) {
|
|
|
dir = disableRandomAdvice(dir);
|
|
|
}
|
|
@@ -105,6 +126,13 @@ public class FsDirectoryFactory implements IndexStorePlugin.DirectoryFactory {
|
|
|
return mMapDirectory;
|
|
|
}
|
|
|
|
|
|
+ public MMapDirectory adjustSharedArenaGrouping(MMapDirectory mMapDirectory) {
|
|
|
+ if (sharedArenaMaxPermits <= 1) {
|
|
|
+ mMapDirectory.setGroupingFunction(MMapDirectory.NO_GROUPING);
|
|
|
+ }
|
|
|
+ return mMapDirectory;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Return a {@link FilterDirectory} around the provided {@link Directory} that forcefully disables {@link IOContext#RANDOM random
|
|
|
* access}.
|