convert index.store.fs.fs_lock
This commit is contained in:
parent
13e5547537
commit
a61723b538
|
@ -52,6 +52,7 @@ import org.elasticsearch.index.fielddata.IndexFieldDataService;
|
|||
import org.elasticsearch.index.mapper.FieldMapper;
|
||||
import org.elasticsearch.index.mapper.MapperService;
|
||||
import org.elasticsearch.index.percolator.PercolatorQueriesRegistry;
|
||||
import org.elasticsearch.index.store.FsDirectoryService;
|
||||
import org.elasticsearch.index.store.IndexStore;
|
||||
import org.elasticsearch.index.store.IndexStoreConfig;
|
||||
import org.elasticsearch.index.store.Store;
|
||||
|
@ -151,6 +152,7 @@ public final class IndexScopeSettings extends AbstractScopedSettings {
|
|||
IndexModule.INDEX_QUERY_CACHE_TYPE_SETTING,
|
||||
IndexModule.INDEX_QUERY_CACHE_EVERYTHING_SETTING,
|
||||
PrimaryShardAllocator.INDEX_RECOVERY_INITIAL_SHARDS_SETTING,
|
||||
FsDirectoryService.INDEX_LOCK_FACTOR_SETTING,
|
||||
// this sucks but we can't really validate all the analyzers/similarity in here
|
||||
Setting.groupSetting("index.similarity.", false, Setting.Scope.INDEX), // this allows similarity settings to be passed
|
||||
Setting.groupSetting("index.analysis.", false, Setting.Scope.INDEX) // this allows analysis settings to be passed
|
||||
|
|
|
@ -342,7 +342,7 @@ public class NodeEnvironment extends AbstractComponent implements Closeable {
|
|||
// resolve the directory the shard actually lives in
|
||||
Path p = shardPaths[i].resolve("index");
|
||||
// open a directory (will be immediately closed) on the shard's location
|
||||
dirs[i] = new SimpleFSDirectory(p, FsDirectoryService.buildLockFactory(indexSettings));
|
||||
dirs[i] = new SimpleFSDirectory(p, indexSettings.getValue(FsDirectoryService.INDEX_LOCK_FACTOR_SETTING));
|
||||
// create a lock for the "write.lock" file
|
||||
try {
|
||||
locks[i] = dirs[i].obtainLock(IndexWriter.WRITE_LOCK_NAME);
|
||||
|
|
|
@ -33,6 +33,7 @@ import org.apache.lucene.store.StoreRateLimiting;
|
|||
import org.apache.lucene.util.Constants;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.metrics.CounterMetric;
|
||||
import org.elasticsearch.common.settings.Setting;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.util.set.Sets;
|
||||
import org.elasticsearch.index.IndexModule;
|
||||
|
@ -50,7 +51,16 @@ import java.util.Set;
|
|||
public class FsDirectoryService extends DirectoryService implements StoreRateLimiting.Listener, StoreRateLimiting.Provider {
|
||||
|
||||
protected final IndexStore indexStore;
|
||||
|
||||
public static final Setting<LockFactory> INDEX_LOCK_FACTOR_SETTING = new Setting<>("index.store.fs.fs_lock", "native", (s) -> {
|
||||
switch (s) {
|
||||
case "native":
|
||||
return NativeFSLockFactory.INSTANCE;
|
||||
case "simple":
|
||||
return SimpleFSLockFactory.INSTANCE;
|
||||
default:
|
||||
throw new IllegalArgumentException("unrecognized [index.store.fs.fs_lock] \"" + s + "\": must be native or simple");
|
||||
}
|
||||
}, false, Setting.Scope.INDEX);
|
||||
private final CounterMetric rateLimitingTimeInNanos = new CounterMetric();
|
||||
private final ShardPath path;
|
||||
|
||||
|
@ -71,29 +81,11 @@ public class FsDirectoryService extends DirectoryService implements StoreRateLim
|
|||
return indexStore.rateLimiting();
|
||||
}
|
||||
|
||||
public static LockFactory buildLockFactory(IndexSettings indexSettings) {
|
||||
final Settings settings = indexSettings.getSettings();
|
||||
String fsLock = settings.get("index.store.fs.lock", settings.get("index.store.fs.fs_lock", "native"));
|
||||
LockFactory lockFactory;
|
||||
if (fsLock.equals("native")) {
|
||||
lockFactory = NativeFSLockFactory.INSTANCE;
|
||||
} else if (fsLock.equals("simple")) {
|
||||
lockFactory = SimpleFSLockFactory.INSTANCE;
|
||||
} else {
|
||||
throw new IllegalArgumentException("unrecognized fs_lock \"" + fsLock + "\": must be native or simple");
|
||||
}
|
||||
return lockFactory;
|
||||
}
|
||||
|
||||
protected final LockFactory buildLockFactory() throws IOException {
|
||||
return buildLockFactory(indexSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Directory newDirectory() throws IOException {
|
||||
final Path location = path.resolveIndex();
|
||||
Files.createDirectories(location);
|
||||
Directory wrapped = newFSDirectory(location, buildLockFactory());
|
||||
Directory wrapped = newFSDirectory(location, indexSettings.getValue(INDEX_LOCK_FACTOR_SETTING));
|
||||
return new RateLimitedFSDirectory(wrapped, this, this) ;
|
||||
}
|
||||
|
||||
|
|
|
@ -51,12 +51,14 @@ import org.elasticsearch.index.engine.Segment;
|
|||
import org.elasticsearch.index.mapper.string.StringFieldMapperPositionIncrementGapTests;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
import org.elasticsearch.index.MergePolicyConfig;
|
||||
import org.elasticsearch.plugins.Plugin;
|
||||
import org.elasticsearch.search.SearchHit;
|
||||
import org.elasticsearch.search.aggregations.AggregationBuilders;
|
||||
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
|
||||
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
||||
import org.elasticsearch.search.sort.SortOrder;
|
||||
import org.elasticsearch.test.ESIntegTestCase;
|
||||
import org.elasticsearch.test.InternalSettingsPlugin;
|
||||
import org.elasticsearch.test.InternalTestCluster;
|
||||
import org.elasticsearch.test.VersionUtils;
|
||||
import org.elasticsearch.test.hamcrest.ElasticsearchAssertions;
|
||||
|
@ -73,6 +75,7 @@ import java.nio.file.Path;
|
|||
import java.nio.file.SimpleFileVisitor;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
@ -91,6 +94,12 @@ public class OldIndexBackwardsCompatibilityIT extends ESIntegTestCase {
|
|||
// TODO: test for proper exception on unsupported indexes (maybe via separate test?)
|
||||
// We have a 0.20.6.zip etc for this.
|
||||
|
||||
|
||||
@Override
|
||||
protected Collection<Class<? extends Plugin>> nodePlugins() {
|
||||
return pluginList(InternalSettingsPlugin.class);
|
||||
}
|
||||
|
||||
List<String> indexes;
|
||||
List<String> unsupportedIndexes;
|
||||
static Path singleDataPath;
|
||||
|
|
|
@ -52,6 +52,7 @@ import org.elasticsearch.test.ESIntegTestCase.Scope;
|
|||
import org.elasticsearch.test.InternalTestCluster;
|
||||
import org.elasticsearch.test.junit.annotations.TestLogging;
|
||||
import org.elasticsearch.test.store.MockFSDirectoryService;
|
||||
import org.elasticsearch.test.store.MockFSIndexStore;
|
||||
import org.elasticsearch.test.transport.MockTransportService;
|
||||
import org.elasticsearch.transport.ConnectTransportException;
|
||||
import org.elasticsearch.transport.Transport;
|
||||
|
@ -97,7 +98,7 @@ public class IndexRecoveryIT extends ESIntegTestCase {
|
|||
|
||||
@Override
|
||||
protected Collection<Class<? extends Plugin>> nodePlugins() {
|
||||
return pluginList(MockTransportService.TestPlugin.class);
|
||||
return pluginList(MockTransportService.TestPlugin.class, MockFSIndexStore.TestPlugin.class);
|
||||
}
|
||||
|
||||
private void assertRecoveryStateWithoutStage(RecoveryState state, int shardId, Type type,
|
||||
|
|
|
@ -40,6 +40,6 @@ public class SmbMmapFsDirectoryService extends FsDirectoryService {
|
|||
@Override
|
||||
protected Directory newFSDirectory(Path location, LockFactory lockFactory) throws IOException {
|
||||
logger.debug("wrapping MMapDirectory for SMB");
|
||||
return new SmbDirectoryWrapper(new MMapDirectory(location, buildLockFactory(indexSettings)));
|
||||
return new SmbDirectoryWrapper(new MMapDirectory(location, indexSettings.getValue(INDEX_LOCK_FACTOR_SETTING)));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue