Core: upgrade to current Lucene 5.0.0 snapshot
Elasticsearch no longer unlocks the Lucene index on startup (this was dangerous, and could possibly lead to corruption). Added the new serbian_normalization TokenFilter from Lucene. NoLockFactory is no longer supported (index.store.fs.fs_lock = none), and if you have a typo in your fs_lock you'll now hit a StoreException instead of silently using NoLockFactory. Closes #8588
This commit is contained in:
parent
866571f4d7
commit
dfb6d6081c
|
@ -34,3 +34,7 @@ Scandinavian::
|
||||||
http://lucene.apache.org/core/4_9_0/analyzers-common/org/apache/lucene/analysis/miscellaneous/ScandinavianNormalizationFilter.html[`scandinavian_normalization`],
|
http://lucene.apache.org/core/4_9_0/analyzers-common/org/apache/lucene/analysis/miscellaneous/ScandinavianNormalizationFilter.html[`scandinavian_normalization`],
|
||||||
http://lucene.apache.org/core/4_9_0/analyzers-common/org/apache/lucene/analysis/miscellaneous/ScandinavianFoldingFilter.html[`scandinavian_folding`]
|
http://lucene.apache.org/core/4_9_0/analyzers-common/org/apache/lucene/analysis/miscellaneous/ScandinavianFoldingFilter.html[`scandinavian_folding`]
|
||||||
|
|
||||||
|
Serbian::
|
||||||
|
|
||||||
|
not-released-yet[`serbian_normalization`],
|
||||||
|
|
||||||
|
|
4
pom.xml
4
pom.xml
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<lucene.version>5.0.0</lucene.version>
|
<lucene.version>5.0.0</lucene.version>
|
||||||
<lucene.maven.version>5.0.0-snapshot-1637347</lucene.maven.version>
|
<lucene.maven.version>5.0.0-snapshot-1641343</lucene.maven.version>
|
||||||
<tests.jvms>auto</tests.jvms>
|
<tests.jvms>auto</tests.jvms>
|
||||||
<tests.shuffle>true</tests.shuffle>
|
<tests.shuffle>true</tests.shuffle>
|
||||||
<tests.output>onerror</tests.output>
|
<tests.output>onerror</tests.output>
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
<repository>
|
||||||
<id>Lucene snapshots</id>
|
<id>Lucene snapshots</id>
|
||||||
<url>https://download.elasticsearch.org/lucenesnapshots/1637347</url>
|
<url>https://download.elasticsearch.org/lucenesnapshots/1641343</url>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,8 @@ package org.elasticsearch.env;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.primitives.Ints;
|
import com.google.common.primitives.Ints;
|
||||||
|
import org.apache.lucene.store.Directory;
|
||||||
|
import org.apache.lucene.store.FSDirectory;
|
||||||
import org.apache.lucene.store.Lock;
|
import org.apache.lucene.store.Lock;
|
||||||
import org.apache.lucene.store.LockObtainFailedException;
|
import org.apache.lucene.store.LockObtainFailedException;
|
||||||
import org.apache.lucene.store.NativeFSLockFactory;
|
import org.apache.lucene.store.NativeFSLockFactory;
|
||||||
|
@ -82,10 +84,10 @@ public class NodeEnvironment extends AbstractComponent implements Closeable{
|
||||||
if (Files.exists(dir) == false) {
|
if (Files.exists(dir) == false) {
|
||||||
Files.createDirectories(dir);
|
Files.createDirectories(dir);
|
||||||
}
|
}
|
||||||
logger.trace("obtaining node lock on {} ...", dir.toAbsolutePath());
|
|
||||||
try {
|
try (Directory luceneDir = FSDirectory.open(dir, NativeFSLockFactory.INSTANCE)) {
|
||||||
NativeFSLockFactory lockFactory = new NativeFSLockFactory(dir);
|
logger.trace("obtaining node lock on {} ...", dir.toAbsolutePath());
|
||||||
Lock tmpLock = lockFactory.makeLock("node.lock");
|
Lock tmpLock = luceneDir.makeLock("node.lock");
|
||||||
boolean obtained = tmpLock.obtain();
|
boolean obtained = tmpLock.obtain();
|
||||||
if (obtained) {
|
if (obtained) {
|
||||||
locks[dirIndex] = tmpLock;
|
locks[dirIndex] = tmpLock;
|
||||||
|
|
|
@ -511,6 +511,7 @@ public class AnalysisModule extends AbstractModule {
|
||||||
tokenFiltersBindings.processTokenFilter("persian_normalization", PersianNormalizationFilterFactory.class);
|
tokenFiltersBindings.processTokenFilter("persian_normalization", PersianNormalizationFilterFactory.class);
|
||||||
tokenFiltersBindings.processTokenFilter("scandinavian_normalization", ScandinavianNormalizationFilterFactory.class);
|
tokenFiltersBindings.processTokenFilter("scandinavian_normalization", ScandinavianNormalizationFilterFactory.class);
|
||||||
tokenFiltersBindings.processTokenFilter("scandinavian_folding", ScandinavianFoldingFilterFactory.class);
|
tokenFiltersBindings.processTokenFilter("scandinavian_folding", ScandinavianFoldingFilterFactory.class);
|
||||||
|
tokenFiltersBindings.processTokenFilter("serbian_normalization", SerbianNormalizationFilterFactory.class);
|
||||||
|
|
||||||
tokenFiltersBindings.processTokenFilter("hunspell", HunspellTokenFilterFactory.class);
|
tokenFiltersBindings.processTokenFilter("hunspell", HunspellTokenFilterFactory.class);
|
||||||
tokenFiltersBindings.processTokenFilter("cjk_bigram", CJKBigramFilterFactory.class);
|
tokenFiltersBindings.processTokenFilter("cjk_bigram", CJKBigramFilterFactory.class);
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.index.analysis;
|
||||||
|
|
||||||
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
|
import org.apache.lucene.analysis.sr.SerbianNormalizationFilter;
|
||||||
|
import org.elasticsearch.common.inject.Inject;
|
||||||
|
import org.elasticsearch.common.inject.assistedinject.Assisted;
|
||||||
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.index.Index;
|
||||||
|
import org.elasticsearch.index.settings.IndexSettings;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SerbianNormalizationFilterFactory extends AbstractTokenFilterFactory {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public SerbianNormalizationFilterFactory(Index index, @IndexSettings Settings indexSettings, @Assisted String name, @Assisted Settings settings) {
|
||||||
|
super(index, indexSettings, name, settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TokenStream create(TokenStream tokenStream) {
|
||||||
|
return new SerbianNormalizationFilter(tokenStream);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1434,11 +1434,6 @@ public class InternalEngine extends AbstractIndexShardComponent implements Engin
|
||||||
|
|
||||||
private IndexWriter createWriter() throws IOException {
|
private IndexWriter createWriter() throws IOException {
|
||||||
try {
|
try {
|
||||||
// release locks when started
|
|
||||||
if (IndexWriter.isLocked(store.directory())) {
|
|
||||||
logger.warn("shard is locked, releasing lock");
|
|
||||||
IndexWriter.unlock(store.directory());
|
|
||||||
}
|
|
||||||
boolean create = !Lucene.indexExists(store.directory());
|
boolean create = !Lucene.indexExists(store.directory());
|
||||||
IndexWriterConfig config = new IndexWriterConfig(analysisService.defaultIndexAnalyzer());
|
IndexWriterConfig config = new IndexWriterConfig(analysisService.defaultIndexAnalyzer());
|
||||||
config.setCommitOnClose(false); // we by default don't commit on close
|
config.setCommitOnClose(false); // we by default don't commit on close
|
||||||
|
|
|
@ -264,7 +264,7 @@ public class BinaryFieldMapper extends AbstractFieldMapper<BytesReference> {
|
||||||
|
|
||||||
public static final FieldType TYPE = new FieldType();
|
public static final FieldType TYPE = new FieldType();
|
||||||
static {
|
static {
|
||||||
TYPE.setDocValueType(DocValuesType.BINARY);
|
TYPE.setDocValuesType(DocValuesType.BINARY);
|
||||||
TYPE.freeze();
|
TYPE.freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -404,7 +404,7 @@ public class DoubleFieldMapper extends NumberFieldMapper<Double> {
|
||||||
|
|
||||||
public static final FieldType TYPE = new FieldType();
|
public static final FieldType TYPE = new FieldType();
|
||||||
static {
|
static {
|
||||||
TYPE.setDocValueType(DocValuesType.BINARY);
|
TYPE.setDocValuesType(DocValuesType.BINARY);
|
||||||
TYPE.freeze();
|
TYPE.freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -409,7 +409,7 @@ public class FloatFieldMapper extends NumberFieldMapper<Float> {
|
||||||
|
|
||||||
public static final FieldType TYPE = new FieldType();
|
public static final FieldType TYPE = new FieldType();
|
||||||
static {
|
static {
|
||||||
TYPE.setDocValueType(DocValuesType.BINARY);
|
TYPE.setDocValuesType(DocValuesType.BINARY);
|
||||||
TYPE.freeze();
|
TYPE.freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -433,7 +433,7 @@ public abstract class NumberFieldMapper<T extends Number> extends AbstractFieldM
|
||||||
|
|
||||||
public static final FieldType TYPE = new FieldType();
|
public static final FieldType TYPE = new FieldType();
|
||||||
static {
|
static {
|
||||||
TYPE.setDocValueType(DocValuesType.BINARY);
|
TYPE.setDocValuesType(DocValuesType.BINARY);
|
||||||
TYPE.freeze();
|
TYPE.freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,7 +484,7 @@ public abstract class NumberFieldMapper<T extends Number> extends AbstractFieldM
|
||||||
|
|
||||||
public static final FieldType TYPE = new FieldType();
|
public static final FieldType TYPE = new FieldType();
|
||||||
static {
|
static {
|
||||||
TYPE.setDocValueType(DocValuesType.BINARY);
|
TYPE.setDocValuesType(DocValuesType.BINARY);
|
||||||
TYPE.freeze();
|
TYPE.freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -728,7 +728,7 @@ public class GeoPointFieldMapper extends AbstractFieldMapper<GeoPoint> implement
|
||||||
|
|
||||||
public static final FieldType TYPE = new FieldType();
|
public static final FieldType TYPE = new FieldType();
|
||||||
static {
|
static {
|
||||||
TYPE.setDocValueType(DocValuesType.BINARY);
|
TYPE.setDocValuesType(DocValuesType.BINARY);
|
||||||
TYPE.freeze();
|
TYPE.freeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -151,6 +151,11 @@ public class ConcurrentMergeSchedulerProvider extends MergeSchedulerProvider {
|
||||||
super.afterMerge(merge);
|
super.afterMerge(merge);
|
||||||
provider.afterMerge(merge);
|
provider.afterMerge(merge);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void maybeStall() {
|
||||||
|
// Don't stall here, because we do our own index throttling (in InternalEngine.IndexThrottle) when merges can't keep up
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ApplySettings implements IndexSettingsService.Listener {
|
class ApplySettings implements IndexSettingsService.Listener {
|
||||||
|
|
|
@ -33,7 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||||
* A directory implementation that uses the Elasticsearch {@link Distributor} abstraction to distribute
|
* A directory implementation that uses the Elasticsearch {@link Distributor} abstraction to distribute
|
||||||
* files across multiple data directories.
|
* files across multiple data directories.
|
||||||
*/
|
*/
|
||||||
public final class DistributorDirectory extends BaseDirectory {
|
public final class DistributorDirectory extends Directory {
|
||||||
|
|
||||||
private final Distributor distributor;
|
private final Distributor distributor;
|
||||||
private final HashMap<String, Directory> nameDirMapping = new HashMap<>();
|
private final HashMap<String, Directory> nameDirMapping = new HashMap<>();
|
||||||
|
@ -74,7 +74,6 @@ public final class DistributorDirectory extends BaseDirectory {
|
||||||
nameDirMapping.put(file, dir);
|
nameDirMapping.put(file, dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lockFactory = new DistributorLockFactoryWrapper(distributor.primary());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -132,7 +131,6 @@ public final class DistributorDirectory extends BaseDirectory {
|
||||||
} finally {
|
} finally {
|
||||||
IOUtils.close(distributor.all());
|
IOUtils.close(distributor.all());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,7 +138,7 @@ public final class DistributorDirectory extends BaseDirectory {
|
||||||
*
|
*
|
||||||
* @throws IOException if the name has not yet been associated with any directory ie. fi the file does not exists
|
* @throws IOException if the name has not yet been associated with any directory ie. fi the file does not exists
|
||||||
*/
|
*/
|
||||||
Directory getDirectory(String name) throws IOException { // pkg private for testing
|
synchronized Directory getDirectory(String name) throws IOException { // pkg private for testing
|
||||||
return getDirectory(name, true);
|
return getDirectory(name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +146,7 @@ public final class DistributorDirectory extends BaseDirectory {
|
||||||
* Returns the directory that has previously been associated with this file name or associates the name with a directory
|
* Returns the directory that has previously been associated with this file name or associates the name with a directory
|
||||||
* if failIfNotAssociated is set to false.
|
* if failIfNotAssociated is set to false.
|
||||||
*/
|
*/
|
||||||
private Directory getDirectory(String name, boolean failIfNotAssociated) throws IOException {
|
private synchronized Directory getDirectory(String name, boolean failIfNotAssociated) throws IOException {
|
||||||
final Directory directory = nameDirMapping.get(name);
|
final Directory directory = nameDirMapping.get(name);
|
||||||
if (directory == null) {
|
if (directory == null) {
|
||||||
if (failIfNotAssociated) {
|
if (failIfNotAssociated) {
|
||||||
|
@ -164,17 +162,6 @@ public final class DistributorDirectory extends BaseDirectory {
|
||||||
return directory;
|
return directory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void setLockFactory(LockFactory lockFactory) throws IOException {
|
|
||||||
distributor.primary().setLockFactory(lockFactory);
|
|
||||||
super.setLockFactory(new DistributorLockFactoryWrapper(distributor.primary()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized String getLockID() {
|
|
||||||
return distributor.primary().getLockID();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized String toString() {
|
public synchronized String toString() {
|
||||||
return distributor.toString();
|
return distributor.toString();
|
||||||
|
@ -201,8 +188,8 @@ public final class DistributorDirectory extends BaseDirectory {
|
||||||
.append(System.lineSeparator());
|
.append(System.lineSeparator());
|
||||||
} else if (directory != d) {
|
} else if (directory != d) {
|
||||||
consistent = false;
|
consistent = false;
|
||||||
builder.append("File ").append(file).append(" was mapped to a directory ").append(directory)
|
builder.append("File ").append(file).append(" was mapped to a directory ").append(directory)
|
||||||
.append(" but exists in another distributor directory").append(d)
|
.append(" but exists in another distributor directory ").append(d)
|
||||||
.append(System.lineSeparator());
|
.append(System.lineSeparator());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,86 +199,41 @@ public final class DistributorDirectory extends BaseDirectory {
|
||||||
return consistent; // return boolean so it can be easily be used in asserts
|
return consistent; // return boolean so it can be easily be used in asserts
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* This inner class is a simple wrapper around the original
|
public Lock makeLock(final String lockName) {
|
||||||
* lock factory to track files written / created through the
|
final Directory primary = distributor.primary();
|
||||||
* lock factory. For instance {@link NativeFSLockFactory} creates real
|
final Lock delegateLock = primary.makeLock(lockName);
|
||||||
* files that we should expose for consistency reasons.
|
if (DirectoryUtils.getLeaf(primary, FSDirectory.class) != null) {
|
||||||
*/
|
// Wrap the delegate's lock just so we can monitor when it actually wrote a lock file. We assume that an FSDirectory writes its
|
||||||
private class DistributorLockFactoryWrapper extends LockFactory {
|
// locks as actual files (we don't support NoLockFactory):
|
||||||
private final Directory dir;
|
return new Lock() {
|
||||||
private final LockFactory delegate;
|
@Override
|
||||||
private final boolean writesFiles;
|
public boolean obtain() throws IOException {
|
||||||
|
if (delegateLock.obtain()) {
|
||||||
public DistributorLockFactoryWrapper(Directory dir) {
|
synchronized(DistributorDirectory.this) {
|
||||||
this.dir = dir;
|
assert nameDirMapping.containsKey(lockName) == false || nameDirMapping.get(lockName) == primary;
|
||||||
final FSDirectory leaf = DirectoryUtils.getLeaf(dir, FSDirectory.class);
|
if (nameDirMapping.get(lockName) == null) {
|
||||||
if (leaf != null) {
|
nameDirMapping.put(lockName, primary);
|
||||||
writesFiles = leaf.getLockFactory() instanceof FSLockFactory;
|
|
||||||
} else {
|
|
||||||
writesFiles = false;
|
|
||||||
}
|
|
||||||
this.delegate = dir.getLockFactory();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setLockPrefix(String lockPrefix) {
|
|
||||||
delegate.setLockPrefix(lockPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getLockPrefix() {
|
|
||||||
return delegate.getLockPrefix();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Lock makeLock(String lockName) {
|
|
||||||
return new DistributorLock(delegate.makeLock(lockName), lockName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clearLock(String lockName) throws IOException {
|
|
||||||
delegate.clearLock(lockName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "DistributorLockFactoryWrapper(" + delegate.toString() + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DistributorLock extends Lock {
|
|
||||||
private final Lock delegateLock;
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
DistributorLock(Lock delegate, String name) {
|
|
||||||
this.delegateLock = delegate;
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean obtain() throws IOException {
|
|
||||||
if (delegateLock.obtain()) {
|
|
||||||
if (writesFiles) {
|
|
||||||
synchronized (DistributorDirectory.this) {
|
|
||||||
assert (nameDirMapping.containsKey(name) == false || nameDirMapping.get(name) == dir);
|
|
||||||
if (nameDirMapping.get(name) == null) {
|
|
||||||
nameDirMapping.put(name, dir);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws IOException { delegateLock.close(); }
|
public void close() throws IOException {
|
||||||
|
delegateLock.close();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLocked() throws IOException {
|
public boolean isLocked() throws IOException {
|
||||||
return delegateLock.isLocked();
|
return delegateLock.isLocked();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return delegateLock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,11 @@
|
||||||
|
|
||||||
package org.elasticsearch.index.store.fs;
|
package org.elasticsearch.index.store.fs;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
import org.apache.lucene.store.*;
|
import org.apache.lucene.store.*;
|
||||||
import org.elasticsearch.common.io.FileSystemUtils;
|
import org.elasticsearch.common.io.FileSystemUtils;
|
||||||
import org.elasticsearch.common.metrics.CounterMetric;
|
import org.elasticsearch.common.metrics.CounterMetric;
|
||||||
|
@ -27,11 +32,7 @@ import org.elasticsearch.index.settings.IndexSettings;
|
||||||
import org.elasticsearch.index.shard.ShardId;
|
import org.elasticsearch.index.shard.ShardId;
|
||||||
import org.elasticsearch.index.store.DirectoryService;
|
import org.elasticsearch.index.store.DirectoryService;
|
||||||
import org.elasticsearch.index.store.IndexStore;
|
import org.elasticsearch.index.store.IndexStore;
|
||||||
|
import org.elasticsearch.index.store.StoreException;
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -58,16 +59,17 @@ public abstract class FsDirectoryService extends DirectoryService implements Sto
|
||||||
|
|
||||||
protected final LockFactory buildLockFactory() throws IOException {
|
protected final LockFactory buildLockFactory() throws IOException {
|
||||||
String fsLock = componentSettings.get("lock", componentSettings.get("fs_lock", "native"));
|
String fsLock = componentSettings.get("lock", componentSettings.get("fs_lock", "native"));
|
||||||
LockFactory lockFactory = NoLockFactory.getNoLockFactory();
|
LockFactory lockFactory;
|
||||||
if (fsLock.equals("native")) {
|
if (fsLock.equals("native")) {
|
||||||
lockFactory = new NativeFSLockFactory();
|
lockFactory = NativeFSLockFactory.INSTANCE;
|
||||||
} else if (fsLock.equals("simple")) {
|
} else if (fsLock.equals("simple")) {
|
||||||
lockFactory = new SimpleFSLockFactory();
|
lockFactory = SimpleFSLockFactory.INSTANCE;
|
||||||
} else if (fsLock.equals("none")) {
|
} else {
|
||||||
lockFactory = NoLockFactory.getNoLockFactory();
|
throw new StoreException(shardId, "unrecognized fs_lock \"" + fsLock + "\": must be native or simple");
|
||||||
}
|
}
|
||||||
return lockFactory;
|
return lockFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Directory[] build() throws IOException {
|
public Directory[] build() throws IOException {
|
||||||
|
|
|
@ -632,9 +632,9 @@ public class GeolocationContextMapping extends ContextMapping {
|
||||||
for (int i = 0 ; i < lonFields.length ; i++) {
|
for (int i = 0 ; i < lonFields.length ; i++) {
|
||||||
IndexableField lonField = lonFields[i];
|
IndexableField lonField = lonFields[i];
|
||||||
IndexableField latField = latFields[i];
|
IndexableField latField = latFields[i];
|
||||||
assert lonField.fieldType().docValueType() == latField.fieldType().docValueType();
|
assert lonField.fieldType().docValuesType() == latField.fieldType().docValuesType();
|
||||||
// we write doc values fields differently: one field for all values, so we need to only care about indexed fields
|
// we write doc values fields differently: one field for all values, so we need to only care about indexed fields
|
||||||
if (lonField.fieldType().docValueType() == DocValuesType.NONE) {
|
if (lonField.fieldType().docValuesType() == DocValuesType.NONE) {
|
||||||
spare.reset(latField.numericValue().doubleValue(), lonField.numericValue().doubleValue());
|
spare.reset(latField.numericValue().doubleValue(), lonField.numericValue().doubleValue());
|
||||||
geohashes.add(spare.geohash());
|
geohashes.add(spare.geohash());
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,7 @@ public class AnalysisFactoryTests extends ElasticsearchTestCase {
|
||||||
put("russianlightstem", StemmerTokenFilterFactory.class);
|
put("russianlightstem", StemmerTokenFilterFactory.class);
|
||||||
put("scandinavianfolding", ScandinavianFoldingFilterFactory.class);
|
put("scandinavianfolding", ScandinavianFoldingFilterFactory.class);
|
||||||
put("scandinaviannormalization", ScandinavianNormalizationFilterFactory.class);
|
put("scandinaviannormalization", ScandinavianNormalizationFilterFactory.class);
|
||||||
|
put("serbiannormalization", SerbianNormalizationFilterFactory.class);
|
||||||
put("shingle", ShingleTokenFilterFactory.class);
|
put("shingle", ShingleTokenFilterFactory.class);
|
||||||
put("snowballporter", SnowballTokenFilterFactory.class);
|
put("snowballporter", SnowballTokenFilterFactory.class);
|
||||||
put("soraninormalization", SoraniNormalizationFilterFactory.class);
|
put("soraninormalization", SoraniNormalizationFilterFactory.class);
|
||||||
|
|
|
@ -348,6 +348,9 @@ public class InternalEngineTests extends ElasticsearchTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStartAndAcquireConcurrently() {
|
public void testStartAndAcquireConcurrently() {
|
||||||
|
// Close engine from setUp (we create our own):
|
||||||
|
engine.close();
|
||||||
|
|
||||||
ConcurrentMergeSchedulerProvider mergeSchedulerProvider = new ConcurrentMergeSchedulerProvider(shardId, EMPTY_SETTINGS, threadPool, new IndexSettingsService(shardId.index(), EMPTY_SETTINGS));
|
ConcurrentMergeSchedulerProvider mergeSchedulerProvider = new ConcurrentMergeSchedulerProvider(shardId, EMPTY_SETTINGS, threadPool, new IndexSettingsService(shardId.index(), EMPTY_SETTINGS));
|
||||||
final Engine engine = createEngine(engineSettingsService, store, createTranslog(), mergeSchedulerProvider);
|
final Engine engine = createEngine(engineSettingsService, store, createTranslog(), mergeSchedulerProvider);
|
||||||
final AtomicBoolean startPending = new AtomicBoolean(true);
|
final AtomicBoolean startPending = new AtomicBoolean(true);
|
||||||
|
@ -377,6 +380,9 @@ public class InternalEngineTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSegmentsWithMergeFlag() throws Exception {
|
public void testSegmentsWithMergeFlag() throws Exception {
|
||||||
|
// Close engine from setUp (we create our own):
|
||||||
|
engine.close();
|
||||||
|
|
||||||
ConcurrentMergeSchedulerProvider mergeSchedulerProvider = new ConcurrentMergeSchedulerProvider(shardId, EMPTY_SETTINGS, threadPool, new IndexSettingsService(shardId.index(), EMPTY_SETTINGS));
|
ConcurrentMergeSchedulerProvider mergeSchedulerProvider = new ConcurrentMergeSchedulerProvider(shardId, EMPTY_SETTINGS, threadPool, new IndexSettingsService(shardId.index(), EMPTY_SETTINGS));
|
||||||
final AtomicReference<CountDownLatch> waitTillMerge = new AtomicReference<>();
|
final AtomicReference<CountDownLatch> waitTillMerge = new AtomicReference<>();
|
||||||
final AtomicReference<CountDownLatch> waitForMerge = new AtomicReference<>();
|
final AtomicReference<CountDownLatch> waitForMerge = new AtomicReference<>();
|
||||||
|
@ -1307,6 +1313,9 @@ public class InternalEngineTests extends ElasticsearchTestCase {
|
||||||
@Test
|
@Test
|
||||||
public void testEnableGcDeletes() throws Exception {
|
public void testEnableGcDeletes() throws Exception {
|
||||||
|
|
||||||
|
// Close engine from setUp (we create our own):
|
||||||
|
engine.close();
|
||||||
|
|
||||||
// Make sure enableGCDeletes == false works:
|
// Make sure enableGCDeletes == false works:
|
||||||
Settings settings = ImmutableSettings.builder()
|
Settings settings = ImmutableSettings.builder()
|
||||||
.put(InternalEngine.INDEX_GC_DELETES, "0ms")
|
.put(InternalEngine.INDEX_GC_DELETES, "0ms")
|
||||||
|
|
|
@ -107,7 +107,7 @@ public class SimpleStringMappingTests extends ElasticsearchSingleNodeTest {
|
||||||
assertEquals(ft1.omitNorms(), ft2.omitNorms());
|
assertEquals(ft1.omitNorms(), ft2.omitNorms());
|
||||||
assertEquals(ft1.indexOptions(), ft2.indexOptions());
|
assertEquals(ft1.indexOptions(), ft2.indexOptions());
|
||||||
assertEquals(ft1.storeTermVectors(), ft2.storeTermVectors());
|
assertEquals(ft1.storeTermVectors(), ft2.storeTermVectors());
|
||||||
assertEquals(ft1.docValueType(), ft2.docValueType());
|
assertEquals(ft1.docValuesType(), ft2.docValuesType());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertParseIdemPotent(IndexableFieldType expected, DocumentMapper mapper) throws Exception {
|
private void assertParseIdemPotent(IndexableFieldType expected, DocumentMapper mapper) throws Exception {
|
||||||
|
@ -327,8 +327,8 @@ public class SimpleStringMappingTests extends ElasticsearchSingleNodeTest {
|
||||||
|
|
||||||
public static DocValuesType docValuesType(Document document, String fieldName) {
|
public static DocValuesType docValuesType(Document document, String fieldName) {
|
||||||
for (IndexableField field : document.getFields(fieldName)) {
|
for (IndexableField field : document.getFields(fieldName)) {
|
||||||
if (field.fieldType().docValueType() != DocValuesType.NONE) {
|
if (field.fieldType().docValuesType() != DocValuesType.NONE) {
|
||||||
return field.fieldType().docValueType();
|
return field.fieldType().docValuesType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return DocValuesType.NONE;
|
return DocValuesType.NONE;
|
||||||
|
|
|
@ -164,7 +164,7 @@ public class DistributorTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
|
|
||||||
public FakeFsDirectory(String path, long usableSpace) throws IOException {
|
public FakeFsDirectory(String path, long usableSpace) throws IOException {
|
||||||
super(Paths.get(path), NoLockFactory.getNoLockFactory());
|
super(Paths.get(path), NoLockFactory.INSTANCE);
|
||||||
allocationCount = 0;
|
allocationCount = 0;
|
||||||
this.useableSpace = usableSpace;
|
this.useableSpace = usableSpace;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue