From 7ef43a22ff49d7507b9110daeef18354ba5fca62 Mon Sep 17 00:00:00 2001 From: Michael McCandless Date: Mon, 21 Dec 2015 19:18:19 -0500 Subject: [PATCH 01/59] limit the max size of bulk and index thread pools to bounded number of processors --- .../elasticsearch/threadpool/ThreadPool.java | 18 +++++++- .../UpdateThreadPoolSettingsTests.java | 46 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java index 5d0c814a285..7e1ace21d1a 100644 --- a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java +++ b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java @@ -458,7 +458,7 @@ public class ThreadPool extends AbstractComponent { if (ThreadPoolType.FIXED == previousInfo.getThreadPoolType()) { SizeValue updatedQueueSize = getAsSizeOrUnbounded(settings, "capacity", getAsSizeOrUnbounded(settings, "queue", getAsSizeOrUnbounded(settings, "queue_size", previousInfo.getQueueSize()))); if (Objects.equals(previousInfo.getQueueSize(), updatedQueueSize)) { - int updatedSize = settings.getAsInt("size", previousInfo.getMax()); + int updatedSize = applyHardSizeLimit(name, settings.getAsInt("size", previousInfo.getMax())); if (previousInfo.getMax() != updatedSize) { logger.debug("updating thread_pool [{}], type [{}], size [{}], queue_size [{}]", name, type, updatedSize, updatedQueueSize); // if you think this code is crazy: that's because it is! @@ -480,7 +480,7 @@ public class ThreadPool extends AbstractComponent { defaultQueueSize = previousInfo.getQueueSize(); } - int size = settings.getAsInt("size", defaultSize); + int size = applyHardSizeLimit(name, settings.getAsInt("size", defaultSize)); SizeValue queueSize = getAsSizeOrUnbounded(settings, "capacity", getAsSizeOrUnbounded(settings, "queue", getAsSizeOrUnbounded(settings, "queue_size", defaultQueueSize))); logger.debug("creating thread_pool [{}], type [{}], size [{}], queue_size [{}]", name, type, size, queueSize); Executor executor = EsExecutors.newFixed(name, size, queueSize == null ? -1 : (int) queueSize.singles(), threadFactory); @@ -533,6 +533,20 @@ public class ThreadPool extends AbstractComponent { throw new IllegalArgumentException("No type found [" + type + "], for [" + name + "]"); } + private int applyHardSizeLimit(String name, int requestedSize) { + int availableProcessors = EsExecutors.boundedNumberOfProcessors(settings); + if (name.equals(Names.BULK) || name.equals(Names.INDEX)) { + // We use a hard max size for the indexing pools, because if too many threads enter Lucene's IndexWriter, it means + // too many segments written, too frequently, too much merging, etc: + + // TODO: I would love to be loud here (throw an exception if you ask for a too-big size), but I think this is dangerous + // because on upgrade this setting could be in cluster state and hard for the user to correct? + return Math.min(requestedSize, availableProcessors); + } else { + return requestedSize; + } + } + private void updateSettings(Settings settings) { Map groupSettings = settings.getAsGroups(); if (groupSettings.isEmpty()) { diff --git a/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java b/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java index e1b1c4451c9..a9f22da864a 100644 --- a/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java +++ b/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java @@ -21,6 +21,7 @@ package org.elasticsearch.threadpool; import org.elasticsearch.common.settings.ClusterSettings; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.threadpool.ThreadPool.Names; @@ -89,6 +90,51 @@ public class UpdateThreadPoolSettingsTests extends ESTestCase { } } + public void testIndexingThreadPoolsMaxSize() throws InterruptedException { + String threadPoolName = randomThreadPoolName(); + for (String name : new String[] {ThreadPool.Names.BULK, ThreadPool.Names.INDEX}) { + ThreadPool threadPool = null; + try { + + int maxSize = EsExecutors.boundedNumberOfProcessors(Settings.EMPTY); + + // try to create a too-big (maxSize+1) thread pool + threadPool = new ThreadPool(settingsBuilder() + .put("name", "testIndexingThreadPoolsMaxSize") + .put("threadpool." + name + ".size", maxSize+1) + .build()); + + // confirm it clipped us at the maxSize: + assertEquals(maxSize, ((ThreadPoolExecutor) threadPool.executor(name)).getMaximumPoolSize()); + + ClusterSettings clusterSettings = new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS); + threadPool.setClusterSettings(clusterSettings); + + // update it to a tiny size: + clusterSettings.applySettings( + settingsBuilder() + .put("threadpool." + name + ".size", 1) + .build() + ); + + // confirm it worked: + assertEquals(1, ((ThreadPoolExecutor) threadPool.executor(name)).getMaximumPoolSize()); + + // try to update to too-big size: + clusterSettings.applySettings( + settingsBuilder() + .put("threadpool." + name + ".size", maxSize+1) + .build() + ); + + // confirm it clipped us at the maxSize: + assertEquals(maxSize, ((ThreadPoolExecutor) threadPool.executor(name)).getMaximumPoolSize()); + } finally { + terminateThreadPoolIfNeeded(threadPool); + } + } + } + public void testUpdateSettingsCanNotChangeThreadPoolType() throws InterruptedException { String threadPoolName = randomThreadPoolName(); ThreadPool.ThreadPoolType invalidThreadPoolType = randomIncorrectThreadPoolType(threadPoolName); From c47340f2f1a9eae52279e0c70885ebe2675fcd03 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Sun, 3 Jan 2016 12:39:25 -0500 Subject: [PATCH 02/59] Refactor master node change predicate for reuse This commit migrates a ClusterStateObserver.ChangePredicate for detecting a master node change into a separate class for reuse elsewhere. --- .../master/TransportMasterNodeAction.java | 22 ++-------- .../cluster/MasterNodeChangePredicate.java | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 core/src/main/java/org/elasticsearch/cluster/MasterNodeChangePredicate.java diff --git a/core/src/main/java/org/elasticsearch/action/support/master/TransportMasterNodeAction.java b/core/src/main/java/org/elasticsearch/action/support/master/TransportMasterNodeAction.java index a06b11d9d58..f3fe2d30bb6 100644 --- a/core/src/main/java/org/elasticsearch/action/support/master/TransportMasterNodeAction.java +++ b/core/src/main/java/org/elasticsearch/action/support/master/TransportMasterNodeAction.java @@ -26,10 +26,10 @@ import org.elasticsearch.action.ActionRunnable; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.HandledTransportAction; import org.elasticsearch.action.support.ThreadedActionListener; -import org.elasticsearch.cluster.ClusterChangedEvent; import org.elasticsearch.cluster.ClusterService; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterStateObserver; +import org.elasticsearch.cluster.MasterNodeChangePredicate; import org.elasticsearch.cluster.NotMasterException; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; @@ -50,20 +50,6 @@ import java.util.function.Supplier; * A base class for operations that needs to be performed on the master node. */ public abstract class TransportMasterNodeAction extends HandledTransportAction { - private static final ClusterStateObserver.ChangePredicate masterNodeChangedPredicate = new ClusterStateObserver.ChangePredicate() { - @Override - public boolean apply(ClusterState previousState, ClusterState.ClusterStateStatus previousStatus, - ClusterState newState, ClusterState.ClusterStateStatus newStatus) { - // The condition !newState.nodes().masterNodeId().equals(previousState.nodes().masterNodeId()) is not sufficient as the same master node might get reelected after a disruption. - return newState.nodes().masterNodeId() != null && newState != previousState; - } - - @Override - public boolean apply(ClusterChangedEvent event) { - return event.nodesDelta().masterNodeChanged(); - } - }; - protected final TransportService transportService; protected final ClusterService clusterService; @@ -148,7 +134,7 @@ public abstract class TransportMasterNodeAction(listener) { @Override @@ -179,7 +165,7 @@ public abstract class TransportMasterNodeAction Date: Mon, 4 Jan 2016 17:07:43 +0000 Subject: [PATCH 03/59] Use egrep instead of grep -E for Solaris Closes #15628 --- distribution/src/main/resources/bin/elasticsearch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distribution/src/main/resources/bin/elasticsearch b/distribution/src/main/resources/bin/elasticsearch index 459169bc3c4..9e4af4ccbb2 100755 --- a/distribution/src/main/resources/bin/elasticsearch +++ b/distribution/src/main/resources/bin/elasticsearch @@ -132,7 +132,7 @@ HOSTNAME=`hostname | cut -d. -f1` export HOSTNAME # manual parsing to find out, if process should be detached -daemonized=`echo $* | grep -E -- '(^-d |-d$| -d |--daemonize$|--daemonize )'` +daemonized=`echo $* | egrep -- '(^-d |-d$| -d |--daemonize$|--daemonize )'` if [ -z "$daemonized" ] ; then exec "$JAVA" $JAVA_OPTS $ES_JAVA_OPTS -Des.path.home="$ES_HOME" -cp "$ES_CLASSPATH" \ org.elasticsearch.bootstrap.Elasticsearch start "$@" From 8e7719d1364e3ca2df5bac95a9e1887f827b83ff Mon Sep 17 00:00:00 2001 From: Michael McCandless Date: Tue, 5 Jan 2016 10:59:40 -0500 Subject: [PATCH 04/59] add logger.warn if thread pool size is clipped; fix test failure --- .../elasticsearch/threadpool/ThreadPool.java | 13 ++++--- .../UpdateThreadPoolSettingsTests.java | 37 +++++++++++++------ 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java index 7e1ace21d1a..9b8b9331b9e 100644 --- a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java +++ b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java @@ -533,18 +533,19 @@ public class ThreadPool extends AbstractComponent { throw new IllegalArgumentException("No type found [" + type + "], for [" + name + "]"); } - private int applyHardSizeLimit(String name, int requestedSize) { + private int applyHardSizeLimit(String name, int size) { int availableProcessors = EsExecutors.boundedNumberOfProcessors(settings); - if (name.equals(Names.BULK) || name.equals(Names.INDEX)) { + if ((name.equals(Names.BULK) || name.equals(Names.INDEX)) && size > availableProcessors) { // We use a hard max size for the indexing pools, because if too many threads enter Lucene's IndexWriter, it means // too many segments written, too frequently, too much merging, etc: - // TODO: I would love to be loud here (throw an exception if you ask for a too-big size), but I think this is dangerous // because on upgrade this setting could be in cluster state and hard for the user to correct? - return Math.min(requestedSize, availableProcessors); - } else { - return requestedSize; + logger.warn("requested thread pool size [{}] for [{}] is too large; setting to maximum [{}] instead", + size, name, availableProcessors); + size = availableProcessors; } + + return size; } private void updateSettings(Settings settings) { diff --git a/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java b/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java index a9f22da864a..09653c12e07 100644 --- a/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java +++ b/core/src/test/java/org/elasticsearch/threadpool/UpdateThreadPoolSettingsTests.java @@ -211,6 +211,14 @@ public class UpdateThreadPoolSettingsTests extends ESTestCase { } } + private static int getExpectedThreadPoolSize(Settings settings, String name, int size) { + if (name.equals(ThreadPool.Names.BULK) || name.equals(ThreadPool.Names.INDEX)) { + return Math.min(size, EsExecutors.boundedNumberOfProcessors(settings)); + } else { + return size; + } + } + public void testFixedExecutorType() throws InterruptedException { String threadPoolName = randomThreadPool(ThreadPool.ThreadPoolType.FIXED); ThreadPool threadPool = null; @@ -225,12 +233,14 @@ public class UpdateThreadPoolSettingsTests extends ESTestCase { Settings settings = clusterSettings.applySettings(settingsBuilder() .put("threadpool." + threadPoolName + ".size", "15") .build()); + + int expectedSize = getExpectedThreadPoolSize(nodeSettings, threadPoolName, 15); assertEquals(info(threadPool, threadPoolName).getThreadPoolType(), ThreadPool.ThreadPoolType.FIXED); assertThat(threadPool.executor(threadPoolName), instanceOf(EsThreadPoolExecutor.class)); - assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getCorePoolSize(), equalTo(15)); - assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getMaximumPoolSize(), equalTo(15)); - assertThat(info(threadPool, threadPoolName).getMin(), equalTo(15)); - assertThat(info(threadPool, threadPoolName).getMax(), equalTo(15)); + assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getCorePoolSize(), equalTo(expectedSize)); + assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getMaximumPoolSize(), equalTo(expectedSize)); + assertThat(info(threadPool, threadPoolName).getMin(), equalTo(expectedSize)); + assertThat(info(threadPool, threadPoolName).getMax(), equalTo(expectedSize)); // keep alive does not apply to fixed thread pools assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getKeepAliveTime(TimeUnit.MINUTES), equalTo(0L)); @@ -240,20 +250,23 @@ public class UpdateThreadPoolSettingsTests extends ESTestCase { // Make sure keep alive value is not used assertThat(info(threadPool, threadPoolName).getKeepAlive(), nullValue()); // Make sure keep pool size value were reused - assertThat(info(threadPool, threadPoolName).getMin(), equalTo(15)); - assertThat(info(threadPool, threadPoolName).getMax(), equalTo(15)); + assertThat(info(threadPool, threadPoolName).getMin(), equalTo(expectedSize)); + assertThat(info(threadPool, threadPoolName).getMax(), equalTo(expectedSize)); assertThat(threadPool.executor(threadPoolName), instanceOf(EsThreadPoolExecutor.class)); - assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getCorePoolSize(), equalTo(15)); - assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getMaximumPoolSize(), equalTo(15)); + assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getCorePoolSize(), equalTo(expectedSize)); + assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getMaximumPoolSize(), equalTo(expectedSize)); // Change size Executor oldExecutor = threadPool.executor(threadPoolName); settings = clusterSettings.applySettings(settingsBuilder().put(settings).put("threadpool." + threadPoolName + ".size", "10").build()); + + expectedSize = getExpectedThreadPoolSize(nodeSettings, threadPoolName, 10); + // Make sure size values changed - assertThat(info(threadPool, threadPoolName).getMax(), equalTo(10)); - assertThat(info(threadPool, threadPoolName).getMin(), equalTo(10)); - assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getMaximumPoolSize(), equalTo(10)); - assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getCorePoolSize(), equalTo(10)); + assertThat(info(threadPool, threadPoolName).getMax(), equalTo(expectedSize)); + assertThat(info(threadPool, threadPoolName).getMin(), equalTo(expectedSize)); + assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getMaximumPoolSize(), equalTo(expectedSize)); + assertThat(((EsThreadPoolExecutor) threadPool.executor(threadPoolName)).getCorePoolSize(), equalTo(expectedSize)); // Make sure executor didn't change assertEquals(info(threadPool, threadPoolName).getThreadPoolType(), ThreadPool.ThreadPoolType.FIXED); assertThat(threadPool.executor(threadPoolName), sameInstance(oldExecutor)); From 56329d0f53e944cee1dcb6085fe6e0b9d69935c5 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Wed, 6 Jan 2016 10:59:33 +0100 Subject: [PATCH 05/59] Never call a listerner under lock in InternalEngine We has a postIndex|DeleteUnderLock listener callback to load percolator queries which is entirely private to the index shard in the meanwhile. Yet, it still calls an external callback while holding an indexing lock which is scary since we have no control over how long the operation could possibly take. This commit decouples the percolator registry entirely from the ShardIndexingService by pessimistically fetching percolator documents from the the engine using realtime get. Even in situations where the same document is changed concurrently we will eventually end up in the correct state without loosing an update. This also moves the index throtteling stats directly into the engine to entirely remove the need for the dependency between InternalEngine and ShardIndexingService. --- .../elasticsearch/index/engine/Engine.java | 52 +++++++++++++- .../index/engine/EngineConfig.java | 16 +---- .../index/engine/InternalEngine.java | 12 ++-- .../indexing/IndexingOperationListener.java | 19 ----- .../index/indexing/ShardIndexingService.java | 65 ++--------------- .../percolator/PercolatorQueriesRegistry.java | 69 ++++++------------- .../elasticsearch/index/shard/IndexShard.java | 35 +++++++--- .../index/engine/InternalEngineTests.java | 6 +- .../index/engine/ShadowEngineTests.java | 3 +- 9 files changed, 110 insertions(+), 167 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/engine/Engine.java b/core/src/main/java/org/elasticsearch/index/engine/Engine.java index 4dccd3c6f5e..c013a134e03 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/Engine.java +++ b/core/src/main/java/org/elasticsearch/index/engine/Engine.java @@ -50,6 +50,8 @@ import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.lucene.uid.Versions; +import org.elasticsearch.common.metrics.CounterMetric; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.concurrent.ReleasableLock; import org.elasticsearch.index.VersionType; import org.elasticsearch.index.mapper.ParseContext.Document; @@ -176,10 +178,10 @@ public abstract class Engine implements Closeable { * is enabled */ protected static final class IndexThrottle { - + private final CounterMetric throttleTimeMillisMetric = new CounterMetric(); + private volatile long startOfThrottleNS; private static final ReleasableLock NOOP_LOCK = new ReleasableLock(new NoOpLock()); private final ReleasableLock lockReference = new ReleasableLock(new ReentrantLock()); - private volatile ReleasableLock lock = NOOP_LOCK; public Releasable acquireThrottle() { @@ -189,6 +191,7 @@ public abstract class Engine implements Closeable { /** Activate throttling, which switches the lock to be a real lock */ public void activate() { assert lock == NOOP_LOCK : "throttling activated while already active"; + startOfThrottleNS = System.nanoTime(); lock = lockReference; } @@ -196,7 +199,45 @@ public abstract class Engine implements Closeable { public void deactivate() { assert lock != NOOP_LOCK : "throttling deactivated but not active"; lock = NOOP_LOCK; + + assert startOfThrottleNS > 0 : "Bad state of startOfThrottleNS"; + long throttleTimeNS = System.nanoTime() - startOfThrottleNS; + if (throttleTimeNS >= 0) { + // Paranoia (System.nanoTime() is supposed to be monotonic): time slip may have occurred but never want to add a negative number + throttleTimeMillisMetric.inc(TimeValue.nsecToMSec(throttleTimeNS)); + } } + + long getThrottleTimeInMillis() { + long currentThrottleNS = 0; + if (isThrottled() && startOfThrottleNS != 0) { + currentThrottleNS += System.nanoTime() - startOfThrottleNS; + if (currentThrottleNS < 0) { + // Paranoia (System.nanoTime() is supposed to be monotonic): time slip must have happened, have to ignore this value + currentThrottleNS = 0; + } + } + return throttleTimeMillisMetric.count() + TimeValue.nsecToMSec(currentThrottleNS); + } + + boolean isThrottled() { + return lock != NOOP_LOCK; + } + } + + /** + * Returns the number of milliseconds this engine was under index throttling. + */ + public long getIndexThrottleTimeInMillis() { + return 0; + } + + /** + * Returns the true iff this engine is currently under index throttling. + * @see #getIndexThrottleTimeInMillis() + */ + public boolean isThrottled() { + return false; } /** A Lock implementation that always allows the lock to be acquired */ @@ -916,7 +957,7 @@ public abstract class Engine implements Closeable { } } - public static class GetResult { + public static class GetResult implements Releasable { private final boolean exists; private final long version; private final Translog.Source source; @@ -962,6 +1003,11 @@ public abstract class Engine implements Closeable { return docIdAndVersion; } + @Override + public void close() { + release(); + } + public void release() { if (searcher != null) { searcher.close(); diff --git a/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java b/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java index b44265f37ad..35f1e066d3a 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java +++ b/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java @@ -58,7 +58,6 @@ public final class EngineConfig { private final TimeValue flushMergesAfter; private final String codecName; private final ThreadPool threadPool; - private final ShardIndexingService indexingService; private final Engine.Warmer warmer; private final Store store; private final SnapshotDeletionPolicy deletionPolicy; @@ -107,7 +106,7 @@ public final class EngineConfig { /** * Creates a new {@link org.elasticsearch.index.engine.EngineConfig} */ - public EngineConfig(ShardId shardId, ThreadPool threadPool, ShardIndexingService indexingService, + public EngineConfig(ShardId shardId, ThreadPool threadPool, IndexSettings indexSettings, Engine.Warmer warmer, Store store, SnapshotDeletionPolicy deletionPolicy, MergePolicy mergePolicy, MergeSchedulerConfig mergeSchedulerConfig, Analyzer analyzer, Similarity similarity, CodecService codecService, Engine.EventListener eventListener, @@ -116,7 +115,6 @@ public final class EngineConfig { final Settings settings = indexSettings.getSettings(); this.indexSettings = indexSettings; this.threadPool = threadPool; - this.indexingService = indexingService; this.warmer = warmer == null ? (a,b) -> {} : warmer; this.store = store; this.deletionPolicy = deletionPolicy; @@ -239,18 +237,6 @@ public final class EngineConfig { return threadPool; } - /** - * Returns a {@link org.elasticsearch.index.indexing.ShardIndexingService} used inside the engine to inform about - * pre and post index. The operations are used for statistic purposes etc. - * - * @see org.elasticsearch.index.indexing.ShardIndexingService#postIndex(Engine.Index) - * @see org.elasticsearch.index.indexing.ShardIndexingService#preIndex(Engine.Index) - * - */ - public ShardIndexingService getIndexingService() { - return indexingService; - } - /** * Returns an {@link org.elasticsearch.index.engine.Engine.Warmer} used to warm new searchers before they are used for searching. */ diff --git a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java index be2b73ea6c7..1fcbbee5414 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java +++ b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java @@ -55,6 +55,7 @@ import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader; import org.elasticsearch.common.lucene.index.ElasticsearchLeafReader; import org.elasticsearch.common.lucene.uid.Versions; import org.elasticsearch.common.math.MathUtils; +import org.elasticsearch.common.metrics.CounterMetric; import org.elasticsearch.common.util.concurrent.AbstractRunnable; import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException; import org.elasticsearch.common.util.concurrent.ReleasableLock; @@ -95,7 +96,6 @@ public class InternalEngine extends Engine { */ private volatile long lastDeleteVersionPruneTimeMSec; - private final ShardIndexingService indexingService; private final Engine.Warmer warmer; private final Translog translog; private final ElasticsearchConcurrentMergeScheduler mergeScheduler; @@ -131,7 +131,6 @@ public class InternalEngine extends Engine { boolean success = false; try { this.lastDeleteVersionPruneTimeMSec = engineConfig.getThreadPool().estimatedTimeInMillis(); - this.indexingService = engineConfig.getIndexingService(); this.warmer = engineConfig.getWarmer(); mergeScheduler = scheduler = new EngineMergeScheduler(engineConfig.getShardId(), engineConfig.getIndexSettings(), engineConfig.getMergeSchedulerConfig()); this.dirtyLocks = new Object[Runtime.getRuntime().availableProcessors() * 10]; // we multiply it to have enough... @@ -422,8 +421,6 @@ public class InternalEngine extends Engine { versionMap.putUnderLock(index.uid().bytes(), new VersionValue(updatedVersion, translogLocation)); index.setTranslogLocation(translogLocation); - - indexingService.postIndexUnderLock(index); return created; } } @@ -524,7 +521,6 @@ public class InternalEngine extends Engine { Translog.Location translogLocation = translog.add(new Translog.Delete(delete)); versionMap.putUnderLock(delete.uid().bytes(), new DeleteVersionValue(updatedVersion, engineConfig.getThreadPool().estimatedTimeInMillis(), translogLocation)); delete.setTranslogLocation(translogLocation); - indexingService.postDeleteUnderLock(delete); } } @@ -1059,6 +1055,10 @@ public class InternalEngine extends Engine { throttle.deactivate(); } + public long getIndexThrottleTimeInMillis() { + return throttle.getThrottleTimeInMillis(); + } + long getGcDeletesInMillis() { return engineConfig.getGcDeletesInMillis(); } @@ -1081,7 +1081,6 @@ public class InternalEngine extends Engine { if (numMergesInFlight.incrementAndGet() > maxNumMerges) { if (isThrottling.getAndSet(true) == false) { logger.info("now throttling indexing: numMergesInFlight={}, maxNumMerges={}", numMergesInFlight, maxNumMerges); - indexingService.throttlingActivated(); activateThrottling(); } } @@ -1093,7 +1092,6 @@ public class InternalEngine extends Engine { if (numMergesInFlight.decrementAndGet() < maxNumMerges) { if (isThrottling.getAndSet(false)) { logger.info("stop throttling indexing: numMergesInFlight={}, maxNumMerges={}", numMergesInFlight, maxNumMerges); - indexingService.throttlingDeactivated(); deactivateThrottling(); } } diff --git a/core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java b/core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java index 651bc405a84..39f3dd602fb 100644 --- a/core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java +++ b/core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java @@ -32,16 +32,6 @@ public abstract class IndexingOperationListener { return operation; } - /** - * Called after the indexing occurs, under a locking scheme to maintain - * concurrent updates to the same doc. - *

- * Note, long operations should not occur under this callback. - */ - public void postIndexUnderLock(Engine.Index index) { - - } - /** * Called after the indexing operation occurred. */ @@ -63,15 +53,6 @@ public abstract class IndexingOperationListener { return delete; } - /** - * Called after the delete occurs, under a locking scheme to maintain - * concurrent updates to the same doc. - *

- * Note, long operations should not occur under this callback. - */ - public void postDeleteUnderLock(Engine.Delete delete) { - - } /** * Called after the delete operation occurred. diff --git a/core/src/main/java/org/elasticsearch/index/indexing/ShardIndexingService.java b/core/src/main/java/org/elasticsearch/index/indexing/ShardIndexingService.java index 5cf180c3a2e..f7175c02c59 100644 --- a/core/src/main/java/org/elasticsearch/index/indexing/ShardIndexingService.java +++ b/core/src/main/java/org/elasticsearch/index/indexing/ShardIndexingService.java @@ -59,19 +59,19 @@ public class ShardIndexingService extends AbstractIndexShardComponent { * is returned for them. If they are set, then only types provided will be returned, or * _all for all types. */ - public IndexingStats stats(String... types) { - IndexingStats.Stats total = totalStats.stats(); + public IndexingStats stats(boolean isThrottled, long currentThrottleInMillis, String... types) { + IndexingStats.Stats total = totalStats.stats(isThrottled, currentThrottleInMillis); Map typesSt = null; if (types != null && types.length > 0) { typesSt = new HashMap<>(typesStats.size()); if (types.length == 1 && types[0].equals("_all")) { for (Map.Entry entry : typesStats.entrySet()) { - typesSt.put(entry.getKey(), entry.getValue().stats()); + typesSt.put(entry.getKey(), entry.getValue().stats(isThrottled, currentThrottleInMillis)); } } else { for (Map.Entry entry : typesStats.entrySet()) { if (Regex.simpleMatch(types, entry.getKey())) { - typesSt.put(entry.getKey(), entry.getValue().stats()); + typesSt.put(entry.getKey(), entry.getValue().stats(isThrottled, currentThrottleInMillis)); } } } @@ -87,14 +87,6 @@ public class ShardIndexingService extends AbstractIndexShardComponent { listeners.remove(listener); } - public void throttlingActivated() { - totalStats.setThrottled(true); - } - - public void throttlingDeactivated() { - totalStats.setThrottled(false); - } - public Engine.Index preIndex(Engine.Index operation) { totalStats.indexCurrent.inc(); typeStats(operation.type()).indexCurrent.inc(); @@ -104,16 +96,6 @@ public class ShardIndexingService extends AbstractIndexShardComponent { return operation; } - public void postIndexUnderLock(Engine.Index index) { - for (IndexingOperationListener listener : listeners) { - try { - listener.postIndexUnderLock(index); - } catch (Exception e) { - logger.warn("postIndexUnderLock listener [{}] failed", e, listener); - } - } - } - public void postIndex(Engine.Index index) { long took = index.endTime() - index.startTime(); totalStats.indexMetric.inc(took); @@ -154,15 +136,6 @@ public class ShardIndexingService extends AbstractIndexShardComponent { return delete; } - public void postDeleteUnderLock(Engine.Delete delete) { - for (IndexingOperationListener listener : listeners) { - try { - listener.postDeleteUnderLock(delete); - } catch (Exception e) { - logger.warn("postDeleteUnderLock listener [{}] failed", e, listener); - } - } - } public void postDelete(Engine.Delete delete) { long took = delete.endTime() - delete.startTime(); @@ -238,38 +211,12 @@ public class ShardIndexingService extends AbstractIndexShardComponent { public final CounterMetric indexFailed = new CounterMetric(); public final CounterMetric deleteCurrent = new CounterMetric(); public final CounterMetric noopUpdates = new CounterMetric(); - public final CounterMetric throttleTimeMillisMetric = new CounterMetric(); - volatile boolean isThrottled = false; - volatile long startOfThrottleNS; - public IndexingStats.Stats stats() { - long currentThrottleNS = 0; - if (isThrottled && startOfThrottleNS != 0) { - currentThrottleNS += System.nanoTime() - startOfThrottleNS; - if (currentThrottleNS < 0) { - // Paranoia (System.nanoTime() is supposed to be monotonic): time slip must have happened, have to ignore this value - currentThrottleNS = 0; - } - } + public IndexingStats.Stats stats(boolean isThrottled, long currentThrottleMillis) { return new IndexingStats.Stats( indexMetric.count(), TimeUnit.NANOSECONDS.toMillis(indexMetric.sum()), indexCurrent.count(), indexFailed.count(), deleteMetric.count(), TimeUnit.NANOSECONDS.toMillis(deleteMetric.sum()), deleteCurrent.count(), - noopUpdates.count(), isThrottled, TimeUnit.MILLISECONDS.toMillis(throttleTimeMillisMetric.count() + TimeValue.nsecToMSec(currentThrottleNS))); - } - - - void setThrottled(boolean isThrottled) { - if (!this.isThrottled && isThrottled) { - startOfThrottleNS = System.nanoTime(); - } else if (this.isThrottled && !isThrottled) { - assert startOfThrottleNS > 0 : "Bad state of startOfThrottleNS"; - long throttleTimeNS = System.nanoTime() - startOfThrottleNS; - if (throttleTimeNS >= 0) { - // Paranoia (System.nanoTime() is supposed to be monotonic): time slip may have occurred but never want to add a negative number - throttleTimeMillisMetric.inc(TimeValue.nsecToMSec(throttleTimeNS)); - } - } - this.isThrottled = isThrottled; + noopUpdates.count(), isThrottled, TimeUnit.MILLISECONDS.toMillis(currentThrottleMillis)); } public long totalCurrent() { diff --git a/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java b/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java index eaf562e2127..de56e4f3242 100644 --- a/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java +++ b/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java @@ -43,7 +43,9 @@ import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.DocumentTypeListener; import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.index.mapper.Uid; import org.elasticsearch.index.mapper.internal.TypeFieldMapper; +import org.elasticsearch.index.mapper.internal.UidFieldMapper; import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.shard.AbstractIndexShardComponent; import org.elasticsearch.index.shard.ShardId; @@ -71,29 +73,21 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent private final MapperService mapperService; private final IndexFieldDataService indexFieldDataService; - private final ShardIndexingService indexingService; private final ConcurrentMap percolateQueries = ConcurrentCollections.newConcurrentMapWithAggressiveConcurrency(); - private final RealTimePercolatorOperationListener realTimePercolatorOperationListener = new RealTimePercolatorOperationListener(); - private final PercolateTypeListener percolateTypeListener = new PercolateTypeListener(); - private final AtomicBoolean realTimePercolatorEnabled = new AtomicBoolean(false); private final QueryShardContext queryShardContext; private boolean mapUnmappedFieldsAsString; private final MeanMetric percolateMetric = new MeanMetric(); private final CounterMetric currentMetric = new CounterMetric(); private final CounterMetric numberOfQueries = new CounterMetric(); - public PercolatorQueriesRegistry(ShardId shardId, IndexSettings indexSettings, - ShardIndexingService indexingService, MapperService mapperService, - QueryShardContext queryShardContext, - IndexFieldDataService indexFieldDataService) { + public PercolatorQueriesRegistry(ShardId shardId, IndexSettings indexSettings, MapperService mapperService, + QueryShardContext queryShardContext, IndexFieldDataService indexFieldDataService) { super(shardId, indexSettings); this.mapperService = mapperService; - this.indexingService = indexingService; this.queryShardContext = queryShardContext; this.indexFieldDataService = indexFieldDataService; this.mapUnmappedFieldsAsString = this.indexSettings.getSettings().getAsBoolean(MAP_UNMAPPED_FIELDS_AS_STRING, false); - mapperService.addTypeListener(percolateTypeListener); } public ConcurrentMap percolateQueries() { @@ -102,8 +96,6 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent @Override public void close() { - mapperService.removeTypeListener(percolateTypeListener); - indexingService.removeListener(realTimePercolatorOperationListener); clear(); } @@ -111,11 +103,6 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent percolateQueries.clear(); } - public void enableRealTimePercolator() { - if (realTimePercolatorEnabled.compareAndSet(false, true)) { - indexingService.addListener(realTimePercolatorOperationListener); - } - } public void addPercolateQuery(String idAsString, BytesReference source) { Query newquery = parsePercolatorDocument(idAsString, source); @@ -207,16 +194,6 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent } } - private class PercolateTypeListener implements DocumentTypeListener { - - @Override - public void beforeCreate(DocumentMapper mapper) { - if (PercolatorService.TYPE_NAME.equals(mapper.type())) { - enableRealTimePercolator(); - } - } - } - public void loadQueries(IndexReader reader) { logger.trace("loading percolator queries..."); final int loadedQueries; @@ -238,30 +215,26 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent logger.debug("done loading [{}] percolator queries", loadedQueries); } - private class RealTimePercolatorOperationListener extends IndexingOperationListener { - - @Override - public Engine.Index preIndex(Engine.Index operation) { - // validate the query here, before we index - if (PercolatorService.TYPE_NAME.equals(operation.type())) { - parsePercolatorDocument(operation.id(), operation.source()); - } - return operation; + public boolean isPercolatorQuery(Engine.Index operation) { + if (PercolatorService.TYPE_NAME.equals(operation.type())) { + parsePercolatorDocument(operation.id(), operation.source()); + return true; } + return false; + } - @Override - public void postIndexUnderLock(Engine.Index index) { - // add the query under a doc lock - if (PercolatorService.TYPE_NAME.equals(index.type())) { - addPercolateQuery(index.id(), index.source()); - } - } + public boolean isPercolatorQuery(Engine.Delete operation) { + return PercolatorService.TYPE_NAME.equals(operation.type()); + } - @Override - public void postDeleteUnderLock(Engine.Delete delete) { - // remove the query under a lock - if (PercolatorService.TYPE_NAME.equals(delete.type())) { - removePercolateQuery(delete.id()); + public synchronized void updatePercolateQuery(Engine engine, String id) { + // this can be called out of order as long as for every change to a percolator document it's invoked. This will always + // fetch the latest change but might fetch the same change twice if updates / deletes happen concurrently. + try (Engine.GetResult getResult = engine.get(new Engine.Get(true, new Term(UidFieldMapper.NAME, Uid.createUidAsBytes(PercolatorService.TYPE_NAME, id))))) { + if (getResult.exists()) { + addPercolateQuery(id, getResult.source().source); + } else { + removePercolateQuery(id); } } } diff --git a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java index 84752af1e68..f5caa59c79b 100644 --- a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -267,12 +267,7 @@ public class IndexShard extends AbstractIndexShardComponent { this.indexShardOperationCounter = new IndexShardOperationCounter(logger, shardId); this.provider = provider; this.searcherWrapper = indexSearcherWrapper; - this.percolatorQueriesRegistry = new PercolatorQueriesRegistry(shardId, indexSettings, indexingService, mapperService, newQueryShardContext(), indexFieldDataService); - if (mapperService.hasMapping(PercolatorService.TYPE_NAME)) { - percolatorQueriesRegistry.enableRealTimePercolator(); - } - - + this.percolatorQueriesRegistry = new PercolatorQueriesRegistry(shardId, indexSettings, mapperService, newQueryShardContext(), indexFieldDataService); // We start up inactive active.set(false); } @@ -500,7 +495,12 @@ public class IndexShard extends AbstractIndexShardComponent { if (logger.isTraceEnabled()) { logger.trace("index [{}][{}]{}", index.type(), index.id(), index.docs()); } - created = getEngine().index(index); + final boolean isPercolatorQuery = percolatorQueriesRegistry.isPercolatorQuery(index); + Engine engine = getEngine(); + created = engine.index(index); + if (isPercolatorQuery) { + percolatorQueriesRegistry.updatePercolateQuery(engine, index.id()); + } index.endTime(System.nanoTime()); } catch (Throwable ex) { indexingService.postIndex(index, ex); @@ -537,7 +537,12 @@ public class IndexShard extends AbstractIndexShardComponent { if (logger.isTraceEnabled()) { logger.trace("delete [{}]", delete.uid().text()); } - getEngine().delete(delete); + final boolean isPercolatorQuery = percolatorQueriesRegistry.isPercolatorQuery(delete); + Engine engine = getEngine(); + engine.delete(delete); + if (isPercolatorQuery) { + percolatorQueriesRegistry.updatePercolateQuery(engine, delete.id()); + } delete.endTime(System.nanoTime()); } catch (Throwable ex) { indexingService.postDelete(delete, ex); @@ -585,7 +590,17 @@ public class IndexShard extends AbstractIndexShardComponent { } public IndexingStats indexingStats(String... types) { - return indexingService.stats(types); + Engine engine = getEngineOrNull(); + final boolean throttled; + final long throttleTimeInMillis; + if (engine == null) { + throttled = false; + throttleTimeInMillis = 0; + } else { + throttled = engine.isThrottled(); + throttleTimeInMillis = engine.getIndexThrottleTimeInMillis(); + } + return indexingService.stats(throttled, throttleTimeInMillis, types); } public SearchStats searchStats(String... groups) { @@ -1470,7 +1485,7 @@ public class IndexShard extends AbstractIndexShardComponent { }; final Engine.Warmer engineWarmer = (searcher, toLevel) -> warmer.warm(searcher, this, idxSettings, toLevel); return new EngineConfig(shardId, - threadPool, indexingService, indexSettings, engineWarmer, store, deletionPolicy, mergePolicyConfig.getMergePolicy(), mergeSchedulerConfig, + threadPool, indexSettings, engineWarmer, store, deletionPolicy, mergePolicyConfig.getMergePolicy(), mergeSchedulerConfig, mapperService.indexAnalyzer(), similarityService.similarity(mapperService), codecService, shardEventListener, translogRecoveryPerformer, indexCache.query(), cachingPolicy, translogConfig, inactiveTime); } diff --git a/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java b/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java index 889cf74a7b4..6905cc015b0 100644 --- a/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java +++ b/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java @@ -71,11 +71,9 @@ import org.elasticsearch.index.VersionType; import org.elasticsearch.index.analysis.AnalysisService; import org.elasticsearch.index.codec.CodecService; import org.elasticsearch.index.engine.Engine.Searcher; -import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.mapper.ContentPath; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.DocumentMapperForType; -import org.elasticsearch.index.mapper.DocumentMapperParser; import org.elasticsearch.index.mapper.Mapper.BuilderContext; import org.elasticsearch.index.mapper.MapperBuilders; import org.elasticsearch.index.mapper.MapperService; @@ -272,7 +270,7 @@ public class InternalEngineTests extends ESTestCase { IndexWriterConfig iwc = newIndexWriterConfig(); TranslogConfig translogConfig = new TranslogConfig(shardId, translogPath, indexSettings, BigArrays.NON_RECYCLING_INSTANCE); - EngineConfig config = new EngineConfig(shardId, threadPool, new ShardIndexingService(shardId, INDEX_SETTINGS), indexSettings + EngineConfig config = new EngineConfig(shardId, threadPool, indexSettings , null, store, createSnapshotDeletionPolicy(), mergePolicy, mergeSchedulerConfig, iwc.getAnalyzer(), iwc.getSimilarity(), new CodecService(null, logger), new Engine.EventListener() { @Override @@ -1977,7 +1975,7 @@ public class InternalEngineTests extends ESTestCase { /* create a TranslogConfig that has been created with a different UUID */ TranslogConfig translogConfig = new TranslogConfig(shardId, translog.location(), config.getIndexSettings(), BigArrays.NON_RECYCLING_INSTANCE); - EngineConfig brokenConfig = new EngineConfig(shardId, threadPool, config.getIndexingService(), config.getIndexSettings() + EngineConfig brokenConfig = new EngineConfig(shardId, threadPool, config.getIndexSettings() , null, store, createSnapshotDeletionPolicy(), newMergePolicy(), config.getMergeSchedulerConfig(), config.getAnalyzer(), config.getSimilarity(), new CodecService(null, logger), config.getEventListener() , config.getTranslogRecoveryPerformer(), IndexSearcher.getDefaultQueryCache(), IndexSearcher.getDefaultQueryCachingPolicy(), translogConfig, TimeValue.timeValueMinutes(5)); diff --git a/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java b/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java index 214bc343a8a..3e20a1f58d7 100644 --- a/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java +++ b/core/src/test/java/org/elasticsearch/index/engine/ShadowEngineTests.java @@ -48,7 +48,6 @@ import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.codec.CodecService; -import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.mapper.Mapping; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.ParsedDocument; @@ -224,7 +223,7 @@ public class ShadowEngineTests extends ESTestCase { public EngineConfig config(IndexSettings indexSettings, Store store, Path translogPath, MergeSchedulerConfig mergeSchedulerConfig, MergePolicy mergePolicy) { IndexWriterConfig iwc = newIndexWriterConfig(); TranslogConfig translogConfig = new TranslogConfig(shardId, translogPath, indexSettings, BigArrays.NON_RECYCLING_INSTANCE); - EngineConfig config = new EngineConfig(shardId, threadPool, new ShardIndexingService(shardId, indexSettings), indexSettings + EngineConfig config = new EngineConfig(shardId, threadPool, indexSettings , null, store, createSnapshotDeletionPolicy(), mergePolicy, mergeSchedulerConfig, iwc.getAnalyzer(), iwc.getSimilarity() , new CodecService(null, logger), new Engine.EventListener() { @Override From 12b93e72f0b25f0b96e4276541d0827f03d3a883 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Wed, 6 Jan 2016 13:10:21 +0100 Subject: [PATCH 06/59] Never delete translog-N.tlog file when creation fails We today delete the translog-N.tlog file if any subsequent operation fails but we might actually be in a good state if for instance the creation of the writer failes after we sucessfully baked the new translog generation into the checkpoint. In this situation we used to delete the translog-N.tlog file and failed on the next recovery of the translog with a NoSuchFileException | FileNotFoundException just like in https://discuss.elastic.co/t/cannot-recover-index-because-of-missing-tanslog-files/38336 This commit changes the behavior and cleans up that limbo state on recovery if we already have a generation+1 file written but not baked into the checkpoint we remove that file but only if the previous ckp file has already been renamed otherwise we know we can't be in this state. --- .../index/translog/Translog.java | 15 ++ .../index/translog/TranslogWriter.java | 19 ++- .../index/translog/TranslogTests.java | 152 ++++++++++++++---- 3 files changed, 152 insertions(+), 34 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/translog/Translog.java b/core/src/main/java/org/elasticsearch/index/translog/Translog.java index 3f8f0ab54df..00fc4556d05 100644 --- a/core/src/main/java/org/elasticsearch/index/translog/Translog.java +++ b/core/src/main/java/org/elasticsearch/index/translog/Translog.java @@ -163,6 +163,21 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC try { if (translogGeneration != null) { final Checkpoint checkpoint = readCheckpoint(); + final Path nextTranslogFile = location.resolve(getFilename(checkpoint.generation + 1)); + final Path currentCheckpointFile = location.resolve(getCommitCheckpointFileName(checkpoint.generation)); + // this is special handling for error condition when we create a new writer but we fail to bake + // the newly written file (generation+1) into the checkpoint. This is still a valid state + // we just need to cleanup before we continue + // we hit this before and then blindly deleted the new generation even though we managed to bake it in and then hit this: + // https://discuss.elastic.co/t/cannot-recover-index-because-of-missing-tanslog-files/38336 as an example + // + // For this to happen we must have already copied the translog.ckp file into translog-gen.ckp so we first check if that file exists + // if not we don't even try to clean it up and wait until we fail creating it + assert Files.exists(nextTranslogFile) == false || Files.size(nextTranslogFile) <= TranslogWriter.getHeaderLength(translogUUID); + if (Files.exists(currentCheckpointFile) // current checkpoint is already copied + && Files.deleteIfExists(nextTranslogFile)) { // delete it and log a warning + logger.warn("Deleted invalid next generation before opening writer {} this is like caused by some previously tragic exception ", nextTranslogFile.getFileName()); + } this.recoveredTranslogs = recoverFromFiles(translogGeneration, checkpoint); if (recoveredTranslogs.isEmpty()) { throw new IllegalStateException("at least one reader must be recovered"); diff --git a/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java b/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java index 026aac4515e..867b94a8505 100644 --- a/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java +++ b/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java @@ -69,9 +69,17 @@ public class TranslogWriter extends TranslogReader { totalOffset = lastSyncedOffset; } + static int getHeaderLength(String translogUUID) { + return getHeaderLength(new BytesRef(translogUUID).length); + } + + private static int getHeaderLength(int uuidLength) { + return CodecUtil.headerLength(TRANSLOG_CODEC) + uuidLength + RamUsageEstimator.NUM_BYTES_INT; + } + public static TranslogWriter create(ShardId shardId, String translogUUID, long fileGeneration, Path file, Callback onClose, ChannelFactory channelFactory, ByteSizeValue bufferSize) throws IOException { final BytesRef ref = new BytesRef(translogUUID); - final int headerLength = CodecUtil.headerLength(TRANSLOG_CODEC) + ref.length + RamUsageEstimator.NUM_BYTES_INT; + final int headerLength = getHeaderLength(ref.length); final FileChannel channel = channelFactory.open(file); try { // This OutputStreamDataOutput is intentionally not closed because @@ -80,17 +88,14 @@ public class TranslogWriter extends TranslogReader { CodecUtil.writeHeader(out, TRANSLOG_CODEC, VERSION); out.writeInt(ref.length); out.writeBytes(ref.bytes, ref.offset, ref.length); - channel.force(false); + channel.force(true); writeCheckpoint(headerLength, 0, file.getParent(), fileGeneration, StandardOpenOption.WRITE); final TranslogWriter writer = new TranslogWriter(shardId, fileGeneration, new ChannelReference(file, fileGeneration, channel, onClose), bufferSize); return writer; } catch (Throwable throwable){ + // if we fail to bake the file-generation into the checkpoint we stick with the file and once we recover and that + // file exists we remove it. We only apply this logic to the checkpoint.generation+1 any other file with a higher generation is an error condition IOUtils.closeWhileHandlingException(channel); - try { - Files.delete(file); // remove the file as well - } catch (IOException ex) { - throwable.addSuppressed(ex); - } throw throwable; } } diff --git a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java index 1da2b7bf3c8..b31aafa432d 100644 --- a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java +++ b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java @@ -55,6 +55,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; +import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; @@ -136,8 +137,8 @@ public class TranslogTests extends ESTestCase { private TranslogConfig getTranslogConfig(Path path) { Settings build = Settings.settingsBuilder() - .put(IndexMetaData.SETTING_VERSION_CREATED, org.elasticsearch.Version.CURRENT) - .build(); + .put(IndexMetaData.SETTING_VERSION_CREATED, org.elasticsearch.Version.CURRENT) + .build(); ByteSizeValue bufferSize = randomBoolean() ? TranslogConfig.DEFAULT_BUFFER_SIZE : new ByteSizeValue(10 + randomInt(128 * 1024), ByteSizeUnit.BYTES); return new TranslogConfig(shardId, path, IndexSettingsModule.newIndexSettings(shardId.index(), build), BigArrays.NON_RECYCLING_INSTANCE, bufferSize); } @@ -335,9 +336,9 @@ public class TranslogTests extends ESTestCase { assertEquals(6, copy.estimatedNumberOfOperations()); assertEquals(431, copy.getTranslogSizeInBytes()); assertEquals("\"translog\"{\n" + - " \"operations\" : 6,\n" + - " \"size_in_bytes\" : 431\n" + - "}", copy.toString().trim()); + " \"operations\" : 6,\n" + + " \"size_in_bytes\" : 431\n" + + "}", copy.toString().trim()); try { new TranslogStats(1, -1); @@ -634,7 +635,9 @@ public class TranslogTests extends ESTestCase { assertFileIsPresent(translog, 1); } - /** Tests that concurrent readers and writes maintain view and snapshot semantics */ + /** + * Tests that concurrent readers and writes maintain view and snapshot semantics + */ public void testConcurrentWriteViewsAndSnapshot() throws Throwable { final Thread[] writers = new Thread[randomIntBetween(1, 10)]; final Thread[] readers = new Thread[randomIntBetween(1, 10)]; @@ -833,7 +836,7 @@ public class TranslogTests extends ESTestCase { int count = 0; for (int op = 0; op < translogOperations; op++) { locations.add(translog.add(new Translog.Index("test", "" + op, Integer.toString(++count).getBytes(Charset.forName("UTF-8"))))); - if (rarely() && translogOperations > op+1) { + if (rarely() && translogOperations > op + 1) { translog.commit(); } } @@ -912,7 +915,7 @@ public class TranslogTests extends ESTestCase { final TranslogReader reader = randomBoolean() ? writer : translog.openReader(writer.path(), Checkpoint.read(translog.location().resolve(Translog.CHECKPOINT_FILE_NAME))); for (int i = 0; i < numOps; i++) { ByteBuffer buffer = ByteBuffer.allocate(4); - reader.readBytes(buffer, reader.getFirstOperationOffset() + 4*i); + reader.readBytes(buffer, reader.getFirstOperationOffset() + 4 * i); buffer.flip(); final int value = buffer.getInt(); assertEquals(i, value); @@ -951,9 +954,9 @@ public class TranslogTests extends ESTestCase { for (int op = 0; op < translogOperations; op++) { locations.add(translog.add(new Translog.Index("test", "" + op, Integer.toString(op).getBytes(Charset.forName("UTF-8"))))); final boolean commit = commitOften ? frequently() : rarely(); - if (commit && op < translogOperations-1) { + if (commit && op < translogOperations - 1) { translog.commit(); - minUncommittedOp = op+1; + minUncommittedOp = op + 1; translogGeneration = translog.getGeneration(); } } @@ -987,7 +990,7 @@ public class TranslogTests extends ESTestCase { public void testRecoveryUncommitted() throws IOException { List locations = new ArrayList<>(); int translogOperations = randomIntBetween(10, 100); - final int prepareOp = randomIntBetween(0, translogOperations-1); + final int prepareOp = randomIntBetween(0, translogOperations - 1); Translog.TranslogGeneration translogGeneration = null; final boolean sync = randomBoolean(); for (int op = 0; op < translogOperations; op++) { @@ -1040,7 +1043,7 @@ public class TranslogTests extends ESTestCase { public void testRecoveryUncommittedFileExists() throws IOException { List locations = new ArrayList<>(); int translogOperations = randomIntBetween(10, 100); - final int prepareOp = randomIntBetween(0, translogOperations-1); + final int prepareOp = randomIntBetween(0, translogOperations - 1); Translog.TranslogGeneration translogGeneration = null; final boolean sync = randomBoolean(); for (int op = 0; op < translogOperations; op++) { @@ -1094,7 +1097,7 @@ public class TranslogTests extends ESTestCase { } } - public void testRecoveryUncommittedCorryptedCheckpoint() throws IOException { + public void testRecoveryUncommittedCorruptedCheckpoint() throws IOException { List locations = new ArrayList<>(); int translogOperations = 100; final int prepareOp = 44; @@ -1116,10 +1119,10 @@ public class TranslogTests extends ESTestCase { config.setTranslogGeneration(translogGeneration); Path ckp = config.getTranslogPath().resolve(Translog.CHECKPOINT_FILE_NAME); Checkpoint read = Checkpoint.read(ckp); - Checkpoint corrupted = new Checkpoint(0,0,0); + Checkpoint corrupted = new Checkpoint(0, 0, 0); Checkpoint.write(config.getTranslogPath().resolve(Translog.getCommitCheckpointFileName(read.generation)), corrupted, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW); try (Translog translog = new Translog(config)) { - fail("corrupted"); + fail("corrupted"); } catch (IllegalStateException ex) { assertEquals(ex.getMessage(), "Checkpoint file translog-2.ckp already exists but has corrupted content expected: Checkpoint{offset=2683, numOps=55, translogFileGeneration= 2} but got: Checkpoint{offset=0, numOps=0, translogFileGeneration= 0}"); } @@ -1157,7 +1160,7 @@ public class TranslogTests extends ESTestCase { List locations = new ArrayList<>(); List locations2 = new ArrayList<>(); int translogOperations = randomIntBetween(10, 100); - try(Translog translog2 = create(createTempDir())) { + try (Translog translog2 = create(createTempDir())) { for (int op = 0; op < translogOperations; op++) { locations.add(translog.add(new Translog.Index("test", "" + op, Integer.toString(op).getBytes(Charset.forName("UTF-8"))))); locations2.add(translog2.add(new Translog.Index("test", "" + op, Integer.toString(op).getBytes(Charset.forName("UTF-8"))))); @@ -1196,7 +1199,7 @@ public class TranslogTests extends ESTestCase { Translog.TranslogGeneration translogGeneration = translog.getGeneration(); translog.close(); - config.setTranslogGeneration(new Translog.TranslogGeneration(randomRealisticUnicodeOfCodepointLengthBetween(1, translogGeneration.translogUUID.length()),translogGeneration.translogFileGeneration)); + config.setTranslogGeneration(new Translog.TranslogGeneration(randomRealisticUnicodeOfCodepointLengthBetween(1, translogGeneration.translogUUID.length()), translogGeneration.translogFileGeneration)); try { new Translog(config); fail("translog doesn't belong to this UUID"); @@ -1283,12 +1286,12 @@ public class TranslogTests extends ESTestCase { case CREATE: case INDEX: op = new Translog.Index("test", threadId + "_" + opCount, - randomUnicodeOfLengthBetween(1, 20 * 1024).getBytes("UTF-8")); + randomUnicodeOfLengthBetween(1, 20 * 1024).getBytes("UTF-8")); break; case DELETE: op = new Translog.Delete(new Term("_uid", threadId + "_" + opCount), - 1 + randomInt(100000), - randomFrom(VersionType.values())); + 1 + randomInt(100000), + randomFrom(VersionType.values())); break; default: throw new ElasticsearchException("not supported op type"); @@ -1307,7 +1310,8 @@ public class TranslogTests extends ESTestCase { return translog.add(op); } - protected void afterAdd() throws IOException {} + protected void afterAdd() throws IOException { + } } public void testFailFlush() throws IOException { @@ -1319,7 +1323,7 @@ public class TranslogTests extends ESTestCase { List locations = new ArrayList<>(); int opsSynced = 0; boolean failed = false; - while(failed == false) { + while (failed == false) { try { locations.add(translog.add(new Translog.Index("test", "" + opsSynced, Integer.toString(opsSynced).getBytes(Charset.forName("UTF-8"))))); translog.sync(); @@ -1331,7 +1335,7 @@ public class TranslogTests extends ESTestCase { failed = true; assertFalse(translog.isOpen()); assertEquals("__FAKE__ no space left on device", ex.getMessage()); - } + } fail.set(randomBoolean()); } fail.set(false); @@ -1370,7 +1374,7 @@ public class TranslogTests extends ESTestCase { assertFalse(translog.isOpen()); translog.close(); // we are closed config.setTranslogGeneration(translogGeneration); - try (Translog tlog = new Translog(config)){ + try (Translog tlog = new Translog(config)) { assertEquals("lastCommitted must be 1 less than current", translogGeneration.translogFileGeneration + 1, tlog.currentFileGeneration()); assertFalse(tlog.syncNeeded()); @@ -1393,7 +1397,7 @@ public class TranslogTests extends ESTestCase { for (int opsAdded = 0; opsAdded < numOps; opsAdded++) { locations.add(translog.add(new Translog.Index("test", "" + opsAdded, lineFileDocs.nextDoc().toString().getBytes(Charset.forName("UTF-8"))))); try (Translog.Snapshot snapshot = translog.newSnapshot()) { - assertEquals(opsAdded+1, snapshot.estimatedTotalOperations()); + assertEquals(opsAdded + 1, snapshot.estimatedTotalOperations()); for (int i = 0; i < opsAdded; i++) { assertEquals("expected operation" + i + " to be in the current translog but wasn't", translog.currentFileGeneration(), locations.get(i).generation); Translog.Operation next = snapshot.next(); @@ -1407,7 +1411,7 @@ public class TranslogTests extends ESTestCase { Path tempDir = createTempDir(); final AtomicBoolean fail = new AtomicBoolean(); TranslogConfig config = getTranslogConfig(tempDir); - assumeFalse("this won't work if we sync on any op",config.isSyncOnEachOperation()); + assumeFalse("this won't work if we sync on any op", config.isSyncOnEachOperation()); Translog translog = getFailableTranslog(fail, config, false, true); LineFileDocs lineFileDocs = new LineFileDocs(random()); // writes pretty big docs so we cross buffer boarders regularly translog.add(new Translog.Index("test", "1", lineFileDocs.nextDoc().toString().getBytes(Charset.forName("UTF-8")))); @@ -1427,7 +1431,7 @@ public class TranslogTests extends ESTestCase { assertTrue(ex.getCause() instanceof UnknownException); } assertFalse(translog.isOpen()); - assertTrue(translog.getTragicException() instanceof UnknownException); + assertTrue(translog.getTragicException() instanceof UnknownException); } public void testFatalIOExceptionsWhileWritingConcurrently() throws IOException, InterruptedException { @@ -1520,6 +1524,7 @@ public class TranslogTests extends ESTestCase { } } } + private Translog getFailableTranslog(final AtomicBoolean fail, final TranslogConfig config) throws IOException { return getFailableTranslog(fail, config, randomBoolean(), false); } @@ -1613,4 +1618,97 @@ public class TranslogTests extends ESTestCase { // all is well } } + + public void testRecoverWithUnbackedNextGen() throws IOException { + translog.add(new Translog.Index("test", "" + 0, Integer.toString(0).getBytes(Charset.forName("UTF-8")))); + Translog.TranslogGeneration translogGeneration = translog.getGeneration(); + translog.close(); + TranslogConfig config = translog.getConfig(); + + Path ckp = config.getTranslogPath().resolve(Translog.CHECKPOINT_FILE_NAME); + Checkpoint read = Checkpoint.read(ckp); + Files.copy(ckp, config.getTranslogPath().resolve(Translog.getCommitCheckpointFileName(read.generation))); + Files.createFile(config.getTranslogPath().resolve("translog-" + (read.generation + 1) + ".tlog")); + config.setTranslogGeneration(translogGeneration); + try (Translog tlog = new Translog(config)) { + assertNotNull(translogGeneration); + assertFalse(tlog.syncNeeded()); + try (Translog.Snapshot snapshot = tlog.newSnapshot()) { + for (int i = 0; i < 1; i++) { + Translog.Operation next = snapshot.next(); + assertNotNull("operation " + i + " must be non-null", next); + assertEquals("payload missmatch", i, Integer.parseInt(next.getSource().source.toUtf8())); + } + } + tlog.add(new Translog.Index("test", "" + 1, Integer.toString(1).getBytes(Charset.forName("UTF-8")))); + } + try (Translog tlog = new Translog(config)) { + assertNotNull(translogGeneration); + assertFalse(tlog.syncNeeded()); + try (Translog.Snapshot snapshot = tlog.newSnapshot()) { + for (int i = 0; i < 2; i++) { + Translog.Operation next = snapshot.next(); + assertNotNull("operation " + i + " must be non-null", next); + assertEquals("payload missmatch", i, Integer.parseInt(next.getSource().source.toUtf8())); + } + } + } + } + + public void testRecoverWithUnbackedNextGenInIllegalState() throws IOException { + translog.add(new Translog.Index("test", "" + 0, Integer.toString(0).getBytes(Charset.forName("UTF-8")))); + Translog.TranslogGeneration translogGeneration = translog.getGeneration(); + translog.close(); + TranslogConfig config = translog.getConfig(); + Path ckp = config.getTranslogPath().resolve(Translog.CHECKPOINT_FILE_NAME); + Checkpoint read = Checkpoint.read(ckp); + // don't copy the new file + Files.createFile(config.getTranslogPath().resolve("translog-" + (read.generation + 1) + ".tlog")); + config.setTranslogGeneration(translogGeneration); + + try { + Translog tlog = new Translog(config); + fail("file already exists?"); + } catch (TranslogException ex) { + // all is well + assertEquals(ex.getMessage(), "failed to create new translog file"); + assertEquals(ex.getCause().getClass(), FileAlreadyExistsException.class); + } + } + public void testRecoverWithUnbackedNextGenAndFutureFile() throws IOException { + translog.add(new Translog.Index("test", "" + 0, Integer.toString(0).getBytes(Charset.forName("UTF-8")))); + Translog.TranslogGeneration translogGeneration = translog.getGeneration(); + translog.close(); + TranslogConfig config = translog.getConfig(); + + Path ckp = config.getTranslogPath().resolve(Translog.CHECKPOINT_FILE_NAME); + Checkpoint read = Checkpoint.read(ckp); + Files.copy(ckp, config.getTranslogPath().resolve(Translog.getCommitCheckpointFileName(read.generation))); + Files.createFile(config.getTranslogPath().resolve("translog-" + (read.generation + 1) + ".tlog")); + // we add N+1 and N+2 to ensure we only delete the N+1 file and never jump ahead and wipe without the right condition + Files.createFile(config.getTranslogPath().resolve("translog-" + (read.generation + 2) + ".tlog")); + config.setTranslogGeneration(translogGeneration); + try (Translog tlog = new Translog(config)) { + assertNotNull(translogGeneration); + assertFalse(tlog.syncNeeded()); + try (Translog.Snapshot snapshot = tlog.newSnapshot()) { + for (int i = 0; i < 1; i++) { + Translog.Operation next = snapshot.next(); + assertNotNull("operation " + i + " must be non-null", next); + assertEquals("payload missmatch", i, Integer.parseInt(next.getSource().source.toUtf8())); + } + } + tlog.add(new Translog.Index("test", "" + 1, Integer.toString(1).getBytes(Charset.forName("UTF-8")))); + } + + try { + Translog tlog = new Translog(config); + fail("file already exists?"); + } catch (TranslogException ex) { + // all is well + assertEquals(ex.getMessage(), "failed to create new translog file"); + assertEquals(ex.getCause().getClass(), FileAlreadyExistsException.class); + } + } + } From 5c833750d73ee7bed6c44496479ff2094d2058e9 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Wed, 6 Jan 2016 14:19:58 +0100 Subject: [PATCH 07/59] apply feedback from @bleskes --- .../main/java/org/elasticsearch/index/translog/Translog.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/translog/Translog.java b/core/src/main/java/org/elasticsearch/index/translog/Translog.java index 00fc4556d05..0d2fba6ea57 100644 --- a/core/src/main/java/org/elasticsearch/index/translog/Translog.java +++ b/core/src/main/java/org/elasticsearch/index/translog/Translog.java @@ -173,10 +173,10 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC // // For this to happen we must have already copied the translog.ckp file into translog-gen.ckp so we first check if that file exists // if not we don't even try to clean it up and wait until we fail creating it - assert Files.exists(nextTranslogFile) == false || Files.size(nextTranslogFile) <= TranslogWriter.getHeaderLength(translogUUID); + assert Files.exists(nextTranslogFile) == false || Files.size(nextTranslogFile) <= TranslogWriter.getHeaderLength(translogUUID) : "unexpected translog file: [" + nextTranslogFile + "]"; if (Files.exists(currentCheckpointFile) // current checkpoint is already copied && Files.deleteIfExists(nextTranslogFile)) { // delete it and log a warning - logger.warn("Deleted invalid next generation before opening writer {} this is like caused by some previously tragic exception ", nextTranslogFile.getFileName()); + logger.warn("deleted previously created, but not yet committed, next generation [{}]. This can happen due to a tragic exception when creating a new generation", nextTranslogFile.getFileName()); } this.recoveredTranslogs = recoverFromFiles(translogGeneration, checkpoint); if (recoveredTranslogs.isEmpty()) { From a6ec1434d631ac429e84486b966de6f027fbba5e Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Wed, 6 Jan 2016 14:35:11 +0100 Subject: [PATCH 08/59] [TEST] Reduce log level in NodeVersionAllocationDeciderTests --- .../routing/allocation/NodeVersionAllocationDeciderTests.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/cluster/routing/allocation/NodeVersionAllocationDeciderTests.java b/core/src/test/java/org/elasticsearch/cluster/routing/allocation/NodeVersionAllocationDeciderTests.java index f52178444d6..809b01cb619 100644 --- a/core/src/test/java/org/elasticsearch/cluster/routing/allocation/NodeVersionAllocationDeciderTests.java +++ b/core/src/test/java/org/elasticsearch/cluster/routing/allocation/NodeVersionAllocationDeciderTests.java @@ -381,8 +381,7 @@ public class NodeVersionAllocationDeciderTests extends ESAllocationTestCase { assertThat(primary, notNullValue()); String fromId = primary.currentNodeId(); String toId = r.relocatingNodeId(); - logger.error("From: " + fromId + " with Version: " + routingNodes.node(fromId).node().version() + " to: " + toId + " with Version: " + routingNodes.node(toId).node().version()); - logger.error(routingNodes.prettyPrint()); + logger.trace("From: " + fromId + " with Version: " + routingNodes.node(fromId).node().version() + " to: " + toId + " with Version: " + routingNodes.node(toId).node().version()); assertTrue(routingNodes.node(toId).node().version().onOrAfter(routingNodes.node(fromId).node().version())); } } From de6dfe15a72b90ef2a50c75f95604165c0540dd6 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Wed, 6 Jan 2016 11:11:43 +0100 Subject: [PATCH 09/59] Add PathHierarchy type back to path_hierarchy tokenizer for backward compatibility with 1.x Closes #15785 --- .../java/org/elasticsearch/index/analysis/AnalysisRegistry.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/org/elasticsearch/index/analysis/AnalysisRegistry.java b/core/src/main/java/org/elasticsearch/index/analysis/AnalysisRegistry.java index c833f41457e..1fd3a4d96b0 100644 --- a/core/src/main/java/org/elasticsearch/index/analysis/AnalysisRegistry.java +++ b/core/src/main/java/org/elasticsearch/index/analysis/AnalysisRegistry.java @@ -181,6 +181,7 @@ public final class AnalysisRegistry implements Closeable { tokenizers.put("standard", StandardTokenizerFactory::new); tokenizers.put("uax_url_email", UAX29URLEmailTokenizerFactory::new); tokenizers.put("path_hierarchy", PathHierarchyTokenizerFactory::new); + tokenizers.put("PathHierarchy", PathHierarchyTokenizerFactory::new); tokenizers.put("keyword", KeywordTokenizerFactory::new); tokenizers.put("letter", LetterTokenizerFactory::new); tokenizers.put("lowercase", LowerCaseTokenizerFactory::new); @@ -409,6 +410,7 @@ public final class AnalysisRegistry implements Closeable { // Tokenizer aliases tokenizerFactories.put("nGram", new PreBuiltTokenizerFactoryFactory(PreBuiltTokenizers.NGRAM.getTokenizerFactory(Version.CURRENT))); tokenizerFactories.put("edgeNGram", new PreBuiltTokenizerFactoryFactory(PreBuiltTokenizers.EDGE_NGRAM.getTokenizerFactory(Version.CURRENT))); + tokenizerFactories.put("PathHierarchy", new PreBuiltTokenizerFactoryFactory(PreBuiltTokenizers.PATH_HIERARCHY.getTokenizerFactory(Version.CURRENT))); // Token filters From 2d6adf64286152470cfdfe669171c1a5fe0f6f37 Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 6 Jan 2016 16:08:10 +0100 Subject: [PATCH 10/59] Percolator refactoring: * Added percolator field mapper that extracts the query terms and indexes these terms with the percolator query. * At percolate time these extracted terms are used to query percolator queries that are like to be evaluated. This can significantly cut down the time it takes to percolate. Whereas before all percolator queries were evaluated if they matches with the document being percolated. * Changes made to percolator queries are no longer immediately visible, a refresh needs to happen before the changes are visible. * By default the percolate api only returns upto 10 matches instead of returning all matching percolator queries. * Made percolate more modular, so that it is easier to add unit tests. * Added unit tests for the percolator. Closes #12664 Closes #13646 --- .../percolate/PercolateShardRequest.java | 8 +- .../percolate/PercolateShardResponse.java | 117 +-- .../percolate/TransportPercolateAction.java | 13 +- .../metadata/MetaDataIndexUpgradeService.java | 2 +- .../org/elasticsearch/index/IndexService.java | 2 +- .../index/mapper/DocumentMapperParser.java | 9 +- .../elasticsearch/index/mapper/Mapper.java | 15 +- .../index/mapper/MapperService.java | 11 +- .../percolator/ExtractQueryTermsService.java | 233 +++++ .../percolator/PercolatorFieldMapper.java | 150 ++++ .../percolator/PercolatorQueriesRegistry.java | 53 +- .../percolator/QueriesLoaderCollector.java | 40 +- .../elasticsearch/index/shard/IndexShard.java | 2 +- .../elasticsearch/indices/IndicesModule.java | 2 + .../MultiDocumentPercolatorIndex.java | 18 +- .../percolator/PercolateContext.java | 43 +- .../percolator/PercolateDocumentParser.java | 224 +++++ .../percolator/PercolatorModule.java | 1 + .../percolator/PercolatorQuery.java | 250 ++++++ .../percolator/PercolatorService.java | 822 ++++-------------- .../percolator/QueryCollector.java | 403 --------- .../elasticsearch/index/codec/CodecTests.java | 2 +- .../index/engine/InternalEngineTests.java | 2 +- .../SimpleExternalMappingTests.java | 6 +- .../internal/FieldNamesFieldMapperTests.java | 4 +- .../ExtractQueryTermsServiceTests.java | 287 ++++++ .../PercolatorFieldMapperTests.java | 95 ++ .../index/query/AbstractQueryTestCase.java | 2 +- .../percolator/ConcurrentPercolatorIT.java | 14 +- .../percolator/MultiPercolatorIT.java | 19 +- .../PercolateDocumentParserTests.java | 196 +++++ ...sIT.java => PercolatorAggregationsIT.java} | 32 +- .../PercolatorBackwardsCompatibilityIT.java | 120 ++- .../percolator/PercolatorIT.java | 95 +- .../percolator/PercolatorQueryTests.java | 258 ++++++ .../percolator/PercolatorServiceTests.java | 176 ++++ .../percolator/RecoveryPercolatorIT.java | 8 +- .../percolator/TTLPercolatorIT.java | 2 +- .../indices/percolator/bwc_index_2.0.0.zip | Bin 0 -> 9772 bytes docs/reference/migration/migrate_3_0.asciidoc | 16 + docs/reference/search/percolate.asciidoc | 17 +- .../messy/tests/TemplateQueryParserTests.java | 2 +- .../murmur3/Murmur3FieldMapperTests.java | 6 +- .../index/mapper/size/SizeMappingTests.java | 4 +- .../test/mpercolate/10_basic.yaml | 6 +- test/framework/build.gradle | 1 + .../elasticsearch/index/MapperTestUtils.java | 3 +- 47 files changed, 2412 insertions(+), 1379 deletions(-) create mode 100644 core/src/main/java/org/elasticsearch/index/percolator/ExtractQueryTermsService.java create mode 100644 core/src/main/java/org/elasticsearch/index/percolator/PercolatorFieldMapper.java create mode 100644 core/src/main/java/org/elasticsearch/percolator/PercolateDocumentParser.java create mode 100644 core/src/main/java/org/elasticsearch/percolator/PercolatorQuery.java delete mode 100644 core/src/main/java/org/elasticsearch/percolator/QueryCollector.java create mode 100644 core/src/test/java/org/elasticsearch/index/percolator/ExtractQueryTermsServiceTests.java create mode 100644 core/src/test/java/org/elasticsearch/index/percolator/PercolatorFieldMapperTests.java create mode 100644 core/src/test/java/org/elasticsearch/percolator/PercolateDocumentParserTests.java rename core/src/test/java/org/elasticsearch/percolator/{PercolatorFacetsAndAggregationsIT.java => PercolatorAggregationsIT.java} (93%) create mode 100644 core/src/test/java/org/elasticsearch/percolator/PercolatorQueryTests.java create mode 100644 core/src/test/java/org/elasticsearch/percolator/PercolatorServiceTests.java create mode 100644 core/src/test/resources/indices/percolator/bwc_index_2.0.0.zip diff --git a/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardRequest.java b/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardRequest.java index cdd967a6412..1e880505b97 100644 --- a/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardRequest.java +++ b/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardRequest.java @@ -52,7 +52,7 @@ public class PercolateShardRequest extends BroadcastShardRequest { this.startTime = request.startTime; } - PercolateShardRequest(ShardId shardId, OriginalIndices originalIndices) { + public PercolateShardRequest(ShardId shardId, OriginalIndices originalIndices) { super(shardId, originalIndices); } @@ -81,15 +81,15 @@ public class PercolateShardRequest extends BroadcastShardRequest { return onlyCount; } - void documentType(String documentType) { + public void documentType(String documentType) { this.documentType = documentType; } - void source(BytesReference source) { + public void source(BytesReference source) { this.source = source; } - void docSource(BytesReference docSource) { + public void docSource(BytesReference docSource) { this.docSource = docSource; } diff --git a/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardResponse.java b/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardResponse.java index 5416e2f66d7..1ca5e244962 100644 --- a/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardResponse.java +++ b/core/src/main/java/org/elasticsearch/action/percolate/PercolateShardResponse.java @@ -18,11 +18,12 @@ */ package org.elasticsearch.action.percolate; -import org.apache.lucene.util.BytesRef; +import org.apache.lucene.search.TopDocs; import org.elasticsearch.action.support.broadcast.BroadcastShardResponse; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.percolator.PercolateContext; import org.elasticsearch.search.aggregations.InternalAggregations; @@ -43,31 +44,24 @@ import java.util.Map; */ public class PercolateShardResponse extends BroadcastShardResponse { - private static final BytesRef[] EMPTY_MATCHES = new BytesRef[0]; - private static final float[] EMPTY_SCORES = new float[0]; - private static final List> EMPTY_HL = Collections.emptyList(); - - private long count; - private float[] scores; - private BytesRef[] matches; - private List> hls; - private byte percolatorTypeId; + private TopDocs topDocs; + private Map ids; + private Map> hls; + private boolean onlyCount; private int requestedSize; private InternalAggregations aggregations; private List pipelineAggregators; PercolateShardResponse() { - hls = new ArrayList<>(); } - public PercolateShardResponse(BytesRef[] matches, List> hls, long count, float[] scores, PercolateContext context, ShardId shardId) { - super(shardId); - this.matches = matches; + public PercolateShardResponse(TopDocs topDocs, Map ids, Map> hls, PercolateContext context) { + super(new ShardId(context.shardTarget().getIndex(), context.shardTarget().getShardId())); + this.topDocs = topDocs; + this.ids = ids; this.hls = hls; - this.count = count; - this.scores = scores; - this.percolatorTypeId = context.percolatorTypeId; + this.onlyCount = context.isOnlyCount(); this.requestedSize = context.size(); QuerySearchResult result = context.queryResult(); if (result != null) { @@ -78,39 +72,25 @@ public class PercolateShardResponse extends BroadcastShardResponse { } } - public PercolateShardResponse(BytesRef[] matches, long count, float[] scores, PercolateContext context, ShardId shardId) { - this(matches, EMPTY_HL, count, scores, context, shardId); + public TopDocs topDocs() { + return topDocs; } - public PercolateShardResponse(BytesRef[] matches, List> hls, long count, PercolateContext context, ShardId shardId) { - this(matches, hls, count, EMPTY_SCORES, context, shardId); - } - - public PercolateShardResponse(long count, PercolateContext context, ShardId shardId) { - this(EMPTY_MATCHES, EMPTY_HL, count, EMPTY_SCORES, context, shardId); - } - - public PercolateShardResponse(PercolateContext context, ShardId shardId) { - this(EMPTY_MATCHES, EMPTY_HL, 0, EMPTY_SCORES, context, shardId); - } - - public BytesRef[] matches() { - return matches; - } - - public float[] scores() { - return scores; - } - - public long count() { - return count; + /** + * Returns per match the percolator query id. The key is the Lucene docId of the matching percolator query. + */ + public Map ids() { + return ids; } public int requestedSize() { return requestedSize; } - public List> hls() { + /** + * Returns per match the highlight snippets. The key is the Lucene docId of the matching percolator query. + */ + public Map> hls() { return hls; } @@ -122,36 +102,35 @@ public class PercolateShardResponse extends BroadcastShardResponse { return pipelineAggregators; } - public byte percolatorTypeId() { - return percolatorTypeId; + public boolean onlyCount() { + return onlyCount; } public boolean isEmpty() { - return percolatorTypeId == 0x00; + return topDocs.totalHits == 0; } @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); - percolatorTypeId = in.readByte(); + onlyCount = in.readBoolean(); requestedSize = in.readVInt(); - count = in.readVLong(); - matches = new BytesRef[in.readVInt()]; - for (int i = 0; i < matches.length; i++) { - matches[i] = in.readBytesRef(); - } - scores = new float[in.readVInt()]; - for (int i = 0; i < scores.length; i++) { - scores[i] = in.readFloat(); - } + topDocs = Lucene.readTopDocs(in); int size = in.readVInt(); + ids = new HashMap<>(size); for (int i = 0; i < size; i++) { + ids.put(in.readVInt(), in.readString()); + } + size = in.readVInt(); + hls = new HashMap<>(size); + for (int i = 0; i < size; i++) { + int docId = in.readVInt(); int mSize = in.readVInt(); Map fields = new HashMap<>(); for (int j = 0; j < mSize; j++) { fields.put(in.readString(), HighlightField.readHighlightField(in)); } - hls.add(fields); + hls.put(docId, fields); } aggregations = InternalAggregations.readOptionalAggregations(in); if (in.readBoolean()) { @@ -169,23 +148,21 @@ public class PercolateShardResponse extends BroadcastShardResponse { @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); - out.writeByte(percolatorTypeId); + out.writeBoolean(onlyCount); out.writeVLong(requestedSize); - out.writeVLong(count); - out.writeVInt(matches.length); - for (BytesRef match : matches) { - out.writeBytesRef(match); - } - out.writeVLong(scores.length); - for (float score : scores) { - out.writeFloat(score); + Lucene.writeTopDocs(out, topDocs); + out.writeVInt(ids.size()); + for (Map.Entry entry : ids.entrySet()) { + out.writeVInt(entry.getKey()); + out.writeString(entry.getValue()); } out.writeVInt(hls.size()); - for (Map hl : hls) { - out.writeVInt(hl.size()); - for (Map.Entry entry : hl.entrySet()) { - out.writeString(entry.getKey()); - entry.getValue().writeTo(out); + for (Map.Entry> entry1 : hls.entrySet()) { + out.writeVInt(entry1.getKey()); + out.writeVInt(entry1.getValue().size()); + for (Map.Entry entry2 : entry1.getValue().entrySet()) { + out.writeString(entry2.getKey()); + entry2.getValue().writeTo(out); } } out.writeOptionalStreamable(aggregations); diff --git a/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java b/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java index c808177e9fe..fdac839e143 100644 --- a/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java +++ b/core/src/main/java/org/elasticsearch/action/percolate/TransportPercolateAction.java @@ -18,6 +18,7 @@ */ package org.elasticsearch.action.percolate; +import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ShardOperationFailedException; import org.elasticsearch.action.get.GetRequest; @@ -43,6 +44,7 @@ import org.elasticsearch.percolator.PercolatorService; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -117,7 +119,7 @@ public class TransportPercolateAction extends TransportBroadcastAction shardResults = null; List shardFailures = null; - byte percolatorTypeId = 0x00; + boolean onlyCount = false; for (int i = 0; i < shardsResponses.length(); i++) { Object shardResponse = shardsResponses.get(i); if (shardResponse == null) { @@ -133,7 +135,7 @@ public class TransportPercolateAction extends TransportBroadcastAction(); } shardResults.add(percolateShardResponse); @@ -146,7 +148,12 @@ public class TransportPercolateAction extends TransportBroadcastAction null)) { for (ObjectCursor cursor : indexMetaData.getMappings().values()) { MappingMetaData mappingMetaData = cursor.value; mapperService.merge(mappingMetaData.type(), mappingMetaData.source(), false, false); diff --git a/core/src/main/java/org/elasticsearch/index/IndexService.java b/core/src/main/java/org/elasticsearch/index/IndexService.java index 100b8b7ae81..853a1234bdb 100644 --- a/core/src/main/java/org/elasticsearch/index/IndexService.java +++ b/core/src/main/java/org/elasticsearch/index/IndexService.java @@ -117,7 +117,7 @@ public final class IndexService extends AbstractIndexComponent implements IndexC this.indexSettings = indexSettings; this.analysisService = registry.build(indexSettings); this.similarityService = similarityService; - this.mapperService = new MapperService(indexSettings, analysisService, similarityService, mapperRegistry); + this.mapperService = new MapperService(indexSettings, analysisService, similarityService, mapperRegistry, IndexService.this::getQueryShardContext); this.indexFieldData = new IndexFieldDataService(indexSettings, nodeServicesProvider.getIndicesFieldDataCache(), nodeServicesProvider.getCircuitBreakerService(), mapperService); this.shardStoreDeleter = shardStoreDeleter; this.eventListener = eventListener; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java b/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java index f087e06e3c5..f95db850373 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java @@ -33,12 +33,14 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.analysis.AnalysisService; import org.elasticsearch.index.mapper.object.RootObjectMapper; +import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.similarity.SimilarityService; import org.elasticsearch.indices.mapper.MapperRegistry; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.function.Supplier; import static java.util.Collections.unmodifiableMap; import static org.elasticsearch.index.mapper.MapperBuilders.doc; @@ -49,6 +51,7 @@ public class DocumentMapperParser { final AnalysisService analysisService; private static final ESLogger logger = Loggers.getLogger(DocumentMapperParser.class); private final SimilarityService similarityService; + private final Supplier queryShardContextSupplier; private final RootObjectMapper.TypeParser rootObjectTypeParser = new RootObjectMapper.TypeParser(); @@ -59,18 +62,20 @@ public class DocumentMapperParser { private final Map rootTypeParsers; public DocumentMapperParser(IndexSettings indexSettings, MapperService mapperService, AnalysisService analysisService, - SimilarityService similarityService, MapperRegistry mapperRegistry) { + SimilarityService similarityService, MapperRegistry mapperRegistry, + Supplier queryShardContextSupplier) { this.parseFieldMatcher = new ParseFieldMatcher(indexSettings.getSettings()); this.mapperService = mapperService; this.analysisService = analysisService; this.similarityService = similarityService; + this.queryShardContextSupplier = queryShardContextSupplier; this.typeParsers = mapperRegistry.getMapperParsers(); this.rootTypeParsers = mapperRegistry.getMetadataMapperParsers(); indexVersionCreated = indexSettings.getIndexVersionCreated(); } public Mapper.TypeParser.ParserContext parserContext(String type) { - return new Mapper.TypeParser.ParserContext(type, analysisService, similarityService::getSimilarity, mapperService, typeParsers::get, indexVersionCreated, parseFieldMatcher); + return new Mapper.TypeParser.ParserContext(type, analysisService, similarityService::getSimilarity, mapperService, typeParsers::get, indexVersionCreated, parseFieldMatcher, queryShardContextSupplier.get()); } public DocumentMapper parse(@Nullable String type, CompressedXContent source) throws MapperParsingException { diff --git a/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java b/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java index ffdae90c436..4dd43db0517 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/Mapper.java @@ -26,6 +26,8 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.index.analysis.AnalysisService; +import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.similarity.SimilarityProvider; import java.util.Map; @@ -95,9 +97,11 @@ public abstract class Mapper implements ToXContent, Iterable { private final ParseFieldMatcher parseFieldMatcher; - public ParserContext(String type, AnalysisService analysisService, Function similarityLookupService, + private final QueryShardContext queryShardContext; + + public ParserContext(String type, AnalysisService analysisService, Function similarityLookupService, MapperService mapperService, Function typeParsers, - Version indexVersionCreated, ParseFieldMatcher parseFieldMatcher) { + Version indexVersionCreated, ParseFieldMatcher parseFieldMatcher, QueryShardContext queryShardContext) { this.type = type; this.analysisService = analysisService; this.similarityLookupService = similarityLookupService; @@ -105,6 +109,7 @@ public abstract class Mapper implements ToXContent, Iterable { this.typeParsers = typeParsers; this.indexVersionCreated = indexVersionCreated; this.parseFieldMatcher = parseFieldMatcher; + this.queryShardContext = queryShardContext; } public String type() { @@ -135,6 +140,10 @@ public abstract class Mapper implements ToXContent, Iterable { return parseFieldMatcher; } + public QueryShardContext queryShardContext() { + return queryShardContext; + } + public boolean isWithinMultiField() { return false; } protected Function typeParsers() { return typeParsers; } @@ -150,7 +159,7 @@ public abstract class Mapper implements ToXContent, Iterable { static class MultiFieldParserContext extends ParserContext { MultiFieldParserContext(ParserContext in) { - super(in.type(), in.analysisService, in.similarityLookupService(), in.mapperService(), in.typeParsers(), in.indexVersionCreated(), in.parseFieldMatcher()); + super(in.type(), in.analysisService, in.similarityLookupService(), in.mapperService(), in.typeParsers(), in.indexVersionCreated(), in.parseFieldMatcher(), in.queryShardContext()); } } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java b/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java index 3f76245aa8f..2ca42413568 100755 --- a/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java @@ -44,6 +44,7 @@ import org.elasticsearch.index.analysis.AnalysisService; import org.elasticsearch.index.mapper.Mapper.BuilderContext; import org.elasticsearch.index.mapper.internal.TypeFieldMapper; import org.elasticsearch.index.mapper.object.ObjectMapper; +import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.similarity.SimilarityService; import org.elasticsearch.indices.InvalidTypeNameException; import org.elasticsearch.indices.TypeMissingException; @@ -64,12 +65,12 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; import static java.util.Collections.unmodifiableMap; -import static java.util.Collections.unmodifiableSet; import static org.elasticsearch.common.collect.MapBuilder.newMapBuilder; /** @@ -116,11 +117,12 @@ public class MapperService extends AbstractIndexComponent implements Closeable { final MapperRegistry mapperRegistry; public MapperService(IndexSettings indexSettings, AnalysisService analysisService, - SimilarityService similarityService, MapperRegistry mapperRegistry) { + SimilarityService similarityService, MapperRegistry mapperRegistry, + Supplier queryShardContextSupplier) { super(indexSettings); this.analysisService = analysisService; this.fieldTypes = new FieldTypeLookup(); - this.documentParser = new DocumentMapperParser(indexSettings, this, analysisService, similarityService, mapperRegistry); + this.documentParser = new DocumentMapperParser(indexSettings, this, analysisService, similarityService, mapperRegistry, queryShardContextSupplier); this.indexAnalyzer = new MapperAnalyzerWrapper(analysisService.defaultIndexAnalyzer(), p -> p.indexAnalyzer()); this.searchAnalyzer = new MapperAnalyzerWrapper(analysisService.defaultSearchAnalyzer(), p -> p.searchAnalyzer()); this.searchQuoteAnalyzer = new MapperAnalyzerWrapper(analysisService.defaultSearchQuoteAnalyzer(), p -> p.searchQuoteAnalyzer()); @@ -131,8 +133,7 @@ public class MapperService extends AbstractIndexComponent implements Closeable { "\"_default_\":{\n" + "\"properties\" : {\n" + "\"query\" : {\n" + - "\"type\" : \"object\",\n" + - "\"enabled\" : false\n" + + "\"type\" : \"percolator\"\n" + "}\n" + "}\n" + "}\n" + diff --git a/core/src/main/java/org/elasticsearch/index/percolator/ExtractQueryTermsService.java b/core/src/main/java/org/elasticsearch/index/percolator/ExtractQueryTermsService.java new file mode 100644 index 00000000000..7dc6e51a759 --- /dev/null +++ b/core/src/main/java/org/elasticsearch/index/percolator/ExtractQueryTermsService.java @@ -0,0 +1,233 @@ +/* + * 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.percolator; + +import org.apache.lucene.document.Field; +import org.apache.lucene.document.FieldType; +import org.apache.lucene.index.Fields; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.MultiFields; +import org.apache.lucene.index.Term; +import org.apache.lucene.index.Terms; +import org.apache.lucene.index.TermsEnum; +import org.apache.lucene.queries.TermsQuery; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.BoostQuery; +import org.apache.lucene.search.ConstantScoreQuery; +import org.apache.lucene.search.PhraseQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.util.BytesRef; +import org.apache.lucene.util.BytesRefBuilder; +import org.elasticsearch.common.logging.support.LoggerMessageFormat; +import org.elasticsearch.index.mapper.ParseContext; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Utility to extract query terms from queries and create queries from documents. + */ +public final class ExtractQueryTermsService { + + private static final byte FIELD_VALUE_SEPARATOR = 0; // nul code point + + private ExtractQueryTermsService() { + } + + /** + * Extracts all terms from the specified query and adds it to the specified document. + * @param query The query to extract terms from + * @param document The document to add the extracted terms to + * @param queryTermsFieldField The field in the document holding the extracted terms + * @param unknownQueryField The field used to mark a document that not all query terms could be extracted. For example + * the query contained an unsupported query (e.g. WildcardQuery). + * @param fieldType The field type for the query metadata field + */ + public static void extractQueryTerms(Query query, ParseContext.Document document, String queryTermsFieldField, String unknownQueryField, FieldType fieldType) { + Set queryTerms; + try { + queryTerms = extractQueryTerms(query); + } catch (UnsupportedQueryException e) { + document.add(new Field(unknownQueryField, new BytesRef(), fieldType)); + return; + } + for (Term term : queryTerms) { + BytesRefBuilder builder = new BytesRefBuilder(); + builder.append(new BytesRef(term.field())); + builder.append(FIELD_VALUE_SEPARATOR); + builder.append(term.bytes()); + document.add(new Field(queryTermsFieldField, builder.toBytesRef(), fieldType)); + } + } + + /** + * Extracts all query terms from the provided query and adds it to specified list. + * + * From boolean query with no should clauses or phrase queries only the the longest term are selected, + * since that those terms are likely to be the rarest. Boolean query's must_not clauses are always ignored. + * + * If from part of the query, no query terms can be extracted then term extraction is stopped and + * an UnsupportedQueryException is thrown. + */ + static Set extractQueryTerms(Query query) { + // TODO: add support for the TermsQuery when it has methods to access the actual terms it encapsulates + // TODO: add support for span queries + if (query instanceof TermQuery) { + return Collections.singleton(((TermQuery) query).getTerm()); + } else if (query instanceof PhraseQuery) { + Term[] terms = ((PhraseQuery) query).getTerms(); + if (terms.length == 0) { + return Collections.emptySet(); + } + + // the longest term is likely to be the rarest, + // so from a performance perspective it makes sense to extract that + Term longestTerm = terms[0]; + for (Term term : terms) { + if (longestTerm.bytes().length < term.bytes().length) { + longestTerm = term; + } + } + return Collections.singleton(longestTerm); + } else if (query instanceof BooleanQuery) { + List clauses = ((BooleanQuery) query).clauses(); + boolean hasRequiredClauses = false; + for (BooleanClause clause : clauses) { + if (clause.isRequired()) { + hasRequiredClauses = true; + break; + } + } + if (hasRequiredClauses) { + Set bestClause = null; + for (BooleanClause clause : clauses) { + if (clause.isRequired() == false) { + // skip must_not clauses, we don't need to remember the things that do *not* match... + // skip should clauses, this bq has must clauses, so we don't need to remember should clauses, since they are completely optional. + continue; + } + + Set temp = extractQueryTerms(clause.getQuery()); + bestClause = selectTermListWithTheLongestShortestTerm(temp, bestClause); + } + if (bestClause != null) { + return bestClause; + } else { + return Collections.emptySet(); + } + } else { + Set terms = new HashSet<>(); + for (BooleanClause clause : clauses) { + if (clause.isProhibited()) { + // we don't need to remember the things that do *not* match... + continue; + } + terms.addAll(extractQueryTerms(clause.getQuery())); + } + return terms; + } + } else if (query instanceof ConstantScoreQuery) { + Query wrappedQuery = ((ConstantScoreQuery) query).getQuery(); + return extractQueryTerms(wrappedQuery); + } else if (query instanceof BoostQuery) { + Query wrappedQuery = ((BoostQuery) query).getQuery(); + return extractQueryTerms(wrappedQuery); + } else { + throw new UnsupportedQueryException(query); + } + } + + static Set selectTermListWithTheLongestShortestTerm(Set terms1, Set terms2) { + if (terms1 == null) { + return terms2; + } else if (terms2 == null) { + return terms1; + } else { + int terms1ShortestTerm = minTermLength(terms1); + int terms2ShortestTerm = minTermLength(terms2); + // keep the clause with longest terms, this likely to be rarest. + if (terms1ShortestTerm >= terms2ShortestTerm) { + return terms1; + } else { + return terms2; + } + } + } + + private static int minTermLength(Set terms) { + int min = Integer.MAX_VALUE; + for (Term term : terms) { + min = Math.min(min, term.bytes().length); + } + return min; + } + + /** + * Creates a boolean query with a should clause for each term on all fields of the specified index reader. + */ + public static Query createQueryTermsQuery(IndexReader indexReader, String queryMetadataField, String unknownQueryField) throws IOException { + List extractedTerms = new ArrayList<>(); + extractedTerms.add(new Term(unknownQueryField)); + Fields fields = MultiFields.getFields(indexReader); + for (String field : fields) { + Terms terms = fields.terms(field); + if (terms == null) { + continue; + } + + BytesRef fieldBr = new BytesRef(field); + TermsEnum tenum = terms.iterator(); + for (BytesRef term = tenum.next(); term != null ; term = tenum.next()) { + BytesRefBuilder builder = new BytesRefBuilder(); + builder.append(fieldBr); + builder.append(FIELD_VALUE_SEPARATOR); + builder.append(term); + extractedTerms.add(new Term(queryMetadataField, builder.toBytesRef())); + } + } + return new TermsQuery(extractedTerms); + } + + /** + * Exception indicating that none or some query terms couldn't extracted from a percolator query. + */ + public static class UnsupportedQueryException extends RuntimeException { + + private final Query unsupportedQuery; + + public UnsupportedQueryException(Query unsupportedQuery) { + super(LoggerMessageFormat.format("no query terms can be extracted from query [{}]", unsupportedQuery)); + this.unsupportedQuery = unsupportedQuery; + } + + /** + * The actual Lucene query that was unsupported and caused this exception to be thrown. + */ + public Query getUnsupportedQuery() { + return unsupportedQuery; + } + } + +} diff --git a/core/src/main/java/org/elasticsearch/index/percolator/PercolatorFieldMapper.java b/core/src/main/java/org/elasticsearch/index/percolator/PercolatorFieldMapper.java new file mode 100644 index 00000000000..9a57ea57764 --- /dev/null +++ b/core/src/main/java/org/elasticsearch/index/percolator/PercolatorFieldMapper.java @@ -0,0 +1,150 @@ +/* + * 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.percolator; + +import org.apache.lucene.document.Field; +import org.apache.lucene.index.DocValuesType; +import org.apache.lucene.index.IndexOptions; +import org.apache.lucene.search.Query; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.MappedFieldType; +import org.elasticsearch.index.mapper.Mapper; +import org.elasticsearch.index.mapper.MapperBuilders; +import org.elasticsearch.index.mapper.MapperParsingException; +import org.elasticsearch.index.mapper.ParseContext; +import org.elasticsearch.index.mapper.core.StringFieldMapper; +import org.elasticsearch.index.query.QueryShardContext; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class PercolatorFieldMapper extends FieldMapper { + + public static final String NAME = "query"; + public static final String CONTENT_TYPE = "percolator"; + public static final PercolatorFieldType FIELD_TYPE = new PercolatorFieldType(); + + private static final String EXTRACTED_TERMS_FIELD_NAME = "extracted_terms"; + private static final String UNKNOWN_QUERY_FIELD_NAME = "unknown_query"; + public static final String EXTRACTED_TERMS_FULL_FIELD_NAME = NAME + "." + EXTRACTED_TERMS_FIELD_NAME; + public static final String UNKNOWN_QUERY_FULL_FIELD_NAME = NAME + "." + UNKNOWN_QUERY_FIELD_NAME; + + public static class Builder extends FieldMapper.Builder { + + private final QueryShardContext queryShardContext; + + public Builder(QueryShardContext queryShardContext) { + super(NAME, FIELD_TYPE, FIELD_TYPE); + this.queryShardContext = queryShardContext; + } + + @Override + public PercolatorFieldMapper build(BuilderContext context) { + context.path().add(name); + StringFieldMapper extractedTermsField = createStringFieldBuilder(EXTRACTED_TERMS_FIELD_NAME).build(context); + StringFieldMapper unknownQueryField = createStringFieldBuilder(UNKNOWN_QUERY_FIELD_NAME).build(context); + context.path().remove(); + return new PercolatorFieldMapper(name(), fieldType, defaultFieldType, context.indexSettings(), multiFieldsBuilder.build(this, context), copyTo, queryShardContext, extractedTermsField, unknownQueryField); + } + + static StringFieldMapper.Builder createStringFieldBuilder(String name) { + StringFieldMapper.Builder queryMetaDataFieldBuilder = MapperBuilders.stringField(name); + queryMetaDataFieldBuilder.docValues(false); + queryMetaDataFieldBuilder.store(false); + queryMetaDataFieldBuilder.tokenized(false); + queryMetaDataFieldBuilder.indexOptions(IndexOptions.DOCS); + return queryMetaDataFieldBuilder; + } + } + + public static class TypeParser implements FieldMapper.TypeParser { + + @Override + public Builder parse(String name, Map node, ParserContext parserContext) throws MapperParsingException { + return new Builder(parserContext.queryShardContext()); + } + } + + public static final class PercolatorFieldType extends MappedFieldType { + + public PercolatorFieldType() { + setName(NAME); + setIndexOptions(IndexOptions.NONE); + setDocValuesType(DocValuesType.NONE); + setStored(false); + } + + public PercolatorFieldType(MappedFieldType ref) { + super(ref); + } + + @Override + public MappedFieldType clone() { + return new PercolatorFieldType(this); + } + + @Override + public String typeName() { + return CONTENT_TYPE; + } + } + + private final boolean mapUnmappedFieldAsString; + private final QueryShardContext queryShardContext; + private final StringFieldMapper queryTermsField; + private final StringFieldMapper unknownQueryField; + + public PercolatorFieldMapper(String simpleName, MappedFieldType fieldType, MappedFieldType defaultFieldType, Settings indexSettings, MultiFields multiFields, CopyTo copyTo, QueryShardContext queryShardContext, StringFieldMapper queryTermsField, StringFieldMapper unknownQueryField) { + super(simpleName, fieldType, defaultFieldType, indexSettings, multiFields, copyTo); + this.queryShardContext = queryShardContext; + this.queryTermsField = queryTermsField; + this.unknownQueryField = unknownQueryField; + this.mapUnmappedFieldAsString = indexSettings.getAsBoolean(PercolatorQueriesRegistry.MAP_UNMAPPED_FIELDS_AS_STRING, false); + } + + @Override + public Mapper parse(ParseContext context) throws IOException { + QueryShardContext queryShardContext = new QueryShardContext(this.queryShardContext); + Query query = PercolatorQueriesRegistry.parseQuery(queryShardContext, mapUnmappedFieldAsString, context.parser()); + if (context.flyweight() == false) { + ExtractQueryTermsService.extractQueryTerms(query, context.doc(), queryTermsField.name(), unknownQueryField.name(), queryTermsField.fieldType()); + } + return null; + } + + @Override + public Iterator iterator() { + return Arrays.asList(queryTermsField, unknownQueryField).iterator(); + } + + @Override + protected void parseCreateField(ParseContext context, List fields) throws IOException { + throw new UnsupportedOperationException("should not be invoked"); + } + + @Override + protected String contentType() { + return CONTENT_TYPE; + } + +} diff --git a/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java b/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java index de56e4f3242..143616b7084 100644 --- a/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java +++ b/core/src/main/java/org/elasticsearch/index/percolator/PercolatorQueriesRegistry.java @@ -31,17 +31,11 @@ import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.metrics.CounterMetric; import org.elasticsearch.common.metrics.MeanMetric; import org.elasticsearch.common.util.concurrent.ConcurrentCollections; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.engine.Engine; import org.elasticsearch.index.fielddata.IndexFieldDataService; -import org.elasticsearch.index.indexing.IndexingOperationListener; -import org.elasticsearch.index.indexing.ShardIndexingService; -import org.elasticsearch.index.mapper.DocumentMapper; -import org.elasticsearch.index.mapper.DocumentTypeListener; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.Uid; import org.elasticsearch.index.mapper.internal.TypeFieldMapper; @@ -56,7 +50,6 @@ import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; /** * Each shard will have a percolator registry even if there isn't a {@link PercolatorService#TYPE_NAME} document type in the index. @@ -67,12 +60,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent implements Closeable { - public final String MAP_UNMAPPED_FIELDS_AS_STRING = "index.percolator.map_unmapped_fields_as_string"; - - // This is a shard level service, but these below are index level service: - private final MapperService mapperService; - private final IndexFieldDataService indexFieldDataService; - + public final static String MAP_UNMAPPED_FIELDS_AS_STRING = "index.percolator.map_unmapped_fields_as_string"; private final ConcurrentMap percolateQueries = ConcurrentCollections.newConcurrentMapWithAggressiveConcurrency(); private final QueryShardContext queryShardContext; @@ -81,16 +69,13 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent private final CounterMetric currentMetric = new CounterMetric(); private final CounterMetric numberOfQueries = new CounterMetric(); - public PercolatorQueriesRegistry(ShardId shardId, IndexSettings indexSettings, MapperService mapperService, - QueryShardContext queryShardContext, IndexFieldDataService indexFieldDataService) { + public PercolatorQueriesRegistry(ShardId shardId, IndexSettings indexSettings, QueryShardContext queryShardContext) { super(shardId, indexSettings); - this.mapperService = mapperService; this.queryShardContext = queryShardContext; - this.indexFieldDataService = indexFieldDataService; this.mapUnmappedFieldsAsString = this.indexSettings.getSettings().getAsBoolean(MAP_UNMAPPED_FIELDS_AS_STRING, false); } - public ConcurrentMap percolateQueries() { + public ConcurrentMap getPercolateQueries() { return percolateQueries; } @@ -120,9 +105,7 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent } } - Query parsePercolatorDocument(String id, BytesReference source) { - String type = null; - BytesReference querySource = null; + public Query parsePercolatorDocument(String id, BytesReference source) { try (XContentParser sourceParser = XContentHelper.createParser(source)) { String currentFieldName = null; XContentParser.Token token = sourceParser.nextToken(); // move the START_OBJECT @@ -134,38 +117,21 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent currentFieldName = sourceParser.currentName(); } else if (token == XContentParser.Token.START_OBJECT) { if ("query".equals(currentFieldName)) { - if (type != null) { - return parseQuery(type, sourceParser); - } else { - XContentBuilder builder = XContentFactory.contentBuilder(sourceParser.contentType()); - builder.copyCurrentStructure(sourceParser); - querySource = builder.bytes(); - builder.close(); - } + return parseQuery(queryShardContext, mapUnmappedFieldsAsString, sourceParser); } else { sourceParser.skipChildren(); } } else if (token == XContentParser.Token.START_ARRAY) { sourceParser.skipChildren(); - } else if (token.isValue()) { - if ("type".equals(currentFieldName)) { - type = sourceParser.text(); - } } } - try (XContentParser queryParser = XContentHelper.createParser(querySource)) { - return parseQuery(type, queryParser); - } } catch (Exception e) { throw new PercolatorException(shardId().index(), "failed to parse query [" + id + "]", e); } + return null; } - private Query parseQuery(String type, XContentParser parser) { - String[] previousTypes = null; - if (type != null) { - previousTypes = QueryShardContext.setTypesWithPrevious(type); - } + public static Query parseQuery(QueryShardContext queryShardContext, boolean mapUnmappedFieldsAsString, XContentParser parser) { QueryShardContext context = new QueryShardContext(queryShardContext); try { context.reset(parser); @@ -187,9 +153,6 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent } catch (IOException e) { throw new ParsingException(parser.getTokenLocation(), "Failed to parse", e); } finally { - if (type != null) { - QueryShardContext.setTypes(previousTypes); - } context.reset(null); } } @@ -199,7 +162,7 @@ public final class PercolatorQueriesRegistry extends AbstractIndexShardComponent final int loadedQueries; try { Query query = new TermQuery(new Term(TypeFieldMapper.NAME, PercolatorService.TYPE_NAME)); - QueriesLoaderCollector queryCollector = new QueriesLoaderCollector(PercolatorQueriesRegistry.this, logger, mapperService, indexFieldDataService); + QueriesLoaderCollector queryCollector = new QueriesLoaderCollector(PercolatorQueriesRegistry.this, logger); IndexSearcher indexSearcher = new IndexSearcher(reader); indexSearcher.setQueryCache(null); indexSearcher.search(query, queryCollector); diff --git a/core/src/main/java/org/elasticsearch/index/percolator/QueriesLoaderCollector.java b/core/src/main/java/org/elasticsearch/index/percolator/QueriesLoaderCollector.java index c79c7d7da25..1bea43e4ea1 100644 --- a/core/src/main/java/org/elasticsearch/index/percolator/QueriesLoaderCollector.java +++ b/core/src/main/java/org/elasticsearch/index/percolator/QueriesLoaderCollector.java @@ -45,17 +45,13 @@ final class QueriesLoaderCollector extends SimpleCollector { private final Map queries = new HashMap<>(); private final FieldsVisitor fieldsVisitor = new FieldsVisitor(true); private final PercolatorQueriesRegistry percolator; - private final IndexFieldData uidFieldData; private final ESLogger logger; - private SortedBinaryDocValues uidValues; private LeafReader reader; - QueriesLoaderCollector(PercolatorQueriesRegistry percolator, ESLogger logger, MapperService mapperService, IndexFieldDataService indexFieldDataService) { + QueriesLoaderCollector(PercolatorQueriesRegistry percolator, ESLogger logger) { this.percolator = percolator; this.logger = logger; - final MappedFieldType uidMapper = mapperService.fullName(UidFieldMapper.NAME); - this.uidFieldData = indexFieldDataService.getForField(uidMapper); } public Map queries() { @@ -64,35 +60,27 @@ final class QueriesLoaderCollector extends SimpleCollector { @Override public void collect(int doc) throws IOException { - // the _source is the query + fieldsVisitor.reset(); + reader.document(doc, fieldsVisitor); + final Uid uid = fieldsVisitor.uid(); - uidValues.setDocument(doc); - if (uidValues.count() > 0) { - assert uidValues.count() == 1; - final BytesRef uid = uidValues.valueAt(0); - final BytesRef id = Uid.splitUidIntoTypeAndId(uid)[1]; - fieldsVisitor.reset(); - reader.document(doc, fieldsVisitor); - - try { - // id is only used for logging, if we fail we log the id in the catch statement - final Query parseQuery = percolator.parsePercolatorDocument(null, fieldsVisitor.source()); - if (parseQuery != null) { - queries.put(BytesRef.deepCopyOf(id), parseQuery); - } else { - logger.warn("failed to add query [{}] - parser returned null", id); - } - - } catch (Exception e) { - logger.warn("failed to add query [{}]", e, id.utf8ToString()); + try { + // id is only used for logging, if we fail we log the id in the catch statement + final Query parseQuery = percolator.parsePercolatorDocument(null, fieldsVisitor.source()); + if (parseQuery != null) { + queries.put(new BytesRef(uid.id()), parseQuery); + } else { + logger.warn("failed to add query [{}] - parser returned null", uid); } + + } catch (Exception e) { + logger.warn("failed to add query [{}]", e, uid); } } @Override protected void doSetNextReader(LeafReaderContext context) throws IOException { reader = context.reader(); - uidValues = uidFieldData.load(context).getBytesValues(); } @Override diff --git a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java index f5caa59c79b..54bd1cd8443 100644 --- a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -267,7 +267,7 @@ public class IndexShard extends AbstractIndexShardComponent { this.indexShardOperationCounter = new IndexShardOperationCounter(logger, shardId); this.provider = provider; this.searcherWrapper = indexSearcherWrapper; - this.percolatorQueriesRegistry = new PercolatorQueriesRegistry(shardId, indexSettings, mapperService, newQueryShardContext(), indexFieldDataService); + this.percolatorQueriesRegistry = new PercolatorQueriesRegistry(shardId, indexSettings, newQueryShardContext()); // We start up inactive active.set(false); } diff --git a/core/src/main/java/org/elasticsearch/indices/IndicesModule.java b/core/src/main/java/org/elasticsearch/indices/IndicesModule.java index ebeca4e235b..e5beb4ddbe0 100644 --- a/core/src/main/java/org/elasticsearch/indices/IndicesModule.java +++ b/core/src/main/java/org/elasticsearch/indices/IndicesModule.java @@ -56,6 +56,7 @@ import org.elasticsearch.index.mapper.internal.UidFieldMapper; import org.elasticsearch.index.mapper.internal.VersionFieldMapper; import org.elasticsearch.index.mapper.ip.IpFieldMapper; import org.elasticsearch.index.mapper.object.ObjectMapper; +import org.elasticsearch.index.percolator.PercolatorFieldMapper; import org.elasticsearch.index.query.BoolQueryParser; import org.elasticsearch.index.query.BoostingQueryParser; import org.elasticsearch.index.query.CommonTermsQueryParser; @@ -211,6 +212,7 @@ public class IndicesModule extends AbstractModule { registerMapper(ObjectMapper.NESTED_CONTENT_TYPE, new ObjectMapper.TypeParser()); registerMapper(CompletionFieldMapper.CONTENT_TYPE, new CompletionFieldMapper.TypeParser()); registerMapper(GeoPointFieldMapper.CONTENT_TYPE, new GeoPointFieldMapper.TypeParser()); + registerMapper(PercolatorFieldMapper.CONTENT_TYPE, new PercolatorFieldMapper.TypeParser()); if (ShapesAvailability.JTS_AVAILABLE && ShapesAvailability.SPATIAL4J_AVAILABLE) { registerMapper(GeoShapeFieldMapper.CONTENT_TYPE, new GeoShapeFieldMapper.TypeParser()); diff --git a/core/src/main/java/org/elasticsearch/percolator/MultiDocumentPercolatorIndex.java b/core/src/main/java/org/elasticsearch/percolator/MultiDocumentPercolatorIndex.java index e1488ef8cde..10eeec75cbc 100644 --- a/core/src/main/java/org/elasticsearch/percolator/MultiDocumentPercolatorIndex.java +++ b/core/src/main/java/org/elasticsearch/percolator/MultiDocumentPercolatorIndex.java @@ -29,9 +29,15 @@ import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.MultiReader; import org.apache.lucene.index.SlowCompositeReaderWrapper; import org.apache.lucene.index.memory.MemoryIndex; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.Collector; import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.Weight; import org.apache.lucene.util.CloseableThreadLocal; import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.index.engine.Engine; import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.ParsedDocument; @@ -76,7 +82,17 @@ class MultiDocumentPercolatorIndex implements PercolatorIndex { try { MultiReader mReader = new MultiReader(memoryIndices, true); LeafReader slowReader = SlowCompositeReaderWrapper.wrap(mReader); - final IndexSearcher slowSearcher = new IndexSearcher(slowReader); + final IndexSearcher slowSearcher = new IndexSearcher(slowReader) { + + @Override + public Weight createNormalizedWeight(Query query, boolean needsScores) throws IOException { + BooleanQuery.Builder bq = new BooleanQuery.Builder(); + bq.add(query, BooleanClause.Occur.MUST); + bq.add(Queries.newNestedFilter(), BooleanClause.Occur.MUST_NOT); + return super.createNormalizedWeight(bq.build(), needsScores); + } + + }; slowSearcher.setQueryCache(null); DocSearcher docSearcher = new DocSearcher(slowSearcher, rootDocMemoryIndex); context.initialize(docSearcher, parsedDocument); diff --git a/core/src/main/java/org/elasticsearch/percolator/PercolateContext.java b/core/src/main/java/org/elasticsearch/percolator/PercolateContext.java index 267ea7a50bf..7d4e18c3d37 100644 --- a/core/src/main/java/org/elasticsearch/percolator/PercolateContext.java +++ b/core/src/main/java/org/elasticsearch/percolator/PercolateContext.java @@ -88,11 +88,7 @@ import java.util.concurrent.ConcurrentMap; */ public class PercolateContext extends SearchContext { - private final PercolatorQueriesRegistry percolateQueryRegistry; - public boolean limit; - private int size; - public boolean doSort; - public byte percolatorTypeId; + private int size = 10; private boolean trackScores; private final SearchShardTarget searchShardTarget; @@ -102,10 +98,12 @@ public class PercolateContext extends SearchContext { private final PageCacheRecycler pageCacheRecycler; private final BigArrays bigArrays; private final ScriptService scriptService; + private final MapperService mapperService; private final int numberOfShards; private final Query aliasFilter; private final long originNanoTime = System.nanoTime(); private final long startTime; + private final boolean onlyCount; private String[] types; private Engine.Searcher docSearcher; @@ -131,8 +129,8 @@ public class PercolateContext extends SearchContext { this.indexShard = indexShard; this.indexService = indexService; this.fieldDataService = indexService.fieldData(); + this.mapperService = indexService.mapperService(); this.searchShardTarget = searchShardTarget; - this.percolateQueryRegistry = indexShard.percolateRegistry(); this.types = new String[]{request.documentType()}; this.pageCacheRecycler = pageCacheRecycler; this.bigArrays = bigArrays.withCircuitBreaking(); @@ -143,6 +141,24 @@ public class PercolateContext extends SearchContext { this.numberOfShards = request.getNumberOfShards(); this.aliasFilter = aliasFilter; this.startTime = request.getStartTime(); + this.onlyCount = request.onlyCount(); + } + + // for testing: + PercolateContext(PercolateShardRequest request, SearchShardTarget searchShardTarget, MapperService mapperService) { + super(null, request); + this.searchShardTarget = searchShardTarget; + this.mapperService = mapperService; + this.indexService = null; + this.indexShard = null; + this.fieldDataService = null; + this.pageCacheRecycler = null; + this.bigArrays = null; + this.scriptService = null; + this.aliasFilter = null; + this.startTime = 0; + this.numberOfShards = 0; + this.onlyCount = true; } public IndexSearcher docSearcher() { @@ -177,10 +193,6 @@ public class PercolateContext extends SearchContext { return indexService; } - public ConcurrentMap percolateQueries() { - return percolateQueryRegistry.percolateQueries(); - } - public Query percolateQuery() { return percolateQuery; } @@ -196,6 +208,14 @@ public class PercolateContext extends SearchContext { return hitContext; } + public boolean isOnlyCount() { + return onlyCount; + } + + public Query percolatorTypeFilter(){ + return indexService().mapperService().documentMapper(PercolatorService.TYPE_NAME).typeFilter(); + } + @Override public SearchContextHighlight highlight() { return highlight; @@ -230,7 +250,7 @@ public class PercolateContext extends SearchContext { @Override public MapperService mapperService() { - return indexService.mapperService(); + return mapperService; } @Override @@ -531,7 +551,6 @@ public class PercolateContext extends SearchContext { @Override public SearchContext size(int size) { this.size = size; - this.limit = true; return this; } diff --git a/core/src/main/java/org/elasticsearch/percolator/PercolateDocumentParser.java b/core/src/main/java/org/elasticsearch/percolator/PercolateDocumentParser.java new file mode 100644 index 00000000000..6733ebd0b3a --- /dev/null +++ b/core/src/main/java/org/elasticsearch/percolator/PercolateDocumentParser.java @@ -0,0 +1,224 @@ +/* + * 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.percolator; + +import org.apache.lucene.search.ConstantScoreQuery; +import org.apache.lucene.search.Query; +import org.elasticsearch.ElasticsearchParseException; +import org.elasticsearch.action.percolate.PercolateShardRequest; +import org.elasticsearch.cluster.action.index.MappingUpdatedAction; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.io.stream.BytesStreamOutput; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.mapper.DocumentMapperForType; +import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.index.mapper.ParsedDocument; +import org.elasticsearch.index.query.QueryShardContext; +import org.elasticsearch.search.SearchParseElement; +import org.elasticsearch.search.aggregations.AggregationPhase; +import org.elasticsearch.search.highlight.HighlightPhase; +import org.elasticsearch.search.sort.SortParseElement; + +import java.util.Map; + +import static org.elasticsearch.index.mapper.SourceToParse.source; + +public class PercolateDocumentParser { + + private final HighlightPhase highlightPhase; + private final SortParseElement sortParseElement; + private final AggregationPhase aggregationPhase; + private final MappingUpdatedAction mappingUpdatedAction; + + @Inject + public PercolateDocumentParser(HighlightPhase highlightPhase, SortParseElement sortParseElement, AggregationPhase aggregationPhase, MappingUpdatedAction mappingUpdatedAction) { + this.highlightPhase = highlightPhase; + this.sortParseElement = sortParseElement; + this.aggregationPhase = aggregationPhase; + this.mappingUpdatedAction = mappingUpdatedAction; + } + + public ParsedDocument parse(PercolateShardRequest request, PercolateContext context, MapperService mapperService, QueryShardContext queryShardContext) { + BytesReference source = request.source(); + if (source == null || source.length() == 0) { + if (request.docSource() != null && request.docSource().length() != 0) { + return parseFetchedDoc(context, request.docSource(), mapperService, request.shardId().getIndex(), request.documentType()); + } else { + return null; + } + } + + // TODO: combine all feature parse elements into one map + Map hlElements = highlightPhase.parseElements(); + Map aggregationElements = aggregationPhase.parseElements(); + + ParsedDocument doc = null; + // Some queries (function_score query when for decay functions) rely on a SearchContext being set: + // We switch types because this context needs to be in the context of the percolate queries in the shard and + // not the in memory percolate doc + String[] previousTypes = context.types(); + context.types(new String[]{PercolatorService.TYPE_NAME}); + try (XContentParser parser = XContentFactory.xContent(source).createParser(source);) { + String currentFieldName = null; + XContentParser.Token token; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + // we need to check the "doc" here, so the next token will be START_OBJECT which is + // the actual document starting + if ("doc".equals(currentFieldName)) { + if (doc != null) { + throw new ElasticsearchParseException("Either specify doc or get, not both"); + } + + DocumentMapperForType docMapper = mapperService.documentMapperWithAutoCreate(request.documentType()); + String index = context.shardTarget().index(); + doc = docMapper.getDocumentMapper().parse(source(parser).index(index).type(request.documentType()).flyweight(true)); + if (docMapper.getMapping() != null) { + doc.addDynamicMappingsUpdate(docMapper.getMapping()); + } + if (doc.dynamicMappingsUpdate() != null) { + mappingUpdatedAction.updateMappingOnMasterSynchronously(request.shardId().getIndex(), request.documentType(), doc.dynamicMappingsUpdate()); + } + // the document parsing exists the "doc" object, so we need to set the new current field. + currentFieldName = parser.currentName(); + } + } else if (token == XContentParser.Token.START_OBJECT) { + SearchParseElement element = hlElements.get(currentFieldName); + if (element == null) { + element = aggregationElements.get(currentFieldName); + } + + if ("query".equals(currentFieldName)) { + if (context.percolateQuery() != null) { + throw new ElasticsearchParseException("Either specify query or filter, not both"); + } + context.percolateQuery(queryShardContext.parse(parser).query()); + } else if ("filter".equals(currentFieldName)) { + if (context.percolateQuery() != null) { + throw new ElasticsearchParseException("Either specify query or filter, not both"); + } + Query filter = queryShardContext.parseInnerFilter(parser).query(); + context.percolateQuery(new ConstantScoreQuery(filter)); + } else if ("sort".equals(currentFieldName)) { + parseSort(parser, context); + } else if (element != null) { + element.parse(parser, context); + } + } else if (token == XContentParser.Token.START_ARRAY) { + if ("sort".equals(currentFieldName)) { + parseSort(parser, context); + } + } else if (token == null) { + break; + } else if (token.isValue()) { + if ("size".equals(currentFieldName)) { + context.size(parser.intValue()); + if (context.size() < 0) { + throw new ElasticsearchParseException("size is set to [{}] and is expected to be higher or equal to 0", context.size()); + } + } else if ("sort".equals(currentFieldName)) { + parseSort(parser, context); + } else if ("track_scores".equals(currentFieldName) || "trackScores".equals(currentFieldName)) { + context.trackScores(parser.booleanValue()); + } + } + } + + // We need to get the actual source from the request body for highlighting, so parse the request body again + // and only get the doc source. + if (context.highlight() != null) { + parser.close(); + currentFieldName = null; + try (XContentParser parserForHighlighter = XContentFactory.xContent(source).createParser(source)) { + token = parserForHighlighter.nextToken(); + assert token == XContentParser.Token.START_OBJECT; + while ((token = parserForHighlighter.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parserForHighlighter.currentName(); + } else if (token == XContentParser.Token.START_OBJECT) { + if ("doc".equals(currentFieldName)) { + BytesStreamOutput bStream = new BytesStreamOutput(); + XContentBuilder builder = XContentFactory.contentBuilder(XContentType.SMILE, bStream); + builder.copyCurrentStructure(parserForHighlighter); + builder.close(); + doc.setSource(bStream.bytes()); + break; + } else { + parserForHighlighter.skipChildren(); + } + } else if (token == null) { + break; + } + } + } + } + + } catch (Throwable e) { + throw new ElasticsearchParseException("failed to parse request", e); + } finally { + context.types(previousTypes); + } + + if (request.docSource() != null && request.docSource().length() != 0) { + if (doc != null) { + throw new IllegalArgumentException("Can't specify the document to percolate in the source of the request and as document id"); + } + + doc = parseFetchedDoc(context, request.docSource(), mapperService, request.shardId().getIndex(), request.documentType()); + } + + if (doc == null) { + throw new IllegalArgumentException("Nothing to percolate"); + } + + return doc; + } + + private void parseSort(XContentParser parser, PercolateContext context) throws Exception { + context.trackScores(true); + sortParseElement.parse(parser, context); + // null, means default sorting by relevancy + if (context.sort() != null) { + throw new ElasticsearchParseException("Only _score desc is supported"); + } + } + + private ParsedDocument parseFetchedDoc(PercolateContext context, BytesReference fetchedDoc, MapperService mapperService, String index, String type) { + try (XContentParser parser = XContentFactory.xContent(fetchedDoc).createParser(fetchedDoc)) { + DocumentMapperForType docMapper = mapperService.documentMapperWithAutoCreate(type); + ParsedDocument doc = docMapper.getDocumentMapper().parse(source(parser).index(index).type(type).flyweight(true)); + if (doc == null) { + throw new ElasticsearchParseException("No doc to percolate in the request"); + } + if (context.highlight() != null) { + doc.setSource(fetchedDoc); + } + return doc; + } catch (Throwable e) { + throw new ElasticsearchParseException("failed to parse request", e); + } + } + +} diff --git a/core/src/main/java/org/elasticsearch/percolator/PercolatorModule.java b/core/src/main/java/org/elasticsearch/percolator/PercolatorModule.java index fb18c467388..68b8db55e31 100644 --- a/core/src/main/java/org/elasticsearch/percolator/PercolatorModule.java +++ b/core/src/main/java/org/elasticsearch/percolator/PercolatorModule.java @@ -27,6 +27,7 @@ public class PercolatorModule extends AbstractModule { @Override protected void configure() { + bind(PercolateDocumentParser.class).asEagerSingleton(); bind(PercolatorService.class).asEagerSingleton(); } } diff --git a/core/src/main/java/org/elasticsearch/percolator/PercolatorQuery.java b/core/src/main/java/org/elasticsearch/percolator/PercolatorQuery.java new file mode 100644 index 00000000000..b3208b4133c --- /dev/null +++ b/core/src/main/java/org/elasticsearch/percolator/PercolatorQuery.java @@ -0,0 +1,250 @@ +/* + * 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.percolator; + +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.LeafReader; +import org.apache.lucene.index.LeafReaderContext; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.DocIdSetIterator; +import org.apache.lucene.search.Explanation; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.Scorer; +import org.apache.lucene.search.TwoPhaseIterator; +import org.apache.lucene.search.Weight; +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.common.lucene.Lucene; +import org.elasticsearch.index.fieldvisitor.SingleFieldsVisitor; +import org.elasticsearch.index.mapper.internal.UidFieldMapper; +import org.elasticsearch.index.percolator.ExtractQueryTermsService; + +import java.io.IOException; +import java.util.Map; +import java.util.Set; + +import static org.apache.lucene.search.BooleanClause.Occur.FILTER; +import static org.apache.lucene.search.BooleanClause.Occur.MUST; + +final class PercolatorQuery extends Query { + + public static final float MATCH_COST = + (1 << 14) // stored field access cost, approximated by the number of bytes in a block + + 1000; // cost of matching the query against the document, arbitrary as it would be really complex to estimate + + static class Builder { + + private final IndexSearcher percolatorIndexSearcher; + private final Map percolatorQueries; + + private Query percolateQuery; + private Query queriesMetaDataQuery; + private final Query percolateTypeQuery; + + /** + * @param percolatorIndexSearcher The index searcher on top of the in-memory index that holds the document being percolated + * @param percolatorQueries All the registered percolator queries + * @param percolateTypeQuery A query that identifies all document containing percolator queries + */ + Builder(IndexSearcher percolatorIndexSearcher, Map percolatorQueries, Query percolateTypeQuery) { + this.percolatorIndexSearcher = percolatorIndexSearcher; + this.percolatorQueries = percolatorQueries; + this.percolateTypeQuery = percolateTypeQuery; + } + + /** + * Optionally sets a query that reduces the number of queries to percolate based on custom metadata attached + * on the percolator documents. + */ + void setPercolateQuery(Query percolateQuery) { + this.percolateQuery = percolateQuery; + } + + /** + * Optionally sets a query that reduces the number of queries to percolate based on extracted terms from + * the document to be percolated. + * + * @param extractedTermsFieldName The name of the field to get the extracted terms from + * @param unknownQueryFieldname The field used to mark documents whose queries couldn't all get extracted + */ + void extractQueryTermsQuery(String extractedTermsFieldName, String unknownQueryFieldname) throws IOException { + this.queriesMetaDataQuery = ExtractQueryTermsService.createQueryTermsQuery(percolatorIndexSearcher.getIndexReader(), extractedTermsFieldName, unknownQueryFieldname); + } + + PercolatorQuery build() { + BooleanQuery.Builder builder = new BooleanQuery.Builder(); + builder.add(percolateTypeQuery, FILTER); + if (queriesMetaDataQuery != null) { + builder.add(queriesMetaDataQuery, FILTER); + } + if (percolateQuery != null){ + builder.add(percolateQuery, MUST); + } + return new PercolatorQuery(builder.build(), percolatorIndexSearcher, percolatorQueries); + } + + } + + private final Query percolatorQueriesQuery; + private final IndexSearcher percolatorIndexSearcher; + private final Map percolatorQueries; + + private PercolatorQuery(Query percolatorQueriesQuery, IndexSearcher percolatorIndexSearcher, Map percolatorQueries) { + this.percolatorQueriesQuery = percolatorQueriesQuery; + this.percolatorIndexSearcher = percolatorIndexSearcher; + this.percolatorQueries = percolatorQueries; + } + + @Override + public Query rewrite(IndexReader reader) throws IOException { + if (getBoost() != 1f) { + return super.rewrite(reader); + } + + Query rewritten = percolatorQueriesQuery.rewrite(reader); + if (rewritten != percolatorQueriesQuery) { + return new PercolatorQuery(rewritten, percolatorIndexSearcher, percolatorQueries); + } else { + return this; + } + } + + @Override + public Weight createWeight(IndexSearcher searcher, boolean needsScores) throws IOException { + final Weight innerWeight = percolatorQueriesQuery.createWeight(searcher, needsScores); + return new Weight(this) { + @Override + public void extractTerms(Set set) { + } + + @Override + public Explanation explain(LeafReaderContext leafReaderContext, int docId) throws IOException { + Scorer scorer = scorer(leafReaderContext); + if (scorer != null) { + int result = scorer.iterator().advance(docId); + if (result == docId) { + return Explanation.match(scorer.score(), "PercolatorQuery"); + } + } + return Explanation.noMatch("PercolatorQuery"); + } + + @Override + public float getValueForNormalization() throws IOException { + return innerWeight.getValueForNormalization(); + } + + @Override + public void normalize(float v, float v1) { + innerWeight.normalize(v, v1); + } + + @Override + public Scorer scorer(LeafReaderContext leafReaderContext) throws IOException { + final Scorer approximation = innerWeight.scorer(leafReaderContext); + if (approximation == null) { + return null; + } + + final LeafReader leafReader = leafReaderContext.reader(); + return new Scorer(this) { + + @Override + public DocIdSetIterator iterator() { + return TwoPhaseIterator.asDocIdSetIterator(twoPhaseIterator()); + } + + @Override + public TwoPhaseIterator twoPhaseIterator() { + return new TwoPhaseIterator(approximation.iterator()) { + @Override + public boolean matches() throws IOException { + return matchDocId(approximation.docID(), leafReader); + } + + @Override + public float matchCost() { + return MATCH_COST; + } + }; + } + + @Override + public float score() throws IOException { + return approximation.score(); + } + + @Override + public int freq() throws IOException { + return approximation.freq(); + } + + @Override + public int docID() { + return approximation.docID(); + } + + boolean matchDocId(int docId, LeafReader leafReader) throws IOException { + SingleFieldsVisitor singleFieldsVisitor = new SingleFieldsVisitor(UidFieldMapper.NAME); + leafReader.document(docId, singleFieldsVisitor); + BytesRef percolatorQueryId = new BytesRef(singleFieldsVisitor.uid().id()); + return matchQuery(percolatorQueryId); + } + }; + } + }; + } + + boolean matchQuery(BytesRef percolatorQueryId) throws IOException { + Query percolatorQuery = percolatorQueries.get(percolatorQueryId); + if (percolatorQuery != null) { + return Lucene.exists(percolatorIndexSearcher, percolatorQuery); + } else { + return false; + } + } + + private final Object instance = new Object(); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + + PercolatorQuery that = (PercolatorQuery) o; + + return instance.equals(that.instance); + + } + + @Override + public int hashCode() { + int result = super.hashCode(); + result = 31 * result + instance.hashCode(); + return result; + } + + @Override + public String toString(String s) { + return "PercolatorQuery{inner={" + percolatorQueriesQuery.toString(s) + "}}"; + } +} diff --git a/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java b/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java index 8cc691b866b..fd07d54a7d1 100644 --- a/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java +++ b/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java @@ -18,134 +18,110 @@ */ package org.elasticsearch.percolator; -import com.carrotsearch.hppc.IntObjectHashMap; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.ReaderUtil; import org.apache.lucene.index.memory.ExtendedMemoryIndex; import org.apache.lucene.index.memory.MemoryIndex; -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.ConstantScoreQuery; -import org.apache.lucene.search.MatchAllDocsQuery; +import org.apache.lucene.search.MultiCollector; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; +import org.apache.lucene.search.TopScoreDocCollector; +import org.apache.lucene.search.TotalHitCountCollector; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.CloseableThreadLocal; -import org.elasticsearch.ElasticsearchParseException; +import org.elasticsearch.Version; import org.elasticsearch.action.percolate.PercolateResponse; import org.elasticsearch.action.percolate.PercolateShardRequest; import org.elasticsearch.action.percolate.PercolateShardResponse; import org.elasticsearch.cache.recycler.PageCacheRecycler; import org.elasticsearch.cluster.ClusterService; -import org.elasticsearch.cluster.action.index.MappingUpdatedAction; +import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.common.HasContextAndHeaders; +import org.elasticsearch.common.Nullable; import org.elasticsearch.common.ParseFieldMatcher; -import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.unit.ByteSizeUnit; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.util.BigArrays; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.IndexService; -import org.elasticsearch.index.engine.Engine; -import org.elasticsearch.index.fielddata.IndexFieldData; -import org.elasticsearch.index.fielddata.SortedBinaryDocValues; -import org.elasticsearch.index.mapper.DocumentMapperForType; -import org.elasticsearch.index.mapper.MappedFieldType; -import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.index.fieldvisitor.SingleFieldsVisitor; import org.elasticsearch.index.mapper.ParsedDocument; -import org.elasticsearch.index.mapper.Uid; import org.elasticsearch.index.mapper.internal.UidFieldMapper; +import org.elasticsearch.index.percolator.PercolatorFieldMapper; import org.elasticsearch.index.percolator.PercolatorQueriesRegistry; import org.elasticsearch.index.query.ParsedQuery; -import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.indices.IndicesService; -import org.elasticsearch.percolator.QueryCollector.Count; -import org.elasticsearch.percolator.QueryCollector.Match; -import org.elasticsearch.percolator.QueryCollector.MatchAndScore; -import org.elasticsearch.percolator.QueryCollector.MatchAndSort; import org.elasticsearch.script.ScriptService; -import org.elasticsearch.search.SearchParseElement; import org.elasticsearch.search.SearchShardTarget; import org.elasticsearch.search.aggregations.AggregationPhase; +import org.elasticsearch.search.aggregations.Aggregator; +import org.elasticsearch.search.aggregations.BucketCollector; import org.elasticsearch.search.aggregations.InternalAggregation; -import org.elasticsearch.search.aggregations.InternalAggregation.ReduceContext; import org.elasticsearch.search.aggregations.InternalAggregations; +import org.elasticsearch.search.aggregations.bucket.global.GlobalAggregator; import org.elasticsearch.search.aggregations.pipeline.SiblingPipelineAggregator; +import org.elasticsearch.search.aggregations.support.AggregationContext; import org.elasticsearch.search.highlight.HighlightField; import org.elasticsearch.search.highlight.HighlightPhase; import org.elasticsearch.search.internal.SearchContext; -import org.elasticsearch.search.sort.SortParseElement; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import static org.elasticsearch.index.mapper.SourceToParse.source; -import static org.elasticsearch.percolator.QueryCollector.count; -import static org.elasticsearch.percolator.QueryCollector.match; -import static org.elasticsearch.percolator.QueryCollector.matchAndScore; +import static org.apache.lucene.search.BooleanClause.Occur.FILTER; +import static org.apache.lucene.search.BooleanClause.Occur.MUST; public class PercolatorService extends AbstractComponent { public final static float NO_SCORE = Float.NEGATIVE_INFINITY; public final static String TYPE_NAME = ".percolator"; - private final IndexNameExpressionResolver indexNameExpressionResolver; - private final IndicesService indicesService; - private final IntObjectHashMap percolatorTypes; - private final PageCacheRecycler pageCacheRecycler; private final BigArrays bigArrays; + private final ScriptService scriptService; + private final IndicesService indicesService; private final ClusterService clusterService; + private final HighlightPhase highlightPhase; + private final AggregationPhase aggregationPhase; + private final PageCacheRecycler pageCacheRecycler; + private final ParseFieldMatcher parseFieldMatcher; + private final CloseableThreadLocal cache; + private final IndexNameExpressionResolver indexNameExpressionResolver; + private final PercolateDocumentParser percolateDocumentParser; private final PercolatorIndex single; private final PercolatorIndex multi; - private final HighlightPhase highlightPhase; - private final AggregationPhase aggregationPhase; - private final SortParseElement sortParseElement; - private final ScriptService scriptService; - private final MappingUpdatedAction mappingUpdatedAction; - - private final CloseableThreadLocal cache; - - private final ParseFieldMatcher parseFieldMatcher; - @Inject public PercolatorService(Settings settings, IndexNameExpressionResolver indexNameExpressionResolver, IndicesService indicesService, PageCacheRecycler pageCacheRecycler, BigArrays bigArrays, HighlightPhase highlightPhase, ClusterService clusterService, AggregationPhase aggregationPhase, ScriptService scriptService, - MappingUpdatedAction mappingUpdatedAction) { + PercolateDocumentParser percolateDocumentParser) { super(settings); this.indexNameExpressionResolver = indexNameExpressionResolver; + this.percolateDocumentParser = percolateDocumentParser; this.parseFieldMatcher = new ParseFieldMatcher(settings); this.indicesService = indicesService; this.pageCacheRecycler = pageCacheRecycler; this.bigArrays = bigArrays; this.clusterService = clusterService; - this.highlightPhase = highlightPhase; - this.aggregationPhase = aggregationPhase; this.scriptService = scriptService; - this.mappingUpdatedAction = mappingUpdatedAction; - this.sortParseElement = new SortParseElement(); + this.aggregationPhase = aggregationPhase; + this.highlightPhase = highlightPhase; final long maxReuseBytes = settings.getAsBytesSize("indices.memory.memory_index.size_per_thread", new ByteSizeValue(1, ByteSizeUnit.MB)).bytes(); cache = new CloseableThreadLocal() { @@ -157,23 +133,41 @@ public class PercolatorService extends AbstractComponent { }; single = new SingleDocumentPercolatorIndex(cache); multi = new MultiDocumentPercolatorIndex(cache); - - percolatorTypes = new IntObjectHashMap<>(6); - percolatorTypes.put(countPercolator.id(), countPercolator); - percolatorTypes.put(queryCountPercolator.id(), queryCountPercolator); - percolatorTypes.put(matchPercolator.id(), matchPercolator); - percolatorTypes.put(queryPercolator.id(), queryPercolator); - percolatorTypes.put(scoringPercolator.id(), scoringPercolator); - percolatorTypes.put(topMatchingPercolator.id(), topMatchingPercolator); } + public ReduceResult reduce(boolean onlyCount, List shardResponses, HasContextAndHeaders headersContext) throws IOException { + if (onlyCount) { + long finalCount = 0; + for (PercolateShardResponse shardResponse : shardResponses) { + finalCount += shardResponse.topDocs().totalHits; + } - public ReduceResult reduce(byte percolatorTypeId, List shardResults, HasContextAndHeaders headersContext) { - PercolatorType percolatorType = percolatorTypes.get(percolatorTypeId); - return percolatorType.reduce(shardResults, headersContext); + InternalAggregations reducedAggregations = reduceAggregations(shardResponses, headersContext); + return new PercolatorService.ReduceResult(finalCount, reducedAggregations); + } else { + int requestedSize = shardResponses.get(0).requestedSize(); + TopDocs[] shardResults = new TopDocs[shardResponses.size()]; + long foundMatches = 0; + for (int i = 0; i < shardResults.length; i++) { + TopDocs shardResult = shardResponses.get(i).topDocs(); + foundMatches += shardResult.totalHits; + shardResults[i] = shardResult; + } + TopDocs merged = TopDocs.merge(requestedSize, shardResults); + PercolateResponse.Match[] matches = new PercolateResponse.Match[merged.scoreDocs.length]; + for (int i = 0; i < merged.scoreDocs.length; i++) { + ScoreDoc doc = merged.scoreDocs[i]; + PercolateShardResponse shardResponse = shardResponses.get(doc.shardIndex); + String id = shardResponse.ids().get(doc.doc); + Map hl = shardResponse.hls().get(doc.doc); + matches[i] = new PercolateResponse.Match(new Text(shardResponse.getIndex()), new Text(id), doc.score, hl); + } + InternalAggregations reducedAggregations = reduceAggregations(shardResponses, headersContext); + return new PercolatorService.ReduceResult(foundMatches, matches, reducedAggregations); + } } - public PercolateShardResponse percolate(PercolateShardRequest request) { + public PercolateShardResponse percolate(PercolateShardRequest request) throws IOException { IndexService percolateIndexService = indicesService.indexServiceSafe(request.shardId().getIndex()); IndexShard indexShard = percolateIndexService.getShard(request.shardId().id()); indexShard.readAllowed(); // check if we can read the shard... @@ -196,29 +190,11 @@ public class PercolatorService extends AbstractComponent { ); SearchContext.setCurrent(context); try { - ParsedDocument parsedDocument = parseRequest(indexShard, request, context, request.shardId().getIndex()); - if (context.percolateQueries().isEmpty()) { - return new PercolateShardResponse(context, request.shardId()); - } + ParsedDocument parsedDocument = percolateDocumentParser.parse(request, context, percolateIndexService.mapperService(), percolateIndexService.getQueryShardContext()); - if (request.docSource() != null && request.docSource().length() != 0) { - parsedDocument = parseFetchedDoc(context, request.docSource(), percolateIndexService, request.shardId().getIndex(), request.documentType()); - } else if (parsedDocument == null) { - throw new IllegalArgumentException("Nothing to percolate"); + if (context.searcher().getIndexReader().maxDoc() == 0) { + return new PercolateShardResponse(Lucene.EMPTY_TOP_DOCS, Collections.emptyMap(), Collections.emptyMap(), context); } - - if (context.percolateQuery() == null && (context.trackScores() || context.doSort || context.aggregations() != null) || context.aliasFilter() != null) { - context.percolateQuery(new MatchAllDocsQuery()); - } - - if (context.doSort && !context.limit) { - throw new IllegalArgumentException("Can't sort if size isn't specified"); - } - - if (context.highlight() != null && !context.limit) { - throw new IllegalArgumentException("Can't highlight if size isn't specified"); - } - if (context.size() < 0) { context.size(0); } @@ -232,23 +208,27 @@ public class PercolatorService extends AbstractComponent { } else { percolatorIndex = single; } - - PercolatorType action; - if (request.onlyCount()) { - action = context.percolateQuery() != null ? queryCountPercolator : countPercolator; - } else { - if (context.doSort) { - action = topMatchingPercolator; - } else if (context.percolateQuery() != null) { - action = context.trackScores() ? scoringPercolator : queryPercolator; - } else { - action = matchPercolator; - } - } - context.percolatorTypeId = action.id(); - percolatorIndex.prepare(context, parsedDocument); - return action.doPercolate(request, context, isNested); + + BucketCollector aggregatorCollector = null; + if (context.aggregations() != null) { + AggregationContext aggregationContext = new AggregationContext(context); + context.aggregations().aggregationContext(aggregationContext); + + Aggregator[] aggregators = context.aggregations().factories().createTopLevelAggregators(aggregationContext); + List aggregatorCollectors = new ArrayList<>(aggregators.length); + for (int i = 0; i < aggregators.length; i++) { + if (!(aggregators[i] instanceof GlobalAggregator)) { + Aggregator aggregator = aggregators[i]; + aggregatorCollectors.add(aggregator); + } + } + context.aggregations().aggregators(aggregators); + aggregatorCollector = BucketCollector.wrap(aggregatorCollectors); + aggregatorCollector.preCollection(); + } + PercolatorQueriesRegistry queriesRegistry = indexShard.percolateRegistry(); + return doPercolate(context, queriesRegistry, aggregationPhase, aggregatorCollector, highlightPhase); } finally { SearchContext.removeCurrent(); context.close(); @@ -256,566 +236,101 @@ public class PercolatorService extends AbstractComponent { } } - private ParsedDocument parseRequest(IndexShard shard, PercolateShardRequest request, PercolateContext context, String index) { - BytesReference source = request.source(); - if (source == null || source.length() == 0) { - return null; + // moved the core percolation logic to a pck protected method to make testing easier: + static PercolateShardResponse doPercolate(PercolateContext context, PercolatorQueriesRegistry queriesRegistry, AggregationPhase aggregationPhase, @Nullable BucketCollector aggregatorCollector, HighlightPhase highlightPhase) throws IOException { + PercolatorQuery.Builder builder = new PercolatorQuery.Builder(context.docSearcher(), queriesRegistry.getPercolateQueries(), context.percolatorTypeFilter()); + if (queriesRegistry.indexSettings().getSettings().getAsVersion(IndexMetaData.SETTING_VERSION_CREATED, null).onOrAfter(Version.V_3_0_0)) { + builder.extractQueryTermsQuery(PercolatorFieldMapper.EXTRACTED_TERMS_FULL_FIELD_NAME, PercolatorFieldMapper.UNKNOWN_QUERY_FULL_FIELD_NAME); } - - // TODO: combine all feature parse elements into one map - Map hlElements = highlightPhase.parseElements(); - Map aggregationElements = aggregationPhase.parseElements(); - - ParsedDocument doc = null; - XContentParser parser = null; - - // Some queries (function_score query when for decay functions) rely on a SearchContext being set: - // We switch types because this context needs to be in the context of the percolate queries in the shard and - // not the in memory percolate doc - String[] previousTypes = context.types(); - context.types(new String[]{TYPE_NAME}); - QueryShardContext queryShardContext = shard.getQueryShardContext(); - try { - parser = XContentFactory.xContent(source).createParser(source); - String currentFieldName = null; - XContentParser.Token token; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - // we need to check the "doc" here, so the next token will be START_OBJECT which is - // the actual document starting - if ("doc".equals(currentFieldName)) { - if (doc != null) { - throw new ElasticsearchParseException("Either specify doc or get, not both"); - } - - MapperService mapperService = shard.mapperService(); - DocumentMapperForType docMapper = mapperService.documentMapperWithAutoCreate(request.documentType()); - doc = docMapper.getDocumentMapper().parse(source(parser).index(index).type(request.documentType()).flyweight(true)); - if (docMapper.getMapping() != null) { - doc.addDynamicMappingsUpdate(docMapper.getMapping()); - } - if (doc.dynamicMappingsUpdate() != null) { - mappingUpdatedAction.updateMappingOnMasterSynchronously(request.shardId().getIndex(), request.documentType(), doc.dynamicMappingsUpdate()); - } - // the document parsing exists the "doc" object, so we need to set the new current field. - currentFieldName = parser.currentName(); - } - } else if (token == XContentParser.Token.START_OBJECT) { - SearchParseElement element = hlElements.get(currentFieldName); - if (element == null) { - element = aggregationElements.get(currentFieldName); - } - - if ("query".equals(currentFieldName)) { - if (context.percolateQuery() != null) { - throw new ElasticsearchParseException("Either specify query or filter, not both"); - } - context.percolateQuery(queryShardContext.parse(parser).query()); - } else if ("filter".equals(currentFieldName)) { - if (context.percolateQuery() != null) { - throw new ElasticsearchParseException("Either specify query or filter, not both"); - } - Query filter = queryShardContext.parseInnerFilter(parser).query(); - context.percolateQuery(new ConstantScoreQuery(filter)); - } else if ("sort".equals(currentFieldName)) { - parseSort(parser, context); - } else if (element != null) { - element.parse(parser, context); - } - } else if (token == XContentParser.Token.START_ARRAY) { - if ("sort".equals(currentFieldName)) { - parseSort(parser, context); - } - } else if (token == null) { - break; - } else if (token.isValue()) { - if ("size".equals(currentFieldName)) { - context.size(parser.intValue()); - if (context.size() < 0) { - throw new ElasticsearchParseException("size is set to [{}] and is expected to be higher or equal to 0", context.size()); - } - } else if ("sort".equals(currentFieldName)) { - parseSort(parser, context); - } else if ("track_scores".equals(currentFieldName) || "trackScores".equals(currentFieldName)) { - context.trackScores(parser.booleanValue()); - } - } + if (context.percolateQuery() != null || context.aliasFilter() != null) { + BooleanQuery.Builder bq = new BooleanQuery.Builder(); + if (context.percolateQuery() != null) { + bq.add(context.percolateQuery(), MUST); } - - // We need to get the actual source from the request body for highlighting, so parse the request body again - // and only get the doc source. - if (context.highlight() != null) { - parser.close(); - currentFieldName = null; - parser = XContentFactory.xContent(source).createParser(source); - token = parser.nextToken(); - assert token == XContentParser.Token.START_OBJECT; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (token == XContentParser.Token.START_OBJECT) { - if ("doc".equals(currentFieldName)) { - BytesStreamOutput bStream = new BytesStreamOutput(); - XContentBuilder builder = XContentFactory.contentBuilder(XContentType.SMILE, bStream); - builder.copyCurrentStructure(parser); - builder.close(); - doc.setSource(bStream.bytes()); - break; - } else { - parser.skipChildren(); - } - } else if (token == null) { - break; - } - } - } - - } catch (Throwable e) { - throw new ElasticsearchParseException("failed to parse request", e); - } finally { - context.types(previousTypes); - if (parser != null) { - parser.close(); + if (context.aliasFilter() != null) { + bq.add(context.aliasFilter(), FILTER); } + builder.setPercolateQuery(bq.build()); } + PercolatorQuery percolatorQuery = builder.build(); - return doc; - } - - private void parseSort(XContentParser parser, PercolateContext context) throws Exception { - sortParseElement.parse(parser, context); - // null, means default sorting by relevancy - if (context.sort() == null) { - context.doSort = true; + if (context.isOnlyCount()) { + TotalHitCountCollector collector = new TotalHitCountCollector(); + context.searcher().search(percolatorQuery, MultiCollector.wrap(collector, aggregatorCollector)); + if (aggregatorCollector != null) { + aggregatorCollector.postCollection(); + aggregationPhase.execute(context); + } + return new PercolateShardResponse(new TopDocs(collector.getTotalHits(), Lucene.EMPTY_SCORE_DOCS, 0f), Collections.emptyMap(), Collections.emptyMap(), context); } else { - throw new ElasticsearchParseException("Only _score desc is supported"); - } - } - - private ParsedDocument parseFetchedDoc(PercolateContext context, BytesReference fetchedDoc, IndexService documentIndexService, String index, String type) { - ParsedDocument doc = null; - XContentParser parser = null; - try { - parser = XContentFactory.xContent(fetchedDoc).createParser(fetchedDoc); - MapperService mapperService = documentIndexService.mapperService(); - DocumentMapperForType docMapper = mapperService.documentMapperWithAutoCreate(type); - doc = docMapper.getDocumentMapper().parse(source(parser).index(index).type(type).flyweight(true)); - - if (context.highlight() != null) { - doc.setSource(fetchedDoc); + int size = context.size(); + if (size > context.searcher().getIndexReader().maxDoc()) { + // prevent easy OOM if more than the total number of docs that exist is requested... + size = context.searcher().getIndexReader().maxDoc(); } - } catch (Throwable e) { - throw new ElasticsearchParseException("failed to parse request", e); - } finally { - if (parser != null) { - parser.close(); + TopScoreDocCollector collector = TopScoreDocCollector.create(size); + context.searcher().search(percolatorQuery, MultiCollector.wrap(collector, aggregatorCollector)); + if (aggregatorCollector != null) { + aggregatorCollector.postCollection(); + aggregationPhase.execute(context); } - } - if (doc == null) { - throw new ElasticsearchParseException("No doc to percolate in the request"); - } + TopDocs topDocs = collector.topDocs(); + Map ids = new HashMap<>(topDocs.scoreDocs.length); + Map> hls = new HashMap<>(topDocs.scoreDocs.length); + for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + if (context.trackScores() == false) { + // No sort or tracking scores was provided, so use special value to indicate to not show the scores: + scoreDoc.score = NO_SCORE; + } - return doc; + int segmentIdx = ReaderUtil.subIndex(scoreDoc.doc, context.searcher().getIndexReader().leaves()); + LeafReaderContext atomicReaderContext = context.searcher().getIndexReader().leaves().get(segmentIdx); + final int segmentDocId = scoreDoc.doc - atomicReaderContext.docBase; + SingleFieldsVisitor fieldsVisitor = new SingleFieldsVisitor(UidFieldMapper.NAME); + atomicReaderContext.reader().document(segmentDocId, fieldsVisitor); + String id = fieldsVisitor.uid().id(); + ids.put(scoreDoc.doc, id); + if (context.highlight() != null) { + Query query = queriesRegistry.getPercolateQueries().get(new BytesRef(id)); + context.parsedQuery(new ParsedQuery(query)); + context.hitContext().cache().clear(); + highlightPhase.hitExecute(context, context.hitContext()); + hls.put(scoreDoc.doc, context.hitContext().hit().getHighlightFields()); + } + } + return new PercolateShardResponse(topDocs, ids, hls, context); + } } public void close() { cache.close(); } - interface PercolatorType { - - // 0x00 is reserved for empty type. - byte id(); - - ReduceResult reduce(List shardResults, HasContextAndHeaders headersContext); - - PercolateShardResponse doPercolate(PercolateShardRequest request, PercolateContext context, boolean isNested); - - } - - private final PercolatorType countPercolator = new PercolatorType() { - - @Override - public byte id() { - return 0x01; + private InternalAggregations reduceAggregations(List shardResults, HasContextAndHeaders headersContext) { + if (shardResults.get(0).aggregations() == null) { + return null; } - @Override - public ReduceResult reduce(List shardResults, HasContextAndHeaders headersContext) { - long finalCount = 0; - for (PercolateShardResponse shardResponse : shardResults) { - finalCount += shardResponse.count(); - } - - assert !shardResults.isEmpty(); - InternalAggregations reducedAggregations = reduceAggregations(shardResults, headersContext); - return new ReduceResult(finalCount, reducedAggregations); + List aggregationsList = new ArrayList<>(shardResults.size()); + for (PercolateShardResponse shardResult : shardResults) { + aggregationsList.add(shardResult.aggregations()); } - - @Override - public PercolateShardResponse doPercolate(PercolateShardRequest request, PercolateContext context, boolean isNested) { - long count = 0; - for (Map.Entry entry : context.percolateQueries().entrySet()) { - try { - Query existsQuery = entry.getValue(); - if (isNested) { - existsQuery = new BooleanQuery.Builder() - .add(existsQuery, Occur.MUST) - .add(Queries.newNonNestedFilter(), Occur.FILTER) - .build(); - } - if (Lucene.exists(context.docSearcher(), existsQuery)) { - count ++; - } - } catch (Throwable e) { - logger.debug("[" + entry.getKey() + "] failed to execute query", e); - throw new PercolateException(context.indexShard().shardId(), "failed to execute", e); + InternalAggregations aggregations = InternalAggregations.reduce(aggregationsList, new InternalAggregation.ReduceContext(bigArrays, scriptService, headersContext)); + if (aggregations != null) { + List pipelineAggregators = shardResults.get(0).pipelineAggregators(); + if (pipelineAggregators != null) { + List newAggs = StreamSupport.stream(aggregations.spliterator(), false).map((p) -> { + return (InternalAggregation) p; + }).collect(Collectors.toList()); + for (SiblingPipelineAggregator pipelineAggregator : pipelineAggregators) { + InternalAggregation newAgg = pipelineAggregator.doReduce(new InternalAggregations(newAggs), new InternalAggregation.ReduceContext(bigArrays, scriptService, headersContext)); + newAggs.add(newAgg); } - } - return new PercolateShardResponse(count, context, request.shardId()); - } - - }; - - private final PercolatorType queryCountPercolator = new PercolatorType() { - - @Override - public byte id() { - return 0x02; - } - - @Override - public ReduceResult reduce(List shardResults, HasContextAndHeaders headersContext) { - return countPercolator.reduce(shardResults, headersContext); - } - - @Override - public PercolateShardResponse doPercolate(PercolateShardRequest request, PercolateContext context, boolean isNested) { - long count = 0; - Engine.Searcher percolatorSearcher = context.indexShard().acquireSearcher("percolate"); - try { - Count countCollector = count(logger, context, isNested); - queryBasedPercolating(percolatorSearcher, context, countCollector); - count = countCollector.counter(); - } catch (Throwable e) { - logger.warn("failed to execute", e); - } finally { - percolatorSearcher.close(); - } - return new PercolateShardResponse(count, context, request.shardId()); - } - - }; - - private final PercolatorType matchPercolator = new PercolatorType() { - - @Override - public byte id() { - return 0x03; - } - - @Override - public ReduceResult reduce(List shardResults, HasContextAndHeaders headersContext) { - long foundMatches = 0; - int numMatches = 0; - for (PercolateShardResponse response : shardResults) { - foundMatches += response.count(); - numMatches += response.matches().length; - } - int requestedSize = shardResults.get(0).requestedSize(); - - // Use a custom impl of AbstractBigArray for Object[]? - List finalMatches = new ArrayList<>(requestedSize == 0 ? numMatches : requestedSize); - outer: - for (PercolateShardResponse response : shardResults) { - Text index = new Text(response.getIndex()); - for (int i = 0; i < response.matches().length; i++) { - float score = response.scores().length == 0 ? NO_SCORE : response.scores()[i]; - Text match = new Text(new BytesArray(response.matches()[i])); - Map hl = response.hls().isEmpty() ? null : response.hls().get(i); - finalMatches.add(new PercolateResponse.Match(index, match, score, hl)); - if (requestedSize != 0 && finalMatches.size() == requestedSize) { - break outer; - } - } - } - - assert !shardResults.isEmpty(); - InternalAggregations reducedAggregations = reduceAggregations(shardResults, headersContext); - return new ReduceResult(foundMatches, finalMatches.toArray(new PercolateResponse.Match[finalMatches.size()]), reducedAggregations); - } - - @Override - public PercolateShardResponse doPercolate(PercolateShardRequest request, PercolateContext context, boolean isNested) { - long count = 0; - List matches = new ArrayList<>(); - List> hls = new ArrayList<>(); - - for (Map.Entry entry : context.percolateQueries().entrySet()) { - if (context.highlight() != null) { - context.parsedQuery(new ParsedQuery(entry.getValue())); - context.hitContext().cache().clear(); - } - try { - Query existsQuery = entry.getValue(); - if (isNested) { - existsQuery = new BooleanQuery.Builder() - .add(existsQuery, Occur.MUST) - .add(Queries.newNonNestedFilter(), Occur.FILTER) - .build(); - } - if (Lucene.exists(context.docSearcher(), existsQuery)) { - if (!context.limit || count < context.size()) { - matches.add(entry.getKey()); - if (context.highlight() != null) { - highlightPhase.hitExecute(context, context.hitContext()); - hls.add(context.hitContext().hit().getHighlightFields()); - } - } - count++; - } - } catch (Throwable e) { - logger.debug("[" + entry.getKey() + "] failed to execute query", e); - throw new PercolateException(context.indexShard().shardId(), "failed to execute", e); - } - } - - BytesRef[] finalMatches = matches.toArray(new BytesRef[matches.size()]); - return new PercolateShardResponse(finalMatches, hls, count, context, request.shardId()); - } - }; - - private final PercolatorType queryPercolator = new PercolatorType() { - - @Override - public byte id() { - return 0x04; - } - - @Override - public ReduceResult reduce(List shardResults, HasContextAndHeaders headersContext) { - return matchPercolator.reduce(shardResults, headersContext); - } - - @Override - public PercolateShardResponse doPercolate(PercolateShardRequest request, PercolateContext context, boolean isNested) { - Engine.Searcher percolatorSearcher = context.indexShard().acquireSearcher("percolate"); - try { - Match match = match(logger, context, highlightPhase, isNested); - queryBasedPercolating(percolatorSearcher, context, match); - List matches = match.matches(); - List> hls = match.hls(); - long count = match.counter(); - - BytesRef[] finalMatches = matches.toArray(new BytesRef[matches.size()]); - return new PercolateShardResponse(finalMatches, hls, count, context, request.shardId()); - } catch (Throwable e) { - logger.debug("failed to execute", e); - throw new PercolateException(context.indexShard().shardId(), "failed to execute", e); - } finally { - percolatorSearcher.close(); + aggregations = new InternalAggregations(newAggs); } } - }; - - private final PercolatorType scoringPercolator = new PercolatorType() { - - @Override - public byte id() { - return 0x05; - } - - @Override - public ReduceResult reduce(List shardResults, HasContextAndHeaders headersContext) { - return matchPercolator.reduce(shardResults, headersContext); - } - - @Override - public PercolateShardResponse doPercolate(PercolateShardRequest request, PercolateContext context, boolean isNested) { - Engine.Searcher percolatorSearcher = context.indexShard().acquireSearcher("percolate"); - try { - MatchAndScore matchAndScore = matchAndScore(logger, context, highlightPhase, isNested); - queryBasedPercolating(percolatorSearcher, context, matchAndScore); - List matches = matchAndScore.matches(); - List> hls = matchAndScore.hls(); - float[] scores = matchAndScore.scores().toArray(); - long count = matchAndScore.counter(); - - BytesRef[] finalMatches = matches.toArray(new BytesRef[matches.size()]); - return new PercolateShardResponse(finalMatches, hls, count, scores, context, request.shardId()); - } catch (Throwable e) { - logger.debug("failed to execute", e); - throw new PercolateException(context.indexShard().shardId(), "failed to execute", e); - } finally { - percolatorSearcher.close(); - } - } - }; - - private final PercolatorType topMatchingPercolator = new PercolatorType() { - - @Override - public byte id() { - return 0x06; - } - - @Override - public ReduceResult reduce(List shardResults, HasContextAndHeaders headersContext) { - long foundMatches = 0; - int nonEmptyResponses = 0; - int firstNonEmptyIndex = 0; - for (int i = 0; i < shardResults.size(); i++) { - PercolateShardResponse response = shardResults.get(i); - foundMatches += response.count(); - if (response.matches().length != 0) { - if (firstNonEmptyIndex == 0) { - firstNonEmptyIndex = i; - } - nonEmptyResponses++; - } - } - - int requestedSize = shardResults.get(0).requestedSize(); - - // Use a custom impl of AbstractBigArray for Object[]? - List finalMatches = new ArrayList<>(requestedSize); - if (nonEmptyResponses == 1) { - PercolateShardResponse response = shardResults.get(firstNonEmptyIndex); - Text index = new Text(response.getIndex()); - for (int i = 0; i < response.matches().length; i++) { - float score = response.scores().length == 0 ? Float.NaN : response.scores()[i]; - Text match = new Text(new BytesArray(response.matches()[i])); - if (!response.hls().isEmpty()) { - Map hl = response.hls().get(i); - finalMatches.add(new PercolateResponse.Match(index, match, score, hl)); - } else { - finalMatches.add(new PercolateResponse.Match(index, match, score)); - } - } - } else { - int[] slots = new int[shardResults.size()]; - while (true) { - float lowestScore = Float.NEGATIVE_INFINITY; - int requestIndex = -1; - int itemIndex = -1; - for (int i = 0; i < shardResults.size(); i++) { - int scoreIndex = slots[i]; - float[] scores = shardResults.get(i).scores(); - if (scoreIndex >= scores.length) { - continue; - } - - float score = scores[scoreIndex]; - int cmp = Float.compare(lowestScore, score); - // TODO: Maybe add a tie? - if (cmp < 0) { - requestIndex = i; - itemIndex = scoreIndex; - lowestScore = score; - } - } - - // This means the shard matches have been exhausted and we should bail - if (requestIndex == -1) { - break; - } - - slots[requestIndex]++; - - PercolateShardResponse shardResponse = shardResults.get(requestIndex); - Text index = new Text(shardResponse.getIndex()); - Text match = new Text(new BytesArray(shardResponse.matches()[itemIndex])); - float score = shardResponse.scores()[itemIndex]; - if (!shardResponse.hls().isEmpty()) { - Map hl = shardResponse.hls().get(itemIndex); - finalMatches.add(new PercolateResponse.Match(index, match, score, hl)); - } else { - finalMatches.add(new PercolateResponse.Match(index, match, score)); - } - if (finalMatches.size() == requestedSize) { - break; - } - } - } - - assert !shardResults.isEmpty(); - InternalAggregations reducedAggregations = reduceAggregations(shardResults, headersContext); - return new ReduceResult(foundMatches, finalMatches.toArray(new PercolateResponse.Match[finalMatches.size()]), reducedAggregations); - } - - @Override - public PercolateShardResponse doPercolate(PercolateShardRequest request, PercolateContext context, boolean isNested) { - Engine.Searcher percolatorSearcher = context.indexShard().acquireSearcher("percolate"); - try { - MatchAndSort matchAndSort = QueryCollector.matchAndSort(logger, context, isNested); - queryBasedPercolating(percolatorSearcher, context, matchAndSort); - TopDocs topDocs = matchAndSort.topDocs(); - long count = topDocs.totalHits; - List matches = new ArrayList<>(topDocs.scoreDocs.length); - float[] scores = new float[topDocs.scoreDocs.length]; - List> hls = null; - if (context.highlight() != null) { - hls = new ArrayList<>(topDocs.scoreDocs.length); - } - - final MappedFieldType uidMapper = context.mapperService().fullName(UidFieldMapper.NAME); - final IndexFieldData uidFieldData = context.fieldData().getForField(uidMapper); - int i = 0; - for (ScoreDoc scoreDoc : topDocs.scoreDocs) { - int segmentIdx = ReaderUtil.subIndex(scoreDoc.doc, percolatorSearcher.reader().leaves()); - LeafReaderContext atomicReaderContext = percolatorSearcher.reader().leaves().get(segmentIdx); - SortedBinaryDocValues values = uidFieldData.load(atomicReaderContext).getBytesValues(); - final int localDocId = scoreDoc.doc - atomicReaderContext.docBase; - values.setDocument(localDocId); - final int numValues = values.count(); - assert numValues == 1; - BytesRef bytes = Uid.splitUidIntoTypeAndId(values.valueAt(0))[1]; - matches.add(BytesRef.deepCopyOf(bytes)); - if (hls != null) { - Query query = context.percolateQueries().get(bytes); - context.parsedQuery(new ParsedQuery(query)); - context.hitContext().cache().clear(); - highlightPhase.hitExecute(context, context.hitContext()); - hls.add(i, context.hitContext().hit().getHighlightFields()); - } - scores[i++] = scoreDoc.score; - } - if (hls != null) { - return new PercolateShardResponse(matches.toArray(new BytesRef[matches.size()]), hls, count, scores, context, request.shardId()); - } else { - return new PercolateShardResponse(matches.toArray(new BytesRef[matches.size()]), count, scores, context, request.shardId()); - } - } catch (Throwable e) { - logger.debug("failed to execute", e); - throw new PercolateException(context.indexShard().shardId(), "failed to execute", e); - } finally { - percolatorSearcher.close(); - } - } - - }; - - private void queryBasedPercolating(Engine.Searcher percolatorSearcher, PercolateContext context, QueryCollector percolateCollector) throws IOException { - Query percolatorTypeFilter = context.indexService().mapperService().documentMapper(TYPE_NAME).typeFilter(); - - final Query filter; - if (context.aliasFilter() != null) { - BooleanQuery.Builder booleanFilter = new BooleanQuery.Builder(); - booleanFilter.add(context.aliasFilter(), BooleanClause.Occur.MUST); - booleanFilter.add(percolatorTypeFilter, BooleanClause.Occur.MUST); - filter = booleanFilter.build(); - } else { - filter = percolatorTypeFilter; - } - - Query query = Queries.filtered(context.percolateQuery(), filter); - percolatorSearcher.searcher().search(query, percolateCollector); - percolateCollector.aggregatorCollector.postCollection(); - if (context.aggregations() != null) { - aggregationPhase.execute(context); - } + return aggregations; } public final static class ReduceResult { @@ -849,32 +364,5 @@ public class PercolatorService extends AbstractComponent { } } - private InternalAggregations reduceAggregations(List shardResults, HasContextAndHeaders headersContext) { - if (shardResults.get(0).aggregations() == null) { - return null; - } - - List aggregationsList = new ArrayList<>(shardResults.size()); - for (PercolateShardResponse shardResult : shardResults) { - aggregationsList.add(shardResult.aggregations()); - } - InternalAggregations aggregations = InternalAggregations.reduce(aggregationsList, new ReduceContext(bigArrays, scriptService, - headersContext)); - if (aggregations != null) { - List pipelineAggregators = shardResults.get(0).pipelineAggregators(); - if (pipelineAggregators != null) { - List newAggs = StreamSupport.stream(aggregations.spliterator(), false).map((p) -> { - return (InternalAggregation) p; - }).collect(Collectors.toList()); - for (SiblingPipelineAggregator pipelineAggregator : pipelineAggregators) { - InternalAggregation newAgg = pipelineAggregator.doReduce(new InternalAggregations(newAggs), new ReduceContext( - bigArrays, scriptService, headersContext)); - newAggs.add(newAgg); - } - aggregations = new InternalAggregations(newAggs); - } - } - return aggregations; - } } diff --git a/core/src/main/java/org/elasticsearch/percolator/QueryCollector.java b/core/src/main/java/org/elasticsearch/percolator/QueryCollector.java deleted file mode 100644 index 828ff4f08e4..00000000000 --- a/core/src/main/java/org/elasticsearch/percolator/QueryCollector.java +++ /dev/null @@ -1,403 +0,0 @@ -/* - * 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.percolator; - -import com.carrotsearch.hppc.FloatArrayList; -import org.apache.lucene.index.LeafReaderContext; -import org.apache.lucene.search.BooleanClause.Occur; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.LeafCollector; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.Scorer; -import org.apache.lucene.search.SimpleCollector; -import org.apache.lucene.search.TopDocs; -import org.apache.lucene.search.TopScoreDocCollector; -import org.apache.lucene.util.BytesRef; -import org.elasticsearch.common.logging.ESLogger; -import org.elasticsearch.common.lucene.Lucene; -import org.elasticsearch.common.lucene.search.Queries; -import org.elasticsearch.index.fielddata.IndexFieldData; -import org.elasticsearch.index.fielddata.SortedBinaryDocValues; -import org.elasticsearch.index.mapper.MappedFieldType; -import org.elasticsearch.index.mapper.Uid; -import org.elasticsearch.index.mapper.internal.UidFieldMapper; -import org.elasticsearch.index.query.ParsedQuery; -import org.elasticsearch.search.aggregations.Aggregator; -import org.elasticsearch.search.aggregations.BucketCollector; -import org.elasticsearch.search.aggregations.bucket.global.GlobalAggregator; -import org.elasticsearch.search.aggregations.support.AggregationContext; -import org.elasticsearch.search.highlight.HighlightField; -import org.elasticsearch.search.highlight.HighlightPhase; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentMap; - -/** - */ -abstract class QueryCollector extends SimpleCollector { - - final IndexFieldData uidFieldData; - final IndexSearcher searcher; - final ConcurrentMap queries; - final ESLogger logger; - boolean isNestedDoc = false; - - BytesRef current; - - SortedBinaryDocValues values; - - final BucketCollector aggregatorCollector; - LeafCollector aggregatorLeafCollector; - - QueryCollector(ESLogger logger, PercolateContext context, boolean isNestedDoc) throws IOException { - this.logger = logger; - this.queries = context.percolateQueries(); - this.searcher = context.docSearcher(); - final MappedFieldType uidMapper = context.mapperService().fullName(UidFieldMapper.NAME); - this.uidFieldData = context.fieldData().getForField(uidMapper); - this.isNestedDoc = isNestedDoc; - - List aggregatorCollectors = new ArrayList<>(); - - if (context.aggregations() != null) { - AggregationContext aggregationContext = new AggregationContext(context); - context.aggregations().aggregationContext(aggregationContext); - - Aggregator[] aggregators = context.aggregations().factories().createTopLevelAggregators(aggregationContext); - for (int i = 0; i < aggregators.length; i++) { - if (!(aggregators[i] instanceof GlobalAggregator)) { - Aggregator aggregator = aggregators[i]; - aggregatorCollectors.add(aggregator); - } - } - context.aggregations().aggregators(aggregators); - } - aggregatorCollector = BucketCollector.wrap(aggregatorCollectors); - aggregatorCollector.preCollection(); - } - - public void postMatch(int doc) throws IOException { - aggregatorLeafCollector.collect(doc); - } - - @Override - public void setScorer(Scorer scorer) throws IOException { - aggregatorLeafCollector.setScorer(scorer); - } - - @Override - public boolean needsScores() { - return aggregatorCollector.needsScores(); - } - - @Override - public void doSetNextReader(LeafReaderContext context) throws IOException { - // we use the UID because id might not be indexed - values = uidFieldData.load(context).getBytesValues(); - aggregatorLeafCollector = aggregatorCollector.getLeafCollector(context); - } - - static Match match(ESLogger logger, PercolateContext context, HighlightPhase highlightPhase, boolean isNestedDoc) throws IOException { - return new Match(logger, context, highlightPhase, isNestedDoc); - } - - static Count count(ESLogger logger, PercolateContext context, boolean isNestedDoc) throws IOException { - return new Count(logger, context, isNestedDoc); - } - - static MatchAndScore matchAndScore(ESLogger logger, PercolateContext context, HighlightPhase highlightPhase, boolean isNestedDoc) throws IOException { - return new MatchAndScore(logger, context, highlightPhase, isNestedDoc); - } - - static MatchAndSort matchAndSort(ESLogger logger, PercolateContext context, boolean isNestedDoc) throws IOException { - return new MatchAndSort(logger, context, isNestedDoc); - } - - - protected final Query getQuery(int doc) { - values.setDocument(doc); - final int numValues = values.count(); - if (numValues == 0) { - return null; - } - assert numValues == 1; - current = Uid.splitUidIntoTypeAndId(values.valueAt(0))[1]; - return queries.get(current); - } - - - - final static class Match extends QueryCollector { - - final PercolateContext context; - final HighlightPhase highlightPhase; - - final List matches = new ArrayList<>(); - final List> hls = new ArrayList<>(); - final boolean limit; - final int size; - long counter = 0; - - Match(ESLogger logger, PercolateContext context, HighlightPhase highlightPhase, boolean isNestedDoc) throws IOException { - super(logger, context, isNestedDoc); - this.limit = context.limit; - this.size = context.size(); - this.context = context; - this.highlightPhase = highlightPhase; - } - - @Override - public void collect(int doc) throws IOException { - final Query query = getQuery(doc); - if (query == null) { - // log??? - return; - } - Query existsQuery = query; - if (isNestedDoc) { - existsQuery = new BooleanQuery.Builder() - .add(existsQuery, Occur.MUST) - .add(Queries.newNonNestedFilter(), Occur.FILTER) - .build(); - } - // run the query - try { - if (context.highlight() != null) { - context.parsedQuery(new ParsedQuery(query)); - context.hitContext().cache().clear(); - } - - if (Lucene.exists(searcher, existsQuery)) { - if (!limit || counter < size) { - matches.add(BytesRef.deepCopyOf(current)); - if (context.highlight() != null) { - highlightPhase.hitExecute(context, context.hitContext()); - hls.add(context.hitContext().hit().getHighlightFields()); - } - } - counter++; - postMatch(doc); - } - } catch (IOException e) { - logger.warn("[" + current.utf8ToString() + "] failed to execute query", e); - } - } - - long counter() { - return counter; - } - - List matches() { - return matches; - } - - List> hls() { - return hls; - } - } - - final static class MatchAndSort extends QueryCollector { - - private final TopScoreDocCollector topDocsCollector; - private LeafCollector topDocsLeafCollector; - - MatchAndSort(ESLogger logger, PercolateContext context, boolean isNestedDoc) throws IOException { - super(logger, context, isNestedDoc); - // TODO: Use TopFieldCollector.create(...) for ascending and descending scoring? - topDocsCollector = TopScoreDocCollector.create(context.size()); - } - - @Override - public boolean needsScores() { - return super.needsScores() || topDocsCollector.needsScores(); - } - - @Override - public void collect(int doc) throws IOException { - final Query query = getQuery(doc); - if (query == null) { - // log??? - return; - } - Query existsQuery = query; - if (isNestedDoc) { - existsQuery = new BooleanQuery.Builder() - .add(existsQuery, Occur.MUST) - .add(Queries.newNonNestedFilter(), Occur.FILTER) - .build(); - } - // run the query - try { - if (Lucene.exists(searcher, existsQuery)) { - topDocsLeafCollector.collect(doc); - postMatch(doc); - } - } catch (IOException e) { - logger.warn("[" + current.utf8ToString() + "] failed to execute query", e); - } - } - - @Override - public void doSetNextReader(LeafReaderContext context) throws IOException { - super.doSetNextReader(context); - topDocsLeafCollector = topDocsCollector.getLeafCollector(context); - } - - @Override - public void setScorer(Scorer scorer) throws IOException { - topDocsLeafCollector.setScorer(scorer); - } - - TopDocs topDocs() { - return topDocsCollector.topDocs(); - } - - } - - final static class MatchAndScore extends QueryCollector { - - final PercolateContext context; - final HighlightPhase highlightPhase; - - final List matches = new ArrayList<>(); - final List> hls = new ArrayList<>(); - // TODO: Use thread local in order to cache the scores lists? - final FloatArrayList scores = new FloatArrayList(); - final boolean limit; - final int size; - long counter = 0; - - private Scorer scorer; - - MatchAndScore(ESLogger logger, PercolateContext context, HighlightPhase highlightPhase, boolean isNestedDoc) throws IOException { - super(logger, context, isNestedDoc); - this.limit = context.limit; - this.size = context.size(); - this.context = context; - this.highlightPhase = highlightPhase; - } - - @Override - public boolean needsScores() { - return true; - } - - @Override - public void collect(int doc) throws IOException { - final Query query = getQuery(doc); - if (query == null) { - // log??? - return; - } - Query existsQuery = query; - if (isNestedDoc) { - existsQuery = new BooleanQuery.Builder() - .add(existsQuery, Occur.MUST) - .add(Queries.newNonNestedFilter(), Occur.FILTER) - .build(); - } - // run the query - try { - if (context.highlight() != null) { - context.parsedQuery(new ParsedQuery(query)); - context.hitContext().cache().clear(); - } - if (Lucene.exists(searcher, existsQuery)) { - if (!limit || counter < size) { - matches.add(BytesRef.deepCopyOf(current)); - scores.add(scorer.score()); - if (context.highlight() != null) { - highlightPhase.hitExecute(context, context.hitContext()); - hls.add(context.hitContext().hit().getHighlightFields()); - } - } - counter++; - postMatch(doc); - } - } catch (IOException e) { - logger.warn("[" + current.utf8ToString() + "] failed to execute query", e); - } - } - - @Override - public void setScorer(Scorer scorer) throws IOException { - this.scorer = scorer; - } - - long counter() { - return counter; - } - - List matches() { - return matches; - } - - FloatArrayList scores() { - return scores; - } - - List> hls() { - return hls; - } - } - - final static class Count extends QueryCollector { - - private long counter = 0; - - Count(ESLogger logger, PercolateContext context, boolean isNestedDoc) throws IOException { - super(logger, context, isNestedDoc); - } - - @Override - public void collect(int doc) throws IOException { - final Query query = getQuery(doc); - if (query == null) { - // log??? - return; - } - Query existsQuery = query; - if (isNestedDoc) { - existsQuery = new BooleanQuery.Builder() - .add(existsQuery, Occur.MUST) - .add(Queries.newNonNestedFilter(), Occur.FILTER) - .build(); - } - // run the query - try { - if (Lucene.exists(searcher, existsQuery)) { - counter++; - postMatch(doc); - } - } catch (IOException e) { - logger.warn("[" + current.utf8ToString() + "] failed to execute query", e); - } - } - - long counter() { - return counter; - } - - } - -} diff --git a/core/src/test/java/org/elasticsearch/index/codec/CodecTests.java b/core/src/test/java/org/elasticsearch/index/codec/CodecTests.java index eae80418b0d..03a87dec232 100644 --- a/core/src/test/java/org/elasticsearch/index/codec/CodecTests.java +++ b/core/src/test/java/org/elasticsearch/index/codec/CodecTests.java @@ -111,7 +111,7 @@ public class CodecTests extends ESTestCase { SimilarityService similarityService = new SimilarityService(settings, Collections.emptyMap()); AnalysisService analysisService = new AnalysisRegistry(null, new Environment(nodeSettings)).build(settings); MapperRegistry mapperRegistry = new MapperRegistry(Collections.emptyMap(), Collections.emptyMap()); - MapperService service = new MapperService(settings, analysisService, similarityService, mapperRegistry); + MapperService service = new MapperService(settings, analysisService, similarityService, mapperRegistry, () -> null); return new CodecService(service, ESLoggerFactory.getLogger("test")); } diff --git a/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java b/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java index 6905cc015b0..cc2d50b61ad 100644 --- a/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java +++ b/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java @@ -1928,7 +1928,7 @@ public class InternalEngineTests extends ESTestCase { AnalysisService analysisService = new AnalysisService(indexSettings, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap()); SimilarityService similarityService = new SimilarityService(indexSettings, Collections.emptyMap()); MapperRegistry mapperRegistry = new IndicesModule().getMapperRegistry(); - MapperService mapperService = new MapperService(indexSettings, analysisService, similarityService, mapperRegistry); + MapperService mapperService = new MapperService(indexSettings, analysisService, similarityService, mapperRegistry, () -> null); DocumentMapper.Builder b = new DocumentMapper.Builder(rootBuilder, mapperService); this.docMapper = b.build(mapperService); } diff --git a/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/SimpleExternalMappingTests.java b/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/SimpleExternalMappingTests.java index bf3196fdcf7..ba05ea81054 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/SimpleExternalMappingTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/externalvalues/SimpleExternalMappingTests.java @@ -55,7 +55,7 @@ public class SimpleExternalMappingTests extends ESSingleNodeTestCase { Collections.singletonMap(ExternalMetadataMapper.CONTENT_TYPE, new ExternalMetadataMapper.TypeParser())); DocumentMapperParser parser = new DocumentMapperParser(indexService.getIndexSettings(), indexService.mapperService(), - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); DocumentMapper documentMapper = parser.parse("type", new CompressedXContent( XContentFactory.jsonBuilder().startObject().startObject("type") .startObject(ExternalMetadataMapper.CONTENT_TYPE) @@ -101,7 +101,7 @@ public class SimpleExternalMappingTests extends ESSingleNodeTestCase { MapperRegistry mapperRegistry = new MapperRegistry(mapperParsers, Collections.emptyMap()); DocumentMapperParser parser = new DocumentMapperParser(indexService.getIndexSettings(), indexService.mapperService(), - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); DocumentMapper documentMapper = parser.parse("type", new CompressedXContent( XContentFactory.jsonBuilder().startObject().startObject("type").startObject("properties") @@ -160,7 +160,7 @@ public class SimpleExternalMappingTests extends ESSingleNodeTestCase { MapperRegistry mapperRegistry = new MapperRegistry(mapperParsers, Collections.emptyMap()); DocumentMapperParser parser = new DocumentMapperParser(indexService.getIndexSettings(), indexService.mapperService(), - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); DocumentMapper documentMapper = parser.parse("type", new CompressedXContent( XContentFactory.jsonBuilder().startObject().startObject("type").startObject("properties") diff --git a/core/src/test/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapperTests.java b/core/src/test/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapperTests.java index 6eb6dd75a68..2e28f60e7d9 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapperTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapperTests.java @@ -236,9 +236,9 @@ public class FieldNamesFieldMapperTests extends ESSingleNodeTestCase { IndicesModule indicesModule = new IndicesModule(); indicesModule.registerMetadataMapper("_dummy", new DummyMetadataFieldMapper.TypeParser()); final MapperRegistry mapperRegistry = indicesModule.getMapperRegistry(); - MapperService mapperService = new MapperService(indexService.getIndexSettings(), indexService.analysisService(), indexService.similarityService(), mapperRegistry); + MapperService mapperService = new MapperService(indexService.getIndexSettings(), indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); DocumentMapperParser parser = new DocumentMapperParser(indexService.getIndexSettings(), mapperService, - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); String mapping = XContentFactory.jsonBuilder().startObject().startObject("type").endObject().endObject().string(); DocumentMapper mapper = parser.parse("type", new CompressedXContent(mapping)); ParsedDocument parsedDocument = mapper.parse("index", "type", "id", new BytesArray("{}")); diff --git a/core/src/test/java/org/elasticsearch/index/percolator/ExtractQueryTermsServiceTests.java b/core/src/test/java/org/elasticsearch/index/percolator/ExtractQueryTermsServiceTests.java new file mode 100644 index 00000000000..f23ec6d9595 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/index/percolator/ExtractQueryTermsServiceTests.java @@ -0,0 +1,287 @@ +/* + * 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.percolator; + +import org.apache.lucene.analysis.core.WhitespaceAnalyzer; +import org.apache.lucene.document.FieldType; +import org.apache.lucene.index.IndexOptions; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.Term; +import org.apache.lucene.index.memory.MemoryIndex; +import org.apache.lucene.queries.TermsQuery; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.BoostQuery; +import org.apache.lucene.search.ConstantScoreQuery; +import org.apache.lucene.search.PhraseQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.TermRangeQuery; +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.index.mapper.ParseContext; +import org.elasticsearch.test.ESTestCase; + + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.Matchers.sameInstance; + +public class ExtractQueryTermsServiceTests extends ESTestCase { + + public final static String QUERY_TERMS_FIELD = "extracted_terms"; + public final static String UNKNOWN_QUERY_FIELD = "unknown_query"; + public static FieldType QUERY_TERMS_FIELD_TYPE = new FieldType(); + + static { + QUERY_TERMS_FIELD_TYPE.setTokenized(false); + QUERY_TERMS_FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); + QUERY_TERMS_FIELD_TYPE.freeze(); + } + + public void testExtractQueryMetadata() { + BooleanQuery.Builder bq = new BooleanQuery.Builder(); + TermQuery termQuery1 = new TermQuery(new Term("field1", "term1")); + bq.add(termQuery1, BooleanClause.Occur.SHOULD); + TermQuery termQuery2 = new TermQuery(new Term("field2", "term2")); + bq.add(termQuery2, BooleanClause.Occur.SHOULD); + + ParseContext.Document document = new ParseContext.Document(); + ExtractQueryTermsService.extractQueryTerms(bq.build(), document, QUERY_TERMS_FIELD, UNKNOWN_QUERY_FIELD, QUERY_TERMS_FIELD_TYPE); + Collections.sort(document.getFields(), (field1, field2) -> field1.binaryValue().compareTo(field2.binaryValue())); + assertThat(document.getFields().size(), equalTo(2)); + assertThat(document.getFields().get(0).name(), equalTo(QUERY_TERMS_FIELD)); + assertThat(document.getFields().get(0).binaryValue().utf8ToString(), equalTo("field1\u0000term1")); + assertThat(document.getFields().get(1).name(), equalTo(QUERY_TERMS_FIELD)); + assertThat(document.getFields().get(1).binaryValue().utf8ToString(), equalTo("field2\u0000term2")); + } + + public void testExtractQueryMetadata_unsupported() { + BooleanQuery.Builder bq = new BooleanQuery.Builder(); + TermQuery termQuery1 = new TermQuery(new Term("field1", "term1")); + bq.add(termQuery1, BooleanClause.Occur.SHOULD); + TermQuery termQuery2 = new TermQuery(new Term("field2", "term2")); + bq.add(termQuery2, BooleanClause.Occur.SHOULD); + + TermRangeQuery query = new TermRangeQuery("field1", new BytesRef("a"), new BytesRef("z"), true, true); + ParseContext.Document document = new ParseContext.Document(); + ExtractQueryTermsService.extractQueryTerms(query, document, QUERY_TERMS_FIELD, UNKNOWN_QUERY_FIELD, QUERY_TERMS_FIELD_TYPE); + assertThat(document.getFields().size(), equalTo(1)); + assertThat(document.getFields().get(0).name(), equalTo(UNKNOWN_QUERY_FIELD)); + assertThat(document.getFields().get(0).binaryValue().utf8ToString(), equalTo("")); + } + + public void testExtractQueryMetadata_termQuery() { + TermQuery termQuery = new TermQuery(new Term("_field", "_term")); + List terms = new ArrayList<>(ExtractQueryTermsService.extractQueryTerms(termQuery)); + assertThat(terms.size(), equalTo(1)); + assertThat(terms.get(0).field(), equalTo(termQuery.getTerm().field())); + assertThat(terms.get(0).bytes(), equalTo(termQuery.getTerm().bytes())); + } + + public void testExtractQueryMetadata_phraseQuery() { + PhraseQuery phraseQuery = new PhraseQuery("_field", "_term1", "term2"); + List terms = new ArrayList<>(ExtractQueryTermsService.extractQueryTerms(phraseQuery)); + assertThat(terms.size(), equalTo(1)); + assertThat(terms.get(0).field(), equalTo(phraseQuery.getTerms()[0].field())); + assertThat(terms.get(0).bytes(), equalTo(phraseQuery.getTerms()[0].bytes())); + } + + public void testExtractQueryMetadata_booleanQuery() { + BooleanQuery.Builder builder = new BooleanQuery.Builder(); + TermQuery termQuery1 = new TermQuery(new Term("_field", "_term")); + builder.add(termQuery1, BooleanClause.Occur.SHOULD); + PhraseQuery phraseQuery = new PhraseQuery("_field", "_term1", "term2"); + builder.add(phraseQuery, BooleanClause.Occur.SHOULD); + + BooleanQuery.Builder subBuilder = new BooleanQuery.Builder(); + TermQuery termQuery2 = new TermQuery(new Term("_field1", "_term")); + subBuilder.add(termQuery2, BooleanClause.Occur.MUST); + TermQuery termQuery3 = new TermQuery(new Term("_field3", "_long_term")); + subBuilder.add(termQuery3, BooleanClause.Occur.MUST); + builder.add(subBuilder.build(), BooleanClause.Occur.SHOULD); + + BooleanQuery booleanQuery = builder.build(); + List terms = new ArrayList<>(ExtractQueryTermsService.extractQueryTerms(booleanQuery)); + Collections.sort(terms); + assertThat(terms.size(), equalTo(3)); + assertThat(terms.get(0).field(), equalTo(termQuery1.getTerm().field())); + assertThat(terms.get(0).bytes(), equalTo(termQuery1.getTerm().bytes())); + assertThat(terms.get(1).field(), equalTo(phraseQuery.getTerms()[0].field())); + assertThat(terms.get(1).bytes(), equalTo(phraseQuery.getTerms()[0].bytes())); + assertThat(terms.get(2).field(), equalTo(termQuery3.getTerm().field())); + assertThat(terms.get(2).bytes(), equalTo(termQuery3.getTerm().bytes())); + } + + public void testExtractQueryMetadata_booleanQuery_onlyShould() { + BooleanQuery.Builder builder = new BooleanQuery.Builder(); + TermQuery termQuery1 = new TermQuery(new Term("_field", "_term1")); + builder.add(termQuery1, BooleanClause.Occur.SHOULD); + TermQuery termQuery2 = new TermQuery(new Term("_field", "_term2")); + builder.add(termQuery2, BooleanClause.Occur.SHOULD); + + BooleanQuery.Builder subBuilder = new BooleanQuery.Builder(); + TermQuery termQuery3 = new TermQuery(new Term("_field1", "_term")); + subBuilder.add(termQuery3, BooleanClause.Occur.SHOULD); + TermQuery termQuery4 = new TermQuery(new Term("_field3", "_long_term")); + subBuilder.add(termQuery4, BooleanClause.Occur.SHOULD); + builder.add(subBuilder.build(), BooleanClause.Occur.SHOULD); + + BooleanQuery booleanQuery = builder.build(); + List terms = new ArrayList<>(ExtractQueryTermsService.extractQueryTerms(booleanQuery)); + Collections.sort(terms); + assertThat(terms.size(), equalTo(4)); + assertThat(terms.get(0).field(), equalTo(termQuery1.getTerm().field())); + assertThat(terms.get(0).bytes(), equalTo(termQuery1.getTerm().bytes())); + assertThat(terms.get(1).field(), equalTo(termQuery2.getTerm().field())); + assertThat(terms.get(1).bytes(), equalTo(termQuery2.getTerm().bytes())); + assertThat(terms.get(2).field(), equalTo(termQuery3.getTerm().field())); + assertThat(terms.get(2).bytes(), equalTo(termQuery3.getTerm().bytes())); + assertThat(terms.get(3).field(), equalTo(termQuery4.getTerm().field())); + assertThat(terms.get(3).bytes(), equalTo(termQuery4.getTerm().bytes())); + } + + public void testExtractQueryMetadata_booleanQueryWithMustNot() { + BooleanQuery.Builder builder = new BooleanQuery.Builder(); + TermQuery termQuery1 = new TermQuery(new Term("_field", "_term")); + builder.add(termQuery1, BooleanClause.Occur.MUST_NOT); + PhraseQuery phraseQuery = new PhraseQuery("_field", "_term1", "term2"); + builder.add(phraseQuery, BooleanClause.Occur.SHOULD); + + BooleanQuery booleanQuery = builder.build(); + List terms = new ArrayList<>(ExtractQueryTermsService.extractQueryTerms(booleanQuery)); + assertThat(terms.size(), equalTo(1)); + assertThat(terms.get(0).field(), equalTo(phraseQuery.getTerms()[0].field())); + assertThat(terms.get(0).bytes(), equalTo(phraseQuery.getTerms()[0].bytes())); + } + + public void testExtractQueryMetadata_constantScoreQuery() { + TermQuery termQuery1 = new TermQuery(new Term("_field", "_term")); + ConstantScoreQuery constantScoreQuery = new ConstantScoreQuery(termQuery1); + List terms = new ArrayList<>(ExtractQueryTermsService.extractQueryTerms(constantScoreQuery)); + assertThat(terms.size(), equalTo(1)); + assertThat(terms.get(0).field(), equalTo(termQuery1.getTerm().field())); + assertThat(terms.get(0).bytes(), equalTo(termQuery1.getTerm().bytes())); + } + + public void testExtractQueryMetadata_boostQuery() { + TermQuery termQuery1 = new TermQuery(new Term("_field", "_term")); + BoostQuery constantScoreQuery = new BoostQuery(termQuery1, 1f); + List terms = new ArrayList<>(ExtractQueryTermsService.extractQueryTerms(constantScoreQuery)); + assertThat(terms.size(), equalTo(1)); + assertThat(terms.get(0).field(), equalTo(termQuery1.getTerm().field())); + assertThat(terms.get(0).bytes(), equalTo(termQuery1.getTerm().bytes())); + } + + public void testExtractQueryMetadata_unsupportedQuery() { + TermRangeQuery termRangeQuery = new TermRangeQuery("_field", null, null, true, false); + + try { + ExtractQueryTermsService.extractQueryTerms(termRangeQuery); + fail("UnsupportedQueryException expected"); + } catch (ExtractQueryTermsService.UnsupportedQueryException e) { + assertThat(e.getUnsupportedQuery(), sameInstance(termRangeQuery)); + } + + TermQuery termQuery1 = new TermQuery(new Term("_field", "_term")); + BooleanQuery.Builder builder = new BooleanQuery.Builder();; + builder.add(termQuery1, BooleanClause.Occur.SHOULD); + builder.add(termRangeQuery, BooleanClause.Occur.SHOULD); + BooleanQuery bq = builder.build(); + + try { + ExtractQueryTermsService.extractQueryTerms(bq); + fail("UnsupportedQueryException expected"); + } catch (ExtractQueryTermsService.UnsupportedQueryException e) { + assertThat(e.getUnsupportedQuery(), sameInstance(termRangeQuery)); + } + } + + public void testCreateQueryMetadataQuery() throws Exception { + MemoryIndex memoryIndex = new MemoryIndex(false); + memoryIndex.addField("field1", "the quick brown fox jumps over the lazy dog", new WhitespaceAnalyzer()); + memoryIndex.addField("field2", "some more text", new WhitespaceAnalyzer()); + memoryIndex.addField("_field3", "unhide me", new WhitespaceAnalyzer()); + memoryIndex.addField("field4", "123", new WhitespaceAnalyzer()); + + IndexReader indexReader = memoryIndex.createSearcher().getIndexReader(); + Query query = ExtractQueryTermsService.createQueryTermsQuery(indexReader, QUERY_TERMS_FIELD, UNKNOWN_QUERY_FIELD); + assertThat(query, instanceOf(TermsQuery.class)); + + // no easy way to get to the terms in TermsQuery, + // if there a less then 16 terms then it gets rewritten to bq and then we can easily check the terms + BooleanQuery booleanQuery = (BooleanQuery) ((ConstantScoreQuery) query.rewrite(indexReader)).getQuery(); + assertThat(booleanQuery.clauses().size(), equalTo(15)); + assertClause(booleanQuery, 0, QUERY_TERMS_FIELD, "_field3\u0000me"); + assertClause(booleanQuery, 1, QUERY_TERMS_FIELD, "_field3\u0000unhide"); + assertClause(booleanQuery, 2, QUERY_TERMS_FIELD, "field1\u0000brown"); + assertClause(booleanQuery, 3, QUERY_TERMS_FIELD, "field1\u0000dog"); + assertClause(booleanQuery, 4, QUERY_TERMS_FIELD, "field1\u0000fox"); + assertClause(booleanQuery, 5, QUERY_TERMS_FIELD, "field1\u0000jumps"); + assertClause(booleanQuery, 6, QUERY_TERMS_FIELD, "field1\u0000lazy"); + assertClause(booleanQuery, 7, QUERY_TERMS_FIELD, "field1\u0000over"); + assertClause(booleanQuery, 8, QUERY_TERMS_FIELD, "field1\u0000quick"); + assertClause(booleanQuery, 9, QUERY_TERMS_FIELD, "field1\u0000the"); + assertClause(booleanQuery, 10, QUERY_TERMS_FIELD, "field2\u0000more"); + assertClause(booleanQuery, 11, QUERY_TERMS_FIELD, "field2\u0000some"); + assertClause(booleanQuery, 12, QUERY_TERMS_FIELD, "field2\u0000text"); + assertClause(booleanQuery, 13, QUERY_TERMS_FIELD, "field4\u0000123"); + assertClause(booleanQuery, 14, UNKNOWN_QUERY_FIELD, ""); + } + + public void testSelectTermsListWithHighestSumOfTermLength() { + Set terms1 = new HashSet<>(); + int shortestTerms1Length = Integer.MAX_VALUE; + int sumTermLength = randomIntBetween(1, 128); + while (sumTermLength > 0) { + int length = randomInt(sumTermLength); + shortestTerms1Length = Math.min(shortestTerms1Length, length); + terms1.add(new Term("field", randomAsciiOfLength(length))); + sumTermLength -= length; + } + + Set terms2 = new HashSet<>(); + int shortestTerms2Length = Integer.MAX_VALUE; + sumTermLength = randomIntBetween(1, 128); + while (sumTermLength > 0) { + int length = randomInt(sumTermLength); + shortestTerms2Length = Math.min(shortestTerms2Length, length); + terms2.add(new Term("field", randomAsciiOfLength(length))); + sumTermLength -= length; + } + + Set result = ExtractQueryTermsService.selectTermListWithTheLongestShortestTerm(terms1, terms2); + Set expected = shortestTerms1Length >= shortestTerms2Length ? terms1 : terms2; + assertThat(result, sameInstance(expected)); + } + + private void assertClause(BooleanQuery booleanQuery, int i, String expectedField, String expectedValue) { + assertThat(booleanQuery.clauses().get(i).getOccur(), equalTo(BooleanClause.Occur.SHOULD)); + assertThat(((TermQuery) booleanQuery.clauses().get(i).getQuery()).getTerm().field(), equalTo(expectedField)); + assertThat(((TermQuery) booleanQuery.clauses().get(i).getQuery()).getTerm().bytes().utf8ToString(), equalTo(expectedValue)); + } + +} diff --git a/core/src/test/java/org/elasticsearch/index/percolator/PercolatorFieldMapperTests.java b/core/src/test/java/org/elasticsearch/index/percolator/PercolatorFieldMapperTests.java new file mode 100644 index 00000000000..5ce841540d1 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/index/percolator/PercolatorFieldMapperTests.java @@ -0,0 +1,95 @@ +/* + * 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.percolator; + +import org.elasticsearch.common.compress.CompressedXContent; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.IndexService; +import org.elasticsearch.index.mapper.MapperParsingException; +import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.index.mapper.ParsedDocument; +import org.elasticsearch.percolator.PercolatorService; +import org.elasticsearch.test.ESSingleNodeTestCase; +import org.junit.Before; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +public class PercolatorFieldMapperTests extends ESSingleNodeTestCase { + + private MapperService mapperService; + + @Before + public void init() throws Exception { + IndexService indexService = createIndex("test", Settings.EMPTY); + mapperService = indexService.mapperService(); + + String mapper = XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties").startObject("field").field("type", "string").endObject().endObject() + .endObject().endObject().string(); + mapperService.merge("type", new CompressedXContent(mapper), true, true); + + String percolatorMapper = XContentFactory.jsonBuilder().startObject().startObject(PercolatorService.TYPE_NAME) + .startObject("properties").startObject("query").field("type", "percolator").endObject().endObject() + .endObject().endObject().string(); + mapperService.merge(PercolatorService.TYPE_NAME, new CompressedXContent(percolatorMapper), true, true); + } + + public void testPercolatorFieldMapper() throws Exception { + ParsedDocument doc = mapperService.documentMapper(PercolatorService.TYPE_NAME).parse("test", PercolatorService.TYPE_NAME, "1", XContentFactory.jsonBuilder().startObject() + .field("query", termQuery("field", "value")) + .endObject().bytes()); + + assertThat(doc.rootDoc().getFields(PercolatorFieldMapper.EXTRACTED_TERMS_FULL_FIELD_NAME).length, equalTo(1)); + assertThat(doc.rootDoc().getFields(PercolatorFieldMapper.EXTRACTED_TERMS_FULL_FIELD_NAME)[0].binaryValue().utf8ToString(), equalTo("field\0value")); + } + + public void testPercolatorFieldMapper_noQuery() throws Exception { + ParsedDocument doc = mapperService.documentMapper(PercolatorService.TYPE_NAME).parse("test", PercolatorService.TYPE_NAME, "1", XContentFactory.jsonBuilder().startObject() + .endObject().bytes()); + assertThat(doc.rootDoc().getFields(PercolatorFieldMapper.EXTRACTED_TERMS_FULL_FIELD_NAME).length, equalTo(0)); + + try { + mapperService.documentMapper(PercolatorService.TYPE_NAME).parse("test", PercolatorService.TYPE_NAME, "1", XContentFactory.jsonBuilder().startObject() + .nullField("query") + .endObject().bytes()); + } catch (MapperParsingException e) { + assertThat(e.getDetailedMessage(), containsString("query malformed, must start with start_object")); + } + } + + public void testAllowNoAdditionalSettings() throws Exception { + IndexService indexService = createIndex("test1", Settings.EMPTY); + MapperService mapperService = indexService.mapperService(); + + String percolatorMapper = XContentFactory.jsonBuilder().startObject().startObject(PercolatorService.TYPE_NAME) + .startObject("properties").startObject("query").field("type", "percolator").field("index", "no").endObject().endObject() + .endObject().endObject().string(); + try { + mapperService.merge(PercolatorService.TYPE_NAME, new CompressedXContent(percolatorMapper), true, true); + fail("MapperParsingException expected"); + } catch (MapperParsingException e) { + assertThat(e.getMessage(), equalTo("Mapping definition for [query] has unsupported parameters: [index : no]")); + } + } + +} diff --git a/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java b/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java index 8faa2dac524..b88d0be23b6 100644 --- a/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java +++ b/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java @@ -255,7 +255,7 @@ public abstract class AbstractQueryTestCase> ScriptService scriptService = injector.getInstance(ScriptService.class); SimilarityService similarityService = new SimilarityService(idxSettings, Collections.emptyMap()); MapperRegistry mapperRegistry = injector.getInstance(MapperRegistry.class); - MapperService mapperService = new MapperService(idxSettings, analysisService, similarityService, mapperRegistry); + MapperService mapperService = new MapperService(idxSettings, analysisService, similarityService, mapperRegistry, () -> queryShardContext); indexFieldDataService = new IndexFieldDataService(idxSettings, injector.getInstance(IndicesFieldDataCache.class), injector.getInstance(CircuitBreakerService.class), mapperService); BitsetFilterCache bitsetFilterCache = new BitsetFilterCache(idxSettings, new IndicesWarmer(idxSettings.getNodeSettings(), null), new BitsetFilterCache.Listener() { @Override diff --git a/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java index b11f24377ad..a7f50d33608 100644 --- a/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java @@ -21,6 +21,7 @@ package org.elasticsearch.percolator; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.percolate.PercolateResponse; +import org.elasticsearch.action.percolate.PercolateSourceBuilder; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.util.concurrent.ConcurrentCollections; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -187,18 +188,21 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { case 0: response = client().prepareIndex("index", PercolatorService.TYPE_NAME, id) .setSource(onlyField1) + .setRefresh(true) .execute().actionGet(); type1.incrementAndGet(); break; case 1: response = client().prepareIndex("index", PercolatorService.TYPE_NAME, id) .setSource(onlyField2) + .setRefresh(true) .execute().actionGet(); type2.incrementAndGet(); break; case 2: response = client().prepareIndex("index", PercolatorService.TYPE_NAME, id) .setSource(field1And2) + .setRefresh(true) .execute().actionGet(); type3.incrementAndGet(); break; @@ -327,6 +331,7 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { } while (!liveIds.remove(id)); DeleteResponse response = client().prepareDelete("index", PercolatorService.TYPE_NAME, id) + .setRefresh(true) .execute().actionGet(); assertThat(response.getId(), equalTo(id)); assertThat("doc[" + id + "] should have been deleted, but isn't", response.isFound(), equalTo(true)); @@ -334,6 +339,7 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { String id = Integer.toString(idGen.getAndIncrement()); IndexResponse response = client().prepareIndex("index", PercolatorService.TYPE_NAME, id) .setSource(doc) + .setRefresh(true) .execute().actionGet(); liveIds.add(id); assertThat(response.isCreated(), equalTo(true)); // We only add new docs @@ -357,9 +363,9 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { indexThreads[i].start(); } - XContentBuilder percolateDoc = XContentFactory.jsonBuilder().startObject().startObject("doc") + String percolateDoc = XContentFactory.jsonBuilder().startObject() .field("field1", "value") - .endObject().endObject(); + .endObject().string(); for (int counter = 0; counter < numberPercolateOperation; counter++) { Thread.sleep(5); semaphore.acquire(numIndexThreads); @@ -369,7 +375,9 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { } int atLeastExpected = liveIds.size(); PercolateResponse response = client().preparePercolate().setIndices("index").setDocumentType("type") - .setSource(percolateDoc).execute().actionGet(); + .setPercolateDoc(new PercolateSourceBuilder.DocBuilder().setDoc(percolateDoc)) + .setSize(atLeastExpected) + .get(); assertThat(response.getShardFailures(), emptyArray()); assertThat(response.getSuccessfulShards(), equalTo(response.getTotalShards())); assertThat(response.getMatches().length, equalTo(atLeastExpected)); diff --git a/core/src/test/java/org/elasticsearch/percolator/MultiPercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/MultiPercolatorIT.java index 7674ef83b5c..811f010d099 100644 --- a/core/src/test/java/org/elasticsearch/percolator/MultiPercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/MultiPercolatorIT.java @@ -73,6 +73,7 @@ public class MultiPercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "4") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); + refresh(); MultiPercolateResponse response = client().prepareMultiPercolate() .add(client().preparePercolate() @@ -146,6 +147,7 @@ public class MultiPercolatorIT extends ESIntegTestCase { .setRouting("a") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); + refresh(); MultiPercolateResponse response = client().prepareMultiPercolate() .add(client().preparePercolate() @@ -214,6 +216,7 @@ public class MultiPercolatorIT extends ESIntegTestCase { client().prepareIndex("test", "type", "1") .setSource(jsonBuilder().startObject().field("field", "a")) .execute().actionGet(); + refresh(); MultiPercolateRequestBuilder builder = client().prepareMultiPercolate(); int numPercolateRequest = randomIntBetween(50, 100); @@ -221,7 +224,9 @@ public class MultiPercolatorIT extends ESIntegTestCase { builder.add( client().preparePercolate() .setGetRequest(Requests.getRequest("test").type("type").id("1")) - .setIndices("test").setDocumentType("type")); + .setIndices("test").setDocumentType("type") + .setSize(numQueries) + ); } MultiPercolateResponse response = builder.execute().actionGet(); @@ -238,7 +243,8 @@ public class MultiPercolatorIT extends ESIntegTestCase { builder.add( client().preparePercolate() .setGetRequest(Requests.getRequest("test").type("type").id("2")) - .setIndices("test").setDocumentType("type")); + .setIndices("test").setDocumentType("type").setSize(numQueries) + ); } response = builder.execute().actionGet(); @@ -255,12 +261,14 @@ public class MultiPercolatorIT extends ESIntegTestCase { builder.add( client().preparePercolate() .setGetRequest(Requests.getRequest("test").type("type").id("2")) - .setIndices("test").setDocumentType("type")); + .setIndices("test").setDocumentType("type").setSize(numQueries) + ); } builder.add( client().preparePercolate() .setGetRequest(Requests.getRequest("test").type("type").id("1")) - .setIndices("test").setDocumentType("type")); + .setIndices("test").setDocumentType("type").setSize(numQueries) + ); response = builder.execute().actionGet(); assertThat(response.items().length, equalTo(numPercolateRequest + 1)); @@ -282,6 +290,7 @@ public class MultiPercolatorIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); } + refresh(); MultiPercolateRequestBuilder builder = client().prepareMultiPercolate(); int numPercolateRequest = randomIntBetween(50, 100); @@ -289,6 +298,7 @@ public class MultiPercolatorIT extends ESIntegTestCase { builder.add( client().preparePercolate() .setIndices("test").setDocumentType("type") + .setSize(numQueries) .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field", "a").endObject()))); } @@ -331,6 +341,7 @@ public class MultiPercolatorIT extends ESIntegTestCase { } builder.add( client().preparePercolate() + .setSize(numQueries) .setIndices("test").setDocumentType("type") .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field", "a").endObject()))); diff --git a/core/src/test/java/org/elasticsearch/percolator/PercolateDocumentParserTests.java b/core/src/test/java/org/elasticsearch/percolator/PercolateDocumentParserTests.java new file mode 100644 index 00000000000..a8897824738 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/percolator/PercolateDocumentParserTests.java @@ -0,0 +1,196 @@ +/* + * 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.percolator; + +import org.apache.lucene.index.Term; +import org.apache.lucene.search.TermQuery; +import org.elasticsearch.Version; +import org.elasticsearch.action.percolate.PercolateShardRequest; +import org.elasticsearch.cluster.action.index.MappingUpdatedAction; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.index.Index; +import org.elasticsearch.index.IndexSettings; +import org.elasticsearch.index.analysis.AnalysisService; +import org.elasticsearch.index.analysis.AnalyzerProvider; +import org.elasticsearch.index.analysis.CharFilterFactory; +import org.elasticsearch.index.analysis.TokenFilterFactory; +import org.elasticsearch.index.analysis.TokenizerFactory; +import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.index.mapper.ParsedDocument; +import org.elasticsearch.index.query.QueryParser; +import org.elasticsearch.index.query.QueryShardContext; +import org.elasticsearch.index.query.TermQueryParser; +import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.index.similarity.SimilarityService; +import org.elasticsearch.indices.IndicesModule; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; +import org.elasticsearch.search.SearchShardTarget; +import org.elasticsearch.search.aggregations.AggregationBinaryParseElement; +import org.elasticsearch.search.aggregations.AggregationParseElement; +import org.elasticsearch.search.aggregations.AggregationPhase; +import org.elasticsearch.search.aggregations.AggregatorParsers; +import org.elasticsearch.search.highlight.HighlightPhase; +import org.elasticsearch.search.highlight.Highlighters; +import org.elasticsearch.search.sort.SortParseElement; +import org.elasticsearch.test.ESTestCase; +import org.junit.Before; +import org.mockito.Mockito; + +import java.util.Collections; +import java.util.Set; + +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; + +public class PercolateDocumentParserTests extends ESTestCase { + + private Index index; + private MapperService mapperService; + private PercolateDocumentParser parser; + private QueryShardContext queryShardContext; + + @Before + public void init() { + index = new Index("_index"); + IndexSettings indexSettings = new IndexSettings(new IndexMetaData.Builder("_index").settings( + Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1) + .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 1) + .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)) + .build(), + Settings.EMPTY, Collections.emptyList() + ); + AnalysisService analysisService = new AnalysisService(indexSettings, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap()); + IndicesModule indicesModule = new IndicesModule(); + mapperService = new MapperService(indexSettings, analysisService, new SimilarityService(indexSettings, Collections.emptyMap()), indicesModule.getMapperRegistry(), () -> null); + + Set parsers = Collections.singleton(new TermQueryParser()); + IndicesQueriesRegistry indicesQueriesRegistry = new IndicesQueriesRegistry(indexSettings.getSettings(), parsers, new NamedWriteableRegistry()); + + queryShardContext = new QueryShardContext(indexSettings, null, null, null, mapperService, null, null, indicesQueriesRegistry); + + HighlightPhase highlightPhase = new HighlightPhase(Settings.EMPTY, new Highlighters()); + AggregatorParsers aggregatorParsers = new AggregatorParsers(Collections.emptySet(), Collections.emptySet()); + AggregationPhase aggregationPhase = new AggregationPhase(new AggregationParseElement(aggregatorParsers), new AggregationBinaryParseElement(aggregatorParsers)); + MappingUpdatedAction mappingUpdatedAction = Mockito.mock(MappingUpdatedAction.class); + parser = new PercolateDocumentParser( + highlightPhase, new SortParseElement(), aggregationPhase, mappingUpdatedAction + ); + } + + public void testParseDoc() throws Exception { + XContentBuilder source = jsonBuilder().startObject() + .startObject("doc") + .field("field1", "value1") + .endObject() + .endObject(); + PercolateShardRequest request = new PercolateShardRequest(new ShardId(index, 0), null); + request.documentType("type"); + request.source(source.bytes()); + + PercolateContext context = new PercolateContext(request, new SearchShardTarget("_node", "_index", 0), mapperService); + ParsedDocument parsedDocument = parser.parse(request, context, mapperService, queryShardContext); + assertThat(parsedDocument.rootDoc().get("field1"), equalTo("value1")); + } + + public void testParseDocAndOtherOptions() throws Exception { + XContentBuilder source = jsonBuilder().startObject() + .startObject("doc") + .field("field1", "value1") + .endObject() + .startObject("query") + .startObject("term").field("field1", "value1").endObject() + .endObject() + .field("track_scores", true) + .field("size", 123) + .startObject("sort").startObject("_score").endObject().endObject() + .endObject(); + PercolateShardRequest request = new PercolateShardRequest(new ShardId(index, 0), null); + request.documentType("type"); + request.source(source.bytes()); + + PercolateContext context = new PercolateContext(request, new SearchShardTarget("_node", "_index", 0), mapperService); + ParsedDocument parsedDocument = parser.parse(request, context, mapperService, queryShardContext); + assertThat(parsedDocument.rootDoc().get("field1"), equalTo("value1")); + assertThat(context.percolateQuery(), equalTo(new TermQuery(new Term("field1", "value1")))); + assertThat(context.trackScores(), is(true)); + assertThat(context.size(), is(123)); + assertThat(context.sort(), nullValue()); + } + + public void testParseDocSource() throws Exception { + XContentBuilder source = jsonBuilder().startObject() + .startObject("query") + .startObject("term").field("field1", "value1").endObject() + .endObject() + .field("track_scores", true) + .field("size", 123) + .startObject("sort").startObject("_score").endObject().endObject() + .endObject(); + XContentBuilder docSource = jsonBuilder().startObject() + .field("field1", "value1") + .endObject(); + PercolateShardRequest request = new PercolateShardRequest(new ShardId(index, 0), null); + request.documentType("type"); + request.source(source.bytes()); + request.docSource(docSource.bytes()); + + PercolateContext context = new PercolateContext(request, new SearchShardTarget("_node", "_index", 0), mapperService); + ParsedDocument parsedDocument = parser.parse(request, context, mapperService, queryShardContext); + assertThat(parsedDocument.rootDoc().get("field1"), equalTo("value1")); + assertThat(context.percolateQuery(), equalTo(new TermQuery(new Term("field1", "value1")))); + assertThat(context.trackScores(), is(true)); + assertThat(context.size(), is(123)); + assertThat(context.sort(), nullValue()); + } + + public void testParseDocSourceAndSource() throws Exception { + XContentBuilder source = jsonBuilder().startObject() + .startObject("doc") + .field("field1", "value1") + .endObject() + .startObject("query") + .startObject("term").field("field1", "value1").endObject() + .endObject() + .field("track_scores", true) + .field("size", 123) + .startObject("sort").startObject("_score").endObject().endObject() + .endObject(); + XContentBuilder docSource = jsonBuilder().startObject() + .field("field1", "value1") + .endObject(); + PercolateShardRequest request = new PercolateShardRequest(new ShardId(index, 0), null); + request.documentType("type"); + request.source(source.bytes()); + request.docSource(docSource.bytes()); + + PercolateContext context = new PercolateContext(request, new SearchShardTarget("_node", "_index", 0), mapperService); + try { + parser.parse(request, context, mapperService, queryShardContext); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage(), equalTo("Can't specify the document to percolate in the source of the request and as document id")); + } + } + +} diff --git a/core/src/test/java/org/elasticsearch/percolator/PercolatorFacetsAndAggregationsIT.java b/core/src/test/java/org/elasticsearch/percolator/PercolatorAggregationsIT.java similarity index 93% rename from core/src/test/java/org/elasticsearch/percolator/PercolatorFacetsAndAggregationsIT.java rename to core/src/test/java/org/elasticsearch/percolator/PercolatorAggregationsIT.java index 85783e3d456..c32632bbf1d 100644 --- a/core/src/test/java/org/elasticsearch/percolator/PercolatorFacetsAndAggregationsIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/PercolatorAggregationsIT.java @@ -49,9 +49,10 @@ import static org.hamcrest.Matchers.notNullValue; /** * */ -public class PercolatorFacetsAndAggregationsIT extends ESIntegTestCase { +public class PercolatorAggregationsIT extends ESIntegTestCase { + // Just test the integration with facets and aggregations, not the facet and aggregation functionality! - public void testFacetsAndAggregations() throws Exception { + public void testAggregations() throws Exception { assertAcked(prepareCreate("test").addMapping("type", "field1", "type=string", "field2", "type=string")); ensureGreen(); @@ -72,12 +73,15 @@ public class PercolatorFacetsAndAggregationsIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", queryBuilder).field("field2", "b").endObject()).execute() .actionGet(); } - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); for (int i = 0; i < numQueries; i++) { String value = values[i % numUniqueQueries]; - PercolateRequestBuilder percolateRequestBuilder = client().preparePercolate().setIndices("test").setDocumentType("type") - .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field1", value).endObject())); + PercolateRequestBuilder percolateRequestBuilder = client().preparePercolate() + .setIndices("test") + .setDocumentType("type") + .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field1", value).endObject())) + .setSize(expectedCount[i % numUniqueQueries]); SubAggCollectionMode aggCollectionMode = randomFrom(SubAggCollectionMode.values()); percolateRequestBuilder.addAggregation(AggregationBuilders.terms("a").field("field2").collectMode(aggCollectionMode)); @@ -134,12 +138,15 @@ public class PercolatorFacetsAndAggregationsIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", queryBuilder).field("field2", "b").endObject()).execute() .actionGet(); } - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); for (int i = 0; i < numQueries; i++) { String value = values[i % numUniqueQueries]; - PercolateRequestBuilder percolateRequestBuilder = client().preparePercolate().setIndices("test").setDocumentType("type") - .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field1", value).endObject())); + PercolateRequestBuilder percolateRequestBuilder = client().preparePercolate() + .setIndices("test") + .setDocumentType("type") + .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field1", value).endObject())) + .setSize(expectedCount[i % numUniqueQueries]); SubAggCollectionMode aggCollectionMode = randomFrom(SubAggCollectionMode.values()); percolateRequestBuilder.addAggregation(AggregationBuilders.terms("a").field("field2").collectMode(aggCollectionMode)); @@ -210,12 +217,15 @@ public class PercolatorFacetsAndAggregationsIT extends ESIntegTestCase { .execute() .actionGet(); } - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); for (int i = 0; i < numQueries; i++) { String value = "value0"; - PercolateRequestBuilder percolateRequestBuilder = client().preparePercolate().setIndices("test").setDocumentType("type") - .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field1", value).endObject())); + PercolateRequestBuilder percolateRequestBuilder = client().preparePercolate() + .setIndices("test") + .setDocumentType("type") + .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().field("field1", value).endObject())) + .setSize(numQueries); SubAggCollectionMode aggCollectionMode = randomFrom(SubAggCollectionMode.values()); percolateRequestBuilder.addAggregation(AggregationBuilders.terms("terms").field("field2").collectMode(aggCollectionMode) diff --git a/core/src/test/java/org/elasticsearch/percolator/PercolatorBackwardsCompatibilityIT.java b/core/src/test/java/org/elasticsearch/percolator/PercolatorBackwardsCompatibilityIT.java index 8254932c304..cb8ffb8e91f 100644 --- a/core/src/test/java/org/elasticsearch/percolator/PercolatorBackwardsCompatibilityIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/PercolatorBackwardsCompatibilityIT.java @@ -18,54 +18,104 @@ */ package org.elasticsearch.percolator; +import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.util.TestUtil; import org.elasticsearch.Version; -import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.percolate.PercolateResponse; import org.elasticsearch.action.percolate.PercolateSourceBuilder; -import org.elasticsearch.index.percolator.PercolatorException; -import org.elasticsearch.index.query.QueryShardException; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.cluster.ClusterState; +import org.elasticsearch.cluster.metadata.MappingMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.support.XContentMapValues; +import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.test.ESIntegTestCase; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; +import static org.elasticsearch.index.query.QueryBuilders.matchQuery; import static org.elasticsearch.index.query.QueryBuilders.termQuery; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertMatchCount; -import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; -/** - */ +@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.TEST, numDataNodes = 0, numClientNodes = 0) +@LuceneTestCase.SuppressFileSystems("ExtrasFS") public class PercolatorBackwardsCompatibilityIT extends ESIntegTestCase { - public void testPercolatorUpgrading() throws Exception { - // Simulates an index created on an node before 1.4.0 where the field resolution isn't strict. - assertAcked(prepareCreate("test") - .setSettings(settings(Version.V_1_3_0).put(indexSettings()))); - ensureGreen(); - int numDocs = randomIntBetween(100, 150); - IndexRequestBuilder[] docs = new IndexRequestBuilder[numDocs]; - for (int i = 0; i < numDocs; i++) { - docs[i] = client().prepareIndex("test", PercolatorService.TYPE_NAME) - .setSource(jsonBuilder().startObject().field("query", termQuery("field1", "value")).endObject()); - } - indexRandom(true, docs); - PercolateResponse response = client().preparePercolate().setIndices("test").setDocumentType("type") - .setPercolateDoc(new PercolateSourceBuilder.DocBuilder().setDoc("field1", "value")) - .get(); - assertMatchCount(response, numDocs); - // After upgrade indices, indices created before the upgrade allow that queries refer to fields not available in mapping - client().prepareIndex("test", PercolatorService.TYPE_NAME) - .setSource(jsonBuilder().startObject().field("query", termQuery("field2", "value")).endObject()).get(); + private final static String INDEX_NAME = "percolator_index"; - // However on new indices, the field resolution is strict, no queries with unmapped fields are allowed - createIndex("test2"); - try { - client().prepareIndex("test2", PercolatorService.TYPE_NAME) - .setSource(jsonBuilder().startObject().field("query", termQuery("field1", "value")).endObject()).get(); - fail(); - } catch (PercolatorException e) { - e.printStackTrace(); - assertThat(e.getRootCause(), instanceOf(QueryShardException.class)); + public void testOldPercolatorIndex() throws Exception { + setupNode(); + + // verify cluster state: + ClusterState state = client().admin().cluster().prepareState().get().getState(); + assertThat(state.metaData().indices().size(), equalTo(1)); + assertThat(state.metaData().indices().get(INDEX_NAME), notNullValue()); + assertThat(state.metaData().indices().get(INDEX_NAME).getCreationVersion(), equalTo(Version.V_2_0_0)); + assertThat(state.metaData().indices().get(INDEX_NAME).getUpgradedVersion(), equalTo(Version.CURRENT)); + assertThat(state.metaData().indices().get(INDEX_NAME).getMappings().size(), equalTo(2)); + assertThat(state.metaData().indices().get(INDEX_NAME).getMappings().get(".percolator"), notNullValue()); + // important: verify that the query field in the .percolator mapping is of type object (from 3.0.0 this is of type percolator) + MappingMetaData mappingMetaData = state.metaData().indices().get(INDEX_NAME).getMappings().get(".percolator"); + assertThat(XContentMapValues.extractValue("properties.query.type", mappingMetaData.sourceAsMap()), equalTo("object")); + assertThat(state.metaData().indices().get(INDEX_NAME).getMappings().get("message"), notNullValue()); + + // verify existing percolator queries: + SearchResponse searchResponse = client().prepareSearch(INDEX_NAME) + .setTypes(".percolator") + .addSort("_id", SortOrder.ASC) + .get(); + assertThat(searchResponse.getHits().getTotalHits(), equalTo(3L)); + assertThat(searchResponse.getHits().getAt(0).id(), equalTo("1")); + assertThat(searchResponse.getHits().getAt(1).id(), equalTo("2")); + assertThat(searchResponse.getHits().getAt(2).id(), equalTo("3")); + + // verify percolate response + PercolateResponse percolateResponse = client().preparePercolate() + .setIndices(INDEX_NAME) + .setDocumentType("message") + .setPercolateDoc(new PercolateSourceBuilder.DocBuilder().setDoc("message", "the quick brown fox jumps over the lazy dog")) + .get(); + + assertThat(percolateResponse.getCount(), equalTo(2L)); + assertThat(percolateResponse.getMatches().length, equalTo(2)); + assertThat(percolateResponse.getMatches()[0].getId().string(), equalTo("1")); + assertThat(percolateResponse.getMatches()[1].getId().string(), equalTo("2")); + + // add an extra query and verify the results + client().prepareIndex(INDEX_NAME, ".percolator", "4") + .setSource(jsonBuilder().startObject().field("query", matchQuery("message", "fox jumps")).endObject()) + .get(); + refresh(); + + percolateResponse = client().preparePercolate() + .setIndices(INDEX_NAME) + .setDocumentType("message") + .setPercolateDoc(new PercolateSourceBuilder.DocBuilder().setDoc("message", "the quick brown fox jumps over the lazy dog")) + .get(); + + assertThat(percolateResponse.getCount(), equalTo(3L)); + assertThat(percolateResponse.getMatches().length, equalTo(3)); + assertThat(percolateResponse.getMatches()[0].getId().string(), equalTo("1")); + assertThat(percolateResponse.getMatches()[1].getId().string(), equalTo("2")); + assertThat(percolateResponse.getMatches()[2].getId().string(), equalTo("4")); + } + + private void setupNode() throws Exception { + Path dataDir = createTempDir(); + Path clusterDir = Files.createDirectory(dataDir.resolve(cluster().getClusterName())); + try (InputStream stream = PercolatorBackwardsCompatibilityIT.class.getResourceAsStream("/indices/percolator/bwc_index_2.0.0.zip")) { + TestUtil.unzip(stream, clusterDir); } + + Settings.Builder nodeSettings = Settings.builder() + .put("path.data", dataDir); + internalCluster().startNode(nodeSettings.build()); + ensureGreen(INDEX_NAME); } } diff --git a/core/src/test/java/org/elasticsearch/percolator/PercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/PercolatorIT.java index be1acb1218d..0c16c981847 100644 --- a/core/src/test/java/org/elasticsearch/percolator/PercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/PercolatorIT.java @@ -19,7 +19,6 @@ package org.elasticsearch.percolator; import org.apache.lucene.search.join.ScoreMode; -import org.elasticsearch.action.ShardOperationFailedException; import org.elasticsearch.action.admin.cluster.node.stats.NodeStats; import org.elasticsearch.action.admin.cluster.node.stats.NodesStatsResponse; import org.elasticsearch.action.admin.indices.alias.Alias; @@ -39,7 +38,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.engine.DocumentMissingException; import org.elasticsearch.index.engine.VersionConflictEngineException; -import org.elasticsearch.index.percolator.PercolatorException; +import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.query.Operator; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryShardException; @@ -102,6 +101,7 @@ import static org.hamcrest.Matchers.nullValue; * */ public class PercolatorIT extends ESIntegTestCase { + public void testSimple1() throws Exception { client().admin().indices().prepareCreate("test").execute().actionGet(); ensureGreen(); @@ -125,7 +125,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "4") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); logger.info("--> Percolate doc with field1=b"); PercolateResponse response = client().preparePercolate() @@ -200,6 +200,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "test1") .setSource(XContentFactory.jsonBuilder().startObject().field("query", termQuery("field2", "value")).endObject()) .execute().actionGet(); + refresh(); response = client().preparePercolate() .setIndices("test").setDocumentType("type1") @@ -212,6 +213,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "test2") .setSource(XContentFactory.jsonBuilder().startObject().field("query", termQuery("field1", 1)).endObject()) .execute().actionGet(); + refresh(); response = client().preparePercolate() .setIndices("test").setDocumentType("type1") @@ -223,6 +225,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareDelete("test", PercolatorService.TYPE_NAME, "test2").execute().actionGet(); + refresh(); response = client().preparePercolate() .setIndices("test").setDocumentType("type1") .setSource(doc).execute().actionGet(); @@ -244,11 +247,13 @@ public class PercolatorIT extends ESIntegTestCase { .setRouting(Integer.toString(i % 2)) .execute().actionGet(); } + refresh(); logger.info("--> Percolate doc with no routing"); PercolateResponse response = client().preparePercolate() .setIndices("test").setDocumentType("type") - .setSource(jsonBuilder().startObject().startObject("doc").field("field1", "value").endObject().endObject()) + .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().startObject("doc").field("field1", "value").endObject().endObject())) + .setSize(100) .execute().actionGet(); assertMatchCount(response, 100l); assertThat(response.getMatches(), arrayWithSize(100)); @@ -256,23 +261,25 @@ public class PercolatorIT extends ESIntegTestCase { logger.info("--> Percolate doc with routing=0"); response = client().preparePercolate() .setIndices("test").setDocumentType("type") - .setSource(jsonBuilder().startObject().startObject("doc").field("field1", "value").endObject().endObject()) - .setRouting("0") - .execute().actionGet(); + .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().startObject("doc").field("field1", "value").endObject().endObject())) + .setSize(100) + .setRouting("0") + .execute().actionGet(); assertMatchCount(response, 50l); assertThat(response.getMatches(), arrayWithSize(50)); logger.info("--> Percolate doc with routing=1"); response = client().preparePercolate() .setIndices("test").setDocumentType("type") - .setSource(jsonBuilder().startObject().startObject("doc").field("field1", "value").endObject().endObject()) + .setPercolateDoc(docBuilder().setDoc(jsonBuilder().startObject().startObject("doc").field("field1", "value").endObject().endObject())) + .setSize(100) .setRouting("1") .execute().actionGet(); assertMatchCount(response, 50l); assertThat(response.getMatches(), arrayWithSize(50)); } - public void testStorePeroclateQueriesOnRecreatedIndex() throws Exception { + public void storePercolateQueriesOnRecreatedIndex() throws Exception { createIndex("test"); ensureGreen(); @@ -326,6 +333,7 @@ public class PercolatorIT extends ESIntegTestCase { .endObject()) .setRefresh(true) .execute().actionGet(); + refresh(); PercolateResponse percolate = client().preparePercolate() .setIndices("test").setDocumentType("doc") @@ -352,7 +360,6 @@ public class PercolatorIT extends ESIntegTestCase { .field("query", termQuery("field1", "value1")) .endObject()) .execute().actionGet(); - refresh(); SearchResponse countResponse = client().prepareSearch().setSize(0) .setQuery(matchAllQuery()).setTypes(PercolatorService.TYPE_NAME) @@ -511,7 +518,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "1") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); logger.info("--> First percolate request"); PercolateResponse response = client().preparePercolate() @@ -613,7 +620,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "4") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); logger.info("--> Percolate existing doc with id 1"); PercolateResponse response = client().preparePercolate() @@ -686,7 +693,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "4") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); logger.info("--> Percolate existing doc with id 1"); PercolateResponse response = client().preparePercolate() @@ -751,7 +758,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "4") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); logger.info("--> Percolate existing doc with id 2 and version 1"); PercolateResponse response = client().preparePercolate() @@ -796,6 +803,7 @@ public class PercolatorIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); } + refresh(); logger.info("--> Percolate doc to index test1"); PercolateResponse response = client().preparePercolate() @@ -962,7 +970,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "4") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); logger.info("--> Count percolate doc with field1=b"); PercolateResponse response = client().preparePercolate() @@ -1033,7 +1041,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "4") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); - client().admin().indices().prepareRefresh("test").execute().actionGet(); + refresh(); logger.info("--> Count percolate existing doc with id 1"); PercolateResponse response = client().preparePercolate() @@ -1083,12 +1091,14 @@ public class PercolatorIT extends ESIntegTestCase { .execute().actionGet(); } } + refresh(); boolean onlyCount = randomBoolean(); PercolateResponse response = client().preparePercolate() .setIndices("my-index").setDocumentType("my-type") .setOnlyCount(onlyCount) .setPercolateDoc(docBuilder().setDoc("field", "value")) + .setSize((int) totalQueries) .execute().actionGet(); assertMatchCount(response, totalQueries); if (!onlyCount) { @@ -1108,7 +1118,7 @@ public class PercolatorIT extends ESIntegTestCase { } // The query / filter capabilities are NOT in realtime - client().admin().indices().prepareRefresh("my-index").execute().actionGet(); + refresh(); int runs = randomIntBetween(3, 16); for (int i = 0; i < runs; i++) { @@ -1118,6 +1128,7 @@ public class PercolatorIT extends ESIntegTestCase { .setOnlyCount(onlyCount) .setPercolateDoc(docBuilder().setDoc("field", "value")) .setPercolateQuery(termQuery("level", 1 + randomInt(numLevels - 1))) + .setSize((int) numQueriesPerLevel) .execute().actionGet(); assertMatchCount(response, numQueriesPerLevel); if (!onlyCount) { @@ -1132,6 +1143,7 @@ public class PercolatorIT extends ESIntegTestCase { .setOnlyCount(onlyCount) .setPercolateDoc(docBuilder().setDoc("field", "value")) .setPercolateQuery(termQuery("level", 1 + randomInt(numLevels - 1))) + .setSize((int) numQueriesPerLevel) .execute().actionGet(); assertMatchCount(response, numQueriesPerLevel); if (!onlyCount) { @@ -1268,18 +1280,6 @@ public class PercolatorIT extends ESIntegTestCase { assertThat(response.getMatches()[0].getScore(), equalTo(2f)); assertThat(response.getMatches()[1].getId().string(), equalTo("1")); assertThat(response.getMatches()[1].getScore(), equalTo(1f)); - - response = client().preparePercolate().setIndices("my-index").setDocumentType("my-type") - .setSortByScore(true) - .setPercolateDoc(docBuilder().setDoc("field", "value")) - .setPercolateQuery(QueryBuilders.functionScoreQuery(matchAllQuery(), fieldValueFactorFunction("level"))) - .execute().actionGet(); - assertThat(response.getCount(), equalTo(0l)); - assertThat(response.getShardFailures().length, greaterThan(0)); - for (ShardOperationFailedException failure : response.getShardFailures()) { - assertThat(failure.status(), equalTo(RestStatus.BAD_REQUEST)); - assertThat(failure.reason(), containsString("Can't sort if size isn't specified")); - } } public void testPercolateSortingUnsupportedField() throws Exception { @@ -1322,25 +1322,6 @@ public class PercolatorIT extends ESIntegTestCase { assertMatchCount(response, 0l); } - public void testPercolateNotEmptyIndexButNoRefresh() throws Exception { - client().admin().indices().prepareCreate("my-index") - .setSettings(settingsBuilder().put("index.refresh_interval", -1)) - .execute().actionGet(); - ensureGreen(); - - client().prepareIndex("my-index", PercolatorService.TYPE_NAME, "1") - .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).field("level", 1).endObject()) - .execute().actionGet(); - - PercolateResponse response = client().preparePercolate().setIndices("my-index").setDocumentType("my-type") - .setSortByScore(true) - .setSize(2) - .setPercolateDoc(docBuilder().setDoc("field", "value")) - .setPercolateQuery(QueryBuilders.functionScoreQuery(matchAllQuery(), fieldValueFactorFunction("level"))) - .execute().actionGet(); - assertMatchCount(response, 0l); - } - public void testPercolatorWithHighlighting() throws Exception { StringBuilder fieldMapping = new StringBuilder("type=string") .append(",store=").append(randomBoolean()); @@ -1367,6 +1348,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "5") .setSource(jsonBuilder().startObject().field("query", termQuery("field1", "fox")).endObject()) .execute().actionGet(); + refresh(); logger.info("--> Percolate doc with field1=The quick brown fox jumps over the lazy dog"); PercolateResponse response = client().preparePercolate() @@ -1393,9 +1375,6 @@ public class PercolatorIT extends ESIntegTestCase { assertThat(matches[3].getHighlightFields().get("field1").fragments()[0].string(), equalTo("The quick brown fox jumps over the lazy dog")); assertThat(matches[4].getHighlightFields().get("field1").fragments()[0].string(), equalTo("The quick brown fox jumps over the lazy dog")); - // Anything with percolate query isn't realtime - client().admin().indices().prepareRefresh("test").execute().actionGet(); - logger.info("--> Query percolate doc with field1=The quick brown fox jumps over the lazy dog"); response = client().preparePercolate() .setIndices("test").setDocumentType("type") @@ -1522,6 +1501,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", "type", "1") .setSource(jsonBuilder().startObject().field("field1", "The quick brown fox jumps over the lazy dog").endObject()) .get(); + refresh(); logger.info("--> Top percolate for doc with field1=The quick brown fox jumps over the lazy dog"); response = client().preparePercolate() @@ -1569,6 +1549,7 @@ public class PercolatorIT extends ESIntegTestCase { .endObject()) .setRefresh(true) .execute().actionGet(); + refresh(); PercolateResponse percolate = client().preparePercolate() .setIndices("test").setDocumentType("doc") @@ -1638,8 +1619,9 @@ public class PercolatorIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", QueryBuilders.queryStringQuery("color:red")).endObject()) .get(); fail(); - } catch (PercolatorException e) { + } catch (MapperParsingException e) { } + refresh(); PercolateResponse percolateResponse = client().preparePercolate().setDocumentType("type") .setPercolateDoc(new PercolateSourceBuilder.DocBuilder().setDoc(jsonBuilder().startObject().startObject("custom").field("color", "blue").endObject().endObject())) @@ -1656,6 +1638,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("idx", PercolatorService.TYPE_NAME, "2") .setSource(jsonBuilder().startObject().field("query", QueryBuilders.queryStringQuery("custom.color:blue")).field("type", "type").endObject()) .get(); + refresh(); // The second request will yield a match, since the query during the proper field during parsing. percolateResponse = client().preparePercolate().setDocumentType("type") @@ -1725,7 +1708,7 @@ public class PercolatorIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", termQuery("field1", "value")).endObject()) .get(); fail(); - } catch (PercolatorException e) { + } catch (MapperParsingException e) { assertThat(e.getRootCause(), instanceOf(QueryShardException.class)); } @@ -1734,7 +1717,7 @@ public class PercolatorIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", rangeQuery("field1").from(0).to(1)).endObject()) .get(); fail(); - } catch (PercolatorException e) { + } catch (MapperParsingException e) { assertThat(e.getRootCause(), instanceOf(QueryShardException.class)); } } @@ -1751,6 +1734,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("test", PercolatorService.TYPE_NAME, "2") .setSource(jsonBuilder().startObject().field("query", constantScoreQuery(rangeQuery("timestamp").from("now-1d").to("now"))).endObject()) .get(); + refresh(); logger.info("--> Percolate doc with field1=b"); PercolateResponse response = client().preparePercolate() @@ -1797,7 +1781,6 @@ public class PercolatorIT extends ESIntegTestCase { return doc; } - // issue public void testNestedDocFilter() throws IOException { String mapping = "{\n" + " \"doc\": {\n" + @@ -1943,6 +1926,7 @@ public class PercolatorIT extends ESIntegTestCase { .setSettings(settings)); client().prepareIndex("test", PercolatorService.TYPE_NAME) .setSource(jsonBuilder().startObject().field("query", matchQuery("field1", "value")).endObject()).get(); + refresh(); logger.info("--> Percolate doc with field1=value"); PercolateResponse response1 = client().preparePercolate() .setIndices("test").setDocumentType("type") @@ -1994,6 +1978,7 @@ public class PercolatorIT extends ESIntegTestCase { client().prepareIndex("index", PercolatorService.TYPE_NAME, "1") .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .execute().actionGet(); + refresh(); // Just percolating a document that has a _parent field in its mapping should just work: PercolateResponse response = client().preparePercolate() diff --git a/core/src/test/java/org/elasticsearch/percolator/PercolatorQueryTests.java b/core/src/test/java/org/elasticsearch/percolator/PercolatorQueryTests.java new file mode 100644 index 00000000000..170b0be30df --- /dev/null +++ b/core/src/test/java/org/elasticsearch/percolator/PercolatorQueryTests.java @@ -0,0 +1,258 @@ +/* + * 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.percolator; + +import org.apache.lucene.analysis.core.WhitespaceAnalyzer; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.FieldType; +import org.apache.lucene.document.StoredField; +import org.apache.lucene.document.StringField; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexOptions; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.NoMergePolicy; +import org.apache.lucene.index.Term; +import org.apache.lucene.index.memory.MemoryIndex; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.Explanation; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.MatchAllDocsQuery; +import org.apache.lucene.search.PhraseQuery; +import org.apache.lucene.search.PrefixQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.search.WildcardQuery; +import org.apache.lucene.store.Directory; +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.index.mapper.ParseContext; +import org.elasticsearch.index.mapper.Uid; +import org.elasticsearch.index.mapper.internal.UidFieldMapper; +import org.elasticsearch.index.percolator.ExtractQueryTermsService; +import org.elasticsearch.test.ESTestCase; +import org.junit.After; +import org.junit.Before; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; + +public class PercolatorQueryTests extends ESTestCase { + + public final static String EXTRACTED_TERMS_FIELD_NAME = "extracted_terms"; + public final static String UNKNOWN_QUERY_FIELD_NAME = "unknown_query"; + public static FieldType EXTRACTED_TERMS_FIELD_TYPE = new FieldType(); + + static { + EXTRACTED_TERMS_FIELD_TYPE.setTokenized(false); + EXTRACTED_TERMS_FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); + EXTRACTED_TERMS_FIELD_TYPE.freeze(); + } + + private Directory directory; + private IndexWriter indexWriter; + private Map queries; + private DirectoryReader directoryReader; + + @Before + public void init() throws Exception { + directory = newDirectory(); + queries = new HashMap<>(); + IndexWriterConfig config = new IndexWriterConfig(new WhitespaceAnalyzer()); + config.setMergePolicy(NoMergePolicy.INSTANCE); + indexWriter = new IndexWriter(directory, config); + } + + @After + public void destroy() throws Exception { + directoryReader.close(); + directory.close(); + } + + public void testVariousQueries() throws Exception { + addPercolatorQuery("1", new TermQuery(new Term("field", "brown"))); + addPercolatorQuery("2", new TermQuery(new Term("field", "monkey"))); + addPercolatorQuery("3", new TermQuery(new Term("field", "fox"))); + BooleanQuery.Builder bq1 = new BooleanQuery.Builder(); + bq1.add(new TermQuery(new Term("field", "fox")), BooleanClause.Occur.SHOULD); + bq1.add(new TermQuery(new Term("field", "monkey")), BooleanClause.Occur.SHOULD); + addPercolatorQuery("4", bq1.build()); + BooleanQuery.Builder bq2 = new BooleanQuery.Builder(); + bq2.add(new TermQuery(new Term("field", "fox")), BooleanClause.Occur.MUST); + bq2.add(new TermQuery(new Term("field", "monkey")), BooleanClause.Occur.MUST); + addPercolatorQuery("5", bq2.build()); + BooleanQuery.Builder bq3 = new BooleanQuery.Builder(); + bq3.add(new TermQuery(new Term("field", "fox")), BooleanClause.Occur.MUST); + bq3.add(new TermQuery(new Term("field", "apes")), BooleanClause.Occur.MUST_NOT); + addPercolatorQuery("6", bq3.build()); + BooleanQuery.Builder bq4 = new BooleanQuery.Builder(); + bq4.add(new TermQuery(new Term("field", "fox")), BooleanClause.Occur.MUST_NOT); + bq4.add(new TermQuery(new Term("field", "apes")), BooleanClause.Occur.MUST); + addPercolatorQuery("7", bq4.build()); + PhraseQuery.Builder pq1 = new PhraseQuery.Builder(); + pq1.add(new Term("field", "lazy")); + pq1.add(new Term("field", "dog")); + addPercolatorQuery("8", pq1.build()); + + indexWriter.close(); + directoryReader = DirectoryReader.open(directory); + IndexSearcher shardSearcher = newSearcher(directoryReader); + + MemoryIndex memoryIndex = new MemoryIndex(); + memoryIndex.addField("field", "the quick brown fox jumps over the lazy dog", new WhitespaceAnalyzer()); + IndexSearcher percolateSearcher = memoryIndex.createSearcher(); + + PercolatorQuery.Builder builder = new PercolatorQuery.Builder( + percolateSearcher, + queries, + new MatchAllDocsQuery() + ); + builder.extractQueryTermsQuery(EXTRACTED_TERMS_FIELD_NAME, UNKNOWN_QUERY_FIELD_NAME); + TopDocs topDocs = shardSearcher.search(builder.build(), 10); + assertThat(topDocs.totalHits, equalTo(5)); + assertThat(topDocs.scoreDocs.length, equalTo(5)); + assertThat(topDocs.scoreDocs[0].doc, equalTo(0)); + assertThat(topDocs.scoreDocs[1].doc, equalTo(2)); + assertThat(topDocs.scoreDocs[2].doc, equalTo(3)); + assertThat(topDocs.scoreDocs[3].doc, equalTo(5)); + assertThat(topDocs.scoreDocs[4].doc, equalTo(7)); + } + + public void testWithScoring() throws Exception { + addPercolatorQuery("1", new TermQuery(new Term("field", "brown")), "field", "value1"); + + indexWriter.close(); + directoryReader = DirectoryReader.open(directory); + IndexSearcher shardSearcher = newSearcher(directoryReader); + + MemoryIndex memoryIndex = new MemoryIndex(); + memoryIndex.addField("field", "the quick brown fox jumps over the lazy dog", new WhitespaceAnalyzer()); + IndexSearcher percolateSearcher = memoryIndex.createSearcher(); + + PercolatorQuery.Builder builder = new PercolatorQuery.Builder( + percolateSearcher, + queries, + new MatchAllDocsQuery() + ); + builder.extractQueryTermsQuery(EXTRACTED_TERMS_FIELD_NAME, UNKNOWN_QUERY_FIELD_NAME); + builder.setPercolateQuery(new TermQuery(new Term("field", "value1"))); + + PercolatorQuery percolatorQuery = builder.build(); + TopDocs topDocs = shardSearcher.search(percolatorQuery, 1); + assertThat(topDocs.totalHits, equalTo(1)); + assertThat(topDocs.scoreDocs.length, equalTo(1)); + assertThat(topDocs.scoreDocs[0].doc, equalTo(0)); + assertThat(topDocs.scoreDocs[0].score, not(1f)); + + Explanation explanation = shardSearcher.explain(percolatorQuery, 0); + assertThat(explanation.isMatch(), is(true)); + assertThat(explanation.getValue(), equalTo(topDocs.scoreDocs[0].score)); + } + + public void testDuel() throws Exception { + int numQueries = scaledRandomIntBetween(32, 256); + for (int i = 0; i < numQueries; i++) { + String id = Integer.toString(i); + Query query; + if (randomBoolean()) { + query = new PrefixQuery(new Term("field", id)); + } else if (randomBoolean()) { + query = new WildcardQuery(new Term("field", id + "*")); + } else if (randomBoolean()) { + query = new CustomQuery(new Term("field", id + "*")); + } else { + query = new TermQuery(new Term("field", id)); + } + addPercolatorQuery(id, query); + } + + indexWriter.close(); + directoryReader = DirectoryReader.open(directory); + IndexSearcher shardSearcher = newSearcher(directoryReader); + + for (int i = 0; i < numQueries; i++) { + MemoryIndex memoryIndex = new MemoryIndex(); + String id = Integer.toString(i); + memoryIndex.addField("field", id, new WhitespaceAnalyzer()); + IndexSearcher percolateSearcher = memoryIndex.createSearcher(); + + PercolatorQuery.Builder builder1 = new PercolatorQuery.Builder( + percolateSearcher, + queries, + new MatchAllDocsQuery() + ); + // enables the optimization that prevents queries from being evaluated that don't match + builder1.extractQueryTermsQuery(EXTRACTED_TERMS_FIELD_NAME, UNKNOWN_QUERY_FIELD_NAME); + TopDocs topDocs1 = shardSearcher.search(builder1.build(), 10); + + PercolatorQuery.Builder builder2 = new PercolatorQuery.Builder( + percolateSearcher, + queries, + new MatchAllDocsQuery() + ); + TopDocs topDocs2 = shardSearcher.search(builder2.build(), 10); + + assertThat(topDocs1.totalHits, equalTo(topDocs2.totalHits)); + assertThat(topDocs1.scoreDocs.length, equalTo(topDocs2.scoreDocs.length)); + for (int j = 0; j < topDocs1.scoreDocs.length; j++) { + assertThat(topDocs1.scoreDocs[j].doc, equalTo(topDocs2.scoreDocs[j].doc)); + } + } + } + + void addPercolatorQuery(String id, Query query, String... extraFields) throws IOException { + queries.put(new BytesRef(id), query); + ParseContext.Document document = new ParseContext.Document(); + ExtractQueryTermsService.extractQueryTerms(query, document, EXTRACTED_TERMS_FIELD_NAME, UNKNOWN_QUERY_FIELD_NAME, EXTRACTED_TERMS_FIELD_TYPE); + document.add(new StoredField(UidFieldMapper.NAME, Uid.createUid(PercolatorService.TYPE_NAME, id))); + assert extraFields.length % 2 == 0; + for (int i = 0; i < extraFields.length; i++) { + document.add(new StringField(extraFields[i], extraFields[++i], Field.Store.NO)); + } + indexWriter.addDocument(document); + } + + private final static class CustomQuery extends Query { + + private final Term term; + + private CustomQuery(Term term) { + this.term = term; + } + + @Override + public Query rewrite(IndexReader reader) throws IOException { + return new TermQuery(term); + } + + @Override + public String toString(String field) { + return "custom{" + field + "}"; + } + } + +} diff --git a/core/src/test/java/org/elasticsearch/percolator/PercolatorServiceTests.java b/core/src/test/java/org/elasticsearch/percolator/PercolatorServiceTests.java new file mode 100644 index 00000000000..49635abc8de --- /dev/null +++ b/core/src/test/java/org/elasticsearch/percolator/PercolatorServiceTests.java @@ -0,0 +1,176 @@ +/* + * 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.percolator; + +import org.apache.lucene.analysis.core.WhitespaceAnalyzer; +import org.apache.lucene.document.FieldType; +import org.apache.lucene.document.StoredField; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexOptions; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.NoMergePolicy; +import org.apache.lucene.index.Term; +import org.apache.lucene.index.memory.MemoryIndex; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.MatchAllDocsQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.store.Directory; +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.Version; +import org.elasticsearch.action.percolate.PercolateShardResponse; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.Index; +import org.elasticsearch.index.IndexSettings; +import org.elasticsearch.index.analysis.AnalysisService; +import org.elasticsearch.index.analysis.AnalyzerProvider; +import org.elasticsearch.index.analysis.CharFilterFactory; +import org.elasticsearch.index.analysis.TokenFilterFactory; +import org.elasticsearch.index.analysis.TokenizerFactory; +import org.elasticsearch.index.engine.Engine; +import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.index.mapper.ParseContext; +import org.elasticsearch.index.mapper.Uid; +import org.elasticsearch.index.mapper.internal.UidFieldMapper; +import org.elasticsearch.index.percolator.PercolatorFieldMapper; +import org.elasticsearch.index.percolator.PercolatorQueriesRegistry; +import org.elasticsearch.index.percolator.ExtractQueryTermsService; +import org.elasticsearch.index.shard.ShardId; +import org.elasticsearch.index.similarity.SimilarityService; +import org.elasticsearch.indices.IndicesModule; +import org.elasticsearch.search.SearchShardTarget; +import org.elasticsearch.search.internal.ContextIndexSearcher; +import org.elasticsearch.test.ESTestCase; +import org.junit.After; +import org.junit.Before; + +import java.io.IOException; +import java.util.Collections; + +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class PercolatorServiceTests extends ESTestCase { + + private Directory directory; + private IndexWriter indexWriter; + private DirectoryReader directoryReader; + + @Before + public void init() throws Exception { + directory = newDirectory(); + IndexWriterConfig config = new IndexWriterConfig(new WhitespaceAnalyzer()); + config.setMergePolicy(NoMergePolicy.INSTANCE); + indexWriter = new IndexWriter(directory, config); + } + + @After + public void destroy() throws Exception { + directoryReader.close(); + directory.close(); + } + + public void testCount() throws Exception { + PercolateContext context = mock(PercolateContext.class); + when(context.shardTarget()).thenReturn(new SearchShardTarget("_id", "_index", 0)); + when(context.percolatorTypeFilter()).thenReturn(new MatchAllDocsQuery()); + when(context.isOnlyCount()).thenReturn(true); + + PercolatorQueriesRegistry registry = createRegistry(); + addPercolatorQuery("1", new TermQuery(new Term("field", "brown")), indexWriter, registry); + addPercolatorQuery("2", new TermQuery(new Term("field", "fox")), indexWriter, registry); + addPercolatorQuery("3", new TermQuery(new Term("field", "monkey")), indexWriter, registry); + + indexWriter.close(); + directoryReader = DirectoryReader.open(directory); + IndexSearcher shardSearcher = newSearcher(directoryReader); + when(context.searcher()).thenReturn(new ContextIndexSearcher(new Engine.Searcher("test", shardSearcher), shardSearcher.getQueryCache(), shardSearcher.getQueryCachingPolicy())); + + MemoryIndex memoryIndex = new MemoryIndex(); + memoryIndex.addField("field", "the quick brown fox jumps over the lazy dog", new WhitespaceAnalyzer()); + IndexSearcher percolateSearcher = memoryIndex.createSearcher(); + when(context.docSearcher()).thenReturn(percolateSearcher); + + PercolateShardResponse response = PercolatorService.doPercolate(context, registry, null, null, null); + assertThat(response.topDocs().totalHits, equalTo(2)); + } + + public void testTopMatching() throws Exception { + PercolateContext context = mock(PercolateContext.class); + when(context.shardTarget()).thenReturn(new SearchShardTarget("_id", "_index", 0)); + when(context.percolatorTypeFilter()).thenReturn(new MatchAllDocsQuery()); + when(context.size()).thenReturn(10); + + PercolatorQueriesRegistry registry = createRegistry(); + addPercolatorQuery("1", new TermQuery(new Term("field", "brown")), indexWriter, registry); + addPercolatorQuery("2", new TermQuery(new Term("field", "monkey")), indexWriter, registry); + addPercolatorQuery("3", new TermQuery(new Term("field", "fox")), indexWriter, registry); + + indexWriter.close(); + directoryReader = DirectoryReader.open(directory); + IndexSearcher shardSearcher = newSearcher(directoryReader); + when(context.searcher()).thenReturn(new ContextIndexSearcher(new Engine.Searcher("test", shardSearcher), shardSearcher.getQueryCache(), shardSearcher.getQueryCachingPolicy())); + + MemoryIndex memoryIndex = new MemoryIndex(); + memoryIndex.addField("field", "the quick brown fox jumps over the lazy dog", new WhitespaceAnalyzer()); + IndexSearcher percolateSearcher = memoryIndex.createSearcher(); + when(context.docSearcher()).thenReturn(percolateSearcher); + + PercolateShardResponse response = PercolatorService.doPercolate(context, registry, null, null, null); + TopDocs topDocs = response.topDocs(); + assertThat(topDocs.totalHits, equalTo(2)); + assertThat(topDocs.scoreDocs.length, equalTo(2)); + assertThat(topDocs.scoreDocs[0].doc, equalTo(0)); + assertThat(topDocs.scoreDocs[1].doc, equalTo(2)); + } + + void addPercolatorQuery(String id, Query query, IndexWriter writer, PercolatorQueriesRegistry registry) throws IOException { + registry.getPercolateQueries().put(new BytesRef(id), query); + ParseContext.Document document = new ParseContext.Document(); + FieldType extractedQueryTermsFieldType = new FieldType(); + extractedQueryTermsFieldType.setTokenized(false); + extractedQueryTermsFieldType.setIndexOptions(IndexOptions.DOCS); + extractedQueryTermsFieldType.freeze(); + ExtractQueryTermsService.extractQueryTerms(query, document, PercolatorFieldMapper.EXTRACTED_TERMS_FULL_FIELD_NAME, PercolatorFieldMapper.UNKNOWN_QUERY_FULL_FIELD_NAME, extractedQueryTermsFieldType); + document.add(new StoredField(UidFieldMapper.NAME, Uid.createUid(PercolatorService.TYPE_NAME, id))); + writer.addDocument(document); + } + + PercolatorQueriesRegistry createRegistry() { + Index index = new Index("_index"); + IndexSettings indexSettings = new IndexSettings(new IndexMetaData.Builder("_index").settings( + Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1) + .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 1) + .put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)) + .build(), + Settings.EMPTY, Collections.emptyList() + ); + return new PercolatorQueriesRegistry( + new ShardId(index, 0), + indexSettings, + null + ); + } + +} diff --git a/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java index 6a0485133a2..6ddd5b71b7c 100644 --- a/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java @@ -136,7 +136,7 @@ public class RecoveryPercolatorIT extends ESIntegTestCase { DeleteIndexResponse actionGet = client().admin().indices().prepareDelete("test").get(); assertThat(actionGet.isAcknowledged(), equalTo(true)); - client().admin().indices().prepareCreate("test").setSettings(settingsBuilder().put("index.number_of_shards", 1)).get(); + assertAcked(prepareCreate("test").addMapping("type1", "field1", "type=string").addMapping(PercolatorService.TYPE_NAME, "color", "type=string")); clusterHealth = client().admin().cluster().health(clusterHealthRequest().waitForYellowStatus().waitForActiveShards(1)).actionGet(); logger.info("Done Cluster Health, status " + clusterHealth.getStatus()); assertThat(clusterHealth.isTimedOut(), equalTo(false)); @@ -193,6 +193,7 @@ public class RecoveryPercolatorIT extends ESIntegTestCase { .endObject()) .get(); } + refresh(); logger.info("--> Percolate doc with field1=95"); PercolateResponse response = client().preparePercolate() @@ -249,6 +250,7 @@ public class RecoveryPercolatorIT extends ESIntegTestCase { .setSource(jsonBuilder().startObject().field("query", matchAllQuery()).endObject()) .get(); } + refresh(); final String document = "{\"field\" : \"a\"}"; client.prepareIndex("test", "type", "1") @@ -269,7 +271,7 @@ public class RecoveryPercolatorIT extends ESIntegTestCase { for (int i = 0; i < numPercolateRequest; i++) { PercolateRequestBuilder percolateBuilder = client.preparePercolate() - .setIndices("test").setDocumentType("type"); + .setIndices("test").setDocumentType("type").setSize(numQueries); if (randomBoolean()) { percolateBuilder.setGetRequest(Requests.getRequest("test").type("type").id("1")); } else { @@ -289,7 +291,7 @@ public class RecoveryPercolatorIT extends ESIntegTestCase { } } else { PercolateRequestBuilder percolateBuilder = client.preparePercolate() - .setIndices("test").setDocumentType("type"); + .setIndices("test").setDocumentType("type").setSize(numQueries); if (randomBoolean()) { percolateBuilder.setPercolateDoc(docBuilder().setDoc(document)); } else { diff --git a/core/src/test/java/org/elasticsearch/percolator/TTLPercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/TTLPercolatorIT.java index 4b4d4a84237..43ca89923f2 100644 --- a/core/src/test/java/org/elasticsearch/percolator/TTLPercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/TTLPercolatorIT.java @@ -182,7 +182,7 @@ public class TTLPercolatorIT extends ESIntegTestCase { .endObject() .endObject() .endObject() - ).setTTL(randomIntBetween(1, 500)).execute().actionGet(); + ).setTTL(randomIntBetween(1, 500)).setRefresh(true).execute().actionGet(); } catch (MapperParsingException e) { logger.info("failed indexing {}", i, e); // if we are unlucky the TTL is so small that we see the expiry date is already in the past when diff --git a/core/src/test/resources/indices/percolator/bwc_index_2.0.0.zip b/core/src/test/resources/indices/percolator/bwc_index_2.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..f0e2d05e4af67090989764c457e1ca1cdcd26639 GIT binary patch literal 9772 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 literal 0 HcmV?d00001 diff --git a/docs/reference/migration/migrate_3_0.asciidoc b/docs/reference/migration/migrate_3_0.asciidoc index 190f440a8fd..e0e6c720401 100644 --- a/docs/reference/migration/migrate_3_0.asciidoc +++ b/docs/reference/migration/migrate_3_0.asciidoc @@ -578,3 +578,19 @@ balancing into account but don't assign the shard if the allocation deciders are in the case where shard copies can be found. Previously, a node not holding the shard copy was chosen if none of the nodes holding shard copies were satisfying the allocation deciders. Now, the shard will be assigned to a node having a shard copy, even if none of the nodes holding a shard copy satisfy the allocation deciders. + +=== Percolator + +Adding percolator queries and modifications to existing percolator queries are no longer visible in immediately +to the percolator. A refresh is required to run before the changes are visible to the percolator. + +The reason that this has changed is that on newly created indices the percolator automatically indexes the query terms +and these query terms are used at percolate time to reduce the amount of queries the percolate API needs evaluate. +This optimization didn't work in the percolate API mode where modifications to queries are immediately visible. + +The percolator by defaults sets the `size` option to `10` whereas before this was set to unlimited. + +The percolate api can no longer accept documents that have fields that don't exist in the mapping. + +When percolating an existing document then specifying a document in the source of the percolate request is not allowed +any more. \ No newline at end of file diff --git a/docs/reference/search/percolate.asciidoc b/docs/reference/search/percolate.asciidoc index dc4a14e335d..7f160d1a503 100644 --- a/docs/reference/search/percolate.asciidoc +++ b/docs/reference/search/percolate.asciidoc @@ -1,6 +1,12 @@ [[search-percolate]] == Percolator +added[3.0.0,Percolator queries modifications aren't visible immediately and a refresh is required] + +added[3.0.0,Percolate api by defaults limits the number of matches to `10` whereas before this wasn't set] + +added[3.0.0,For indices created on or after version 3.0.0 the percolator automatically indexes the query terms with the percolator queries this allows the percolator to percolate documents quicker. It is advisable to reindex any pre 3.0.0 indices to take advantage of this new optimization] + Traditionally you design documents based on your data, store them into an index, and then define queries via the search API in order to retrieve these documents. The percolator works in the opposite direction. First you store queries into an index and then, via the percolate API, you define documents in order to retrieve these queries. @@ -10,9 +16,6 @@ JSON. This allows you to embed queries into documents via the index API. Elastic document and make it available to the percolate API. Since documents are also defined as JSON, you can define a document in a request to the percolate API. -The percolator and most of its features work in realtime, so once a percolate query is indexed it can immediately be used -in the percolate API. - [IMPORTANT] ===================================== @@ -219,7 +222,7 @@ filter will be included in the percolate execution. The filter option works in n occurred for the filter to included the latest percolate queries. * `query` - Same as the `filter` option, but also the score is computed. The computed scores can then be used by the `track_scores` and `sort` option. -* `size` - Defines to maximum number of matches (percolate queries) to be returned. Defaults to unlimited. +* `size` - Defines to maximum number of matches (percolate queries) to be returned. Defaults to 10. * `track_scores` - Whether the `_score` is included for each match. The `_score` is based on the query and represents how the query matched the *percolate query's metadata*, *not* how the document (that is being percolated) matched the query. The `query` option is required for this option. Defaults to `false`. @@ -310,6 +313,10 @@ document. Internally the percolate API will issue a GET request for fetching the `_source` of the document to percolate. For this feature to work, the `_source` for documents to be percolated needs to be stored. +If percolating an existing document and the a document is also specified in the source of the percolate request then +an error is thrown. Either the document to percolate should be specified in the source or be defined by specifying the +index, type and id. + [float] ==== Example @@ -379,13 +386,11 @@ requests.txt: {"percolate" : {"index" : "twitter", "type" : "tweet"}} {"doc" : {"message" : "some text"}} {"percolate" : {"index" : "twitter", "type" : "tweet", "id" : "1"}} -{} {"percolate" : {"index" : "users", "type" : "user", "id" : "3", "percolate_index" : "users_2012" }} {"size" : 10} {"count" : {"index" : "twitter", "type" : "tweet"}} {"doc" : {"message" : "some other text"}} {"count" : {"index" : "twitter", "type" : "tweet", "id" : "1"}} -{} -------------------------------------------------- For a percolate existing document item (headers with the `id` field), the response can be an empty JSON object. diff --git a/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryParserTests.java b/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryParserTests.java index 29213f0ac0e..66c3376f04e 100644 --- a/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryParserTests.java +++ b/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/TemplateQueryParserTests.java @@ -128,7 +128,7 @@ public class TemplateQueryParserTests extends ESTestCase { ScriptService scriptService = injector.getInstance(ScriptService.class); SimilarityService similarityService = new SimilarityService(idxSettings, Collections.emptyMap()); MapperRegistry mapperRegistry = new IndicesModule().getMapperRegistry(); - MapperService mapperService = new MapperService(idxSettings, analysisService, similarityService, mapperRegistry); + MapperService mapperService = new MapperService(idxSettings, analysisService, similarityService, mapperRegistry, () -> context); IndexFieldDataService indexFieldDataService =new IndexFieldDataService(idxSettings, injector.getInstance(IndicesFieldDataCache.class), injector.getInstance(CircuitBreakerService.class), mapperService); BitsetFilterCache bitsetFilterCache = new BitsetFilterCache(idxSettings, new IndicesWarmer(idxSettings.getNodeSettings(), null), new BitsetFilterCache.Listener() { @Override diff --git a/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java b/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java index 603fcbbf820..1b54b8293a7 100644 --- a/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java +++ b/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java @@ -52,7 +52,7 @@ public class Murmur3FieldMapperTests extends ESSingleNodeTestCase { Collections.singletonMap(Murmur3FieldMapper.CONTENT_TYPE, new Murmur3FieldMapper.TypeParser()), Collections.emptyMap()); parser = new DocumentMapperParser(indexService.getIndexSettings(), indexService.mapperService(), - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); } public void testDefaults() throws Exception { @@ -128,7 +128,7 @@ public class Murmur3FieldMapperTests extends ESSingleNodeTestCase { Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_1_4_2.id).build(); indexService = createIndex("test_bwc", settings); parser = new DocumentMapperParser(indexService.getIndexSettings(), indexService.mapperService(), - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); String mapping = XContentFactory.jsonBuilder().startObject().startObject("type") .startObject("properties").startObject("field") .field("type", "murmur3") @@ -144,7 +144,7 @@ public class Murmur3FieldMapperTests extends ESSingleNodeTestCase { Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_1_4_2.id).build(); indexService = createIndex("test_bwc", settings); parser = new DocumentMapperParser(indexService.getIndexSettings(), indexService.mapperService(), - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); String mapping = XContentFactory.jsonBuilder().startObject().startObject("type") .startObject("properties").startObject("field") .field("type", "murmur3") diff --git a/plugins/mapper-size/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java b/plugins/mapper-size/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java index 403eb284f96..956dd29402b 100644 --- a/plugins/mapper-size/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java +++ b/plugins/mapper-size/src/test/java/org/elasticsearch/index/mapper/size/SizeMappingTests.java @@ -58,7 +58,7 @@ public class SizeMappingTests extends ESSingleNodeTestCase { Map metadataMappers = new HashMap<>(); IndicesModule indices = new IndicesModule(); indices.registerMetadataMapper(SizeFieldMapper.NAME, new SizeFieldMapper.TypeParser()); - mapperService = new MapperService(indexService.getIndexSettings(), indexService.analysisService(), indexService.similarityService(), indices.getMapperRegistry()); + mapperService = new MapperService(indexService.getIndexSettings(), indexService.analysisService(), indexService.similarityService(), indices.getMapperRegistry(), indexService::getQueryShardContext); parser = mapperService.documentMapperParser(); } @@ -90,7 +90,7 @@ public class SizeMappingTests extends ESSingleNodeTestCase { Collections.emptyMap(), Collections.singletonMap(SizeFieldMapper.NAME, new SizeFieldMapper.TypeParser())); parser = new DocumentMapperParser(indexService.getIndexSettings(), mapperService, - indexService.analysisService(), indexService.similarityService(), mapperRegistry); + indexService.analysisService(), indexService.similarityService(), mapperRegistry, indexService::getQueryShardContext); DocumentMapper docMapper = parser.parse("type", new CompressedXContent(mapping)); BytesReference source = XContentFactory.jsonBuilder() diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/mpercolate/10_basic.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/mpercolate/10_basic.yaml index fef50208749..66d62e49635 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/mpercolate/10_basic.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/mpercolate/10_basic.yaml @@ -16,6 +16,9 @@ query: match_all: {} + - do: + indices.refresh: {} + - do: mpercolate: body: @@ -33,8 +36,7 @@ index: percolator_index type: my_type id: 1 - - doc: - foo: bar + - {} - match: { responses.0.total: 1 } - match: { responses.1.error.root_cause.0.type: index_not_found_exception } diff --git a/test/framework/build.gradle b/test/framework/build.gradle index 5039036be46..7356a384574 100644 --- a/test/framework/build.gradle +++ b/test/framework/build.gradle @@ -30,6 +30,7 @@ dependencies { compile "org.apache.httpcomponents:httpcore:${versions.httpcore}" compile "commons-logging:commons-logging:${versions.commonslogging}" compile "commons-codec:commons-codec:${versions.commonscodec}" + compile 'org.elasticsearch:securemock:1.2' } compileJava.options.compilerArgs << '-Xlint:-cast,-deprecation,-fallthrough,-overrides,-rawtypes,-serial,-try,-unchecked' diff --git a/test/framework/src/main/java/org/elasticsearch/index/MapperTestUtils.java b/test/framework/src/main/java/org/elasticsearch/index/MapperTestUtils.java index 8b529f9fc8f..1c110bc405a 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/MapperTestUtils.java +++ b/test/framework/src/main/java/org/elasticsearch/index/MapperTestUtils.java @@ -58,6 +58,7 @@ public class MapperTestUtils { return new MapperService(indexSettings, analysisService, similarityService, - mapperRegistry); + mapperRegistry, + () -> null); } } From cd56366378c446777d7a05fc7ebbf94df7b1e811 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 09:49:52 -0500 Subject: [PATCH 11/59] Assert that we fail the correct shard when a replication request fails This commit adds an assertion to TransportReplicationActionTests#runReplicateTest that when a replication request fails, we fail the correct shard. --- .../cluster/action/shard/ShardStateAction.java | 4 ++++ .../replication/TransportReplicationActionTests.java | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/core/src/main/java/org/elasticsearch/cluster/action/shard/ShardStateAction.java b/core/src/main/java/org/elasticsearch/cluster/action/shard/ShardStateAction.java index 58b766e8d84..00a238504f2 100644 --- a/core/src/main/java/org/elasticsearch/cluster/action/shard/ShardStateAction.java +++ b/core/src/main/java/org/elasticsearch/cluster/action/shard/ShardStateAction.java @@ -302,6 +302,10 @@ public class ShardStateAction extends AbstractComponent { this.failure = failure; } + public ShardRouting getShardRouting() { + return shardRouting; + } + @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); diff --git a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java index fdcf4b07245..4b5b03857d9 100644 --- a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java +++ b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java @@ -418,6 +418,7 @@ public class TransportReplicationActionTests extends ESTestCase { } } + @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/15790") public void testReplication() throws ExecutionException, InterruptedException { final String index = "test"; final ShardId shardId = new ShardId(index, 0); @@ -441,6 +442,7 @@ public class TransportReplicationActionTests extends ESTestCase { runReplicateTest(shardRoutingTable, assignedReplicas, totalShards); } + @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/15790") public void testReplicationWithShadowIndex() throws ExecutionException, InterruptedException { final String index = "test"; final ShardId shardId = new ShardId(index, 0); @@ -511,6 +513,12 @@ public class TransportReplicationActionTests extends ESTestCase { transport.clear(); assertEquals(1, shardFailedRequests.length); CapturingTransport.CapturedRequest shardFailedRequest = shardFailedRequests[0]; + // get the shard the request was sent to + ShardRouting routing = clusterService.state().getRoutingNodes().node(capturedRequest.node.id()).get(request.shardId.id()); + // and the shard that was requested to be failed + ShardStateAction.ShardRoutingEntry shardRoutingEntry = (ShardStateAction.ShardRoutingEntry)shardFailedRequest.request; + // the shard the request was sent to and the shard to be failed should be the same + assertTrue(shardRoutingEntry.getShardRouting().isSameAllocation(routing)); failures.add(shardFailedRequest); transport.handleResponse(shardFailedRequest.requestId, TransportResponse.Empty.INSTANCE); } From 247ce06fc3bd891b3b15a82ff1482ad6cd573bfb Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 6 Jan 2016 18:00:00 +0100 Subject: [PATCH 12/59] percolator: if size is 0 then use TotalHitCountCollector Fixes PercolateIT#testPercolateSizingWithQueryAndFilter test --- .../java/org/elasticsearch/percolator/PercolatorService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java b/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java index fd07d54a7d1..e6ffa313e83 100644 --- a/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java +++ b/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java @@ -254,7 +254,7 @@ public class PercolatorService extends AbstractComponent { } PercolatorQuery percolatorQuery = builder.build(); - if (context.isOnlyCount()) { + if (context.isOnlyCount() || context.size() == 0) { TotalHitCountCollector collector = new TotalHitCountCollector(); context.searcher().search(percolatorQuery, MultiCollector.wrap(collector, aggregatorCollector)); if (aggregatorCollector != null) { From 23a64f8214a990907ece74d00294f7dc3b25ed92 Mon Sep 17 00:00:00 2001 From: Damien Alexandre Date: Wed, 6 Jan 2016 18:26:03 +0100 Subject: [PATCH 13/59] Fix french analyzer elision token filter doc Fix #15774 --- .../analysis/analyzers/lang-analyzer.asciidoc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/reference/analysis/analyzers/lang-analyzer.asciidoc b/docs/reference/analysis/analyzers/lang-analyzer.asciidoc index 69388ffa7a1..d1eb1acff9e 100644 --- a/docs/reference/analysis/analyzers/lang-analyzer.asciidoc +++ b/docs/reference/analysis/analyzers/lang-analyzer.asciidoc @@ -619,11 +619,13 @@ The `french` analyzer could be reimplemented as a `custom` analyzer as follows: "analysis": { "filter": { "french_elision": { - "type": "elision", - "articles": [ "l", "m", "t", "qu", "n", "s", - "j", "d", "c", "jusqu", "quoiqu", - "lorsqu", "puisqu" - ] + "type": "elision", + "articles_case": true, + "articles": [ + "l", "m", "t", "qu", "n", "s", + "j", "d", "c", "jusqu", "quoiqu", + "lorsqu", "puisqu" + ] }, "french_stop": { "type": "stop", From 81cffd1be367e0ada344bc614bb5f3bbf559257e Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 6 Jan 2016 18:30:04 +0100 Subject: [PATCH 14/59] test: mute test --- .../org/elasticsearch/percolator/ConcurrentPercolatorIT.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java index a7f50d33608..031b305864c 100644 --- a/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java @@ -148,6 +148,7 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { assertThat(assertionError + " should be null", assertionError, nullValue()); } + @AwaitsFix(bugUrl = "reproduces= -Dtests.seed=DA9C1BDEB045305C") public void testConcurrentAddingAndPercolating() throws Exception { assertAcked(prepareCreate("index").addMapping("type", "field1", "type=string", "field2", "type=string")); ensureGreen(); From f5898fb07fde8ca32ff626a0c39207b852500cf9 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 12:32:09 -0500 Subject: [PATCH 15/59] [highlighting] Test for boundary chars --- .../search/highlight/HighlighterSearchIT.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java b/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java index 41fe4975e4b..008aac38832 100644 --- a/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java +++ b/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java @@ -19,6 +19,7 @@ package org.elasticsearch.search.highlight; import com.carrotsearch.randomizedtesting.generators.RandomPicks; + import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; @@ -802,9 +803,8 @@ public class HighlighterSearchIT extends ESIntegTestCase { assertAcked(prepareCreate("test").addMapping("type1", type1TermVectorMapping())); ensureGreen(); - client().prepareIndex("test", "type1") - .setSource("field1", "this is a test", "field2", "The quick brown fox jumps over the lazy dog").get(); - refresh(); + indexRandom(true, client().prepareIndex("test", "type1") + .setSource("field1", "this is a test", "field2", "The quick brown fox jumps over the lazy dog")); logger.info("--> highlighting and searching on field1"); SearchSourceBuilder source = searchSource() @@ -822,7 +822,6 @@ public class HighlighterSearchIT extends ESIntegTestCase { searchResponse = client().prepareSearch("test").setSource(source).get(); - // LUCENE 3.1 UPGRADE: Caused adding the space at the end... assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("this is a test")); logger.info("--> searching on _all, highlighting on field2"); @@ -832,7 +831,6 @@ public class HighlighterSearchIT extends ESIntegTestCase { searchResponse = client().prepareSearch("test").setSource(source).get(); - // LUCENE 3.1 UPGRADE: Caused adding the space at the end... assertHighlight(searchResponse, 0, "field2", 0, 1, equalTo("The quick brown fox jumps over the lazy dog")); logger.info("--> searching on _all, highlighting on field2"); @@ -842,8 +840,17 @@ public class HighlighterSearchIT extends ESIntegTestCase { searchResponse = client().prepareSearch("test").setSource(source).get(); - // LUCENE 3.1 UPGRADE: Caused adding the space at the end... assertHighlight(searchResponse, 0, "field2", 0, 1, equalTo("The quick brown fox jumps over the lazy dog")); + + logger.info("--> searching with boundary characters"); + source = searchSource() + .query(matchQuery("field2", "quick")) + .highlighter(highlight().field("field2", 30, 1).boundaryChars(new char[] {' '})); + + searchResponse = client().prepareSearch("test").setSource(source).get(); + + assertHighlight(searchResponse, 0, "field2", 0, 1, equalTo("The quick brown fox jumps over")); + } /** From 75106daf9c321b9282a283bd0511f30728213f01 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 10:07:08 -0500 Subject: [PATCH 16/59] Only fail the relocation target when a replication request on it fails This commit addresses an issue when handling a failed replication request against a relocating target shard. Namely, if a replication request fails against the target of a relocation we currently fail both the source and the target. This leads to an unnecessary recovery. Instead, only the target of the relocation should be failed. --- .../support/replication/TransportReplicationAction.java | 7 ++++--- .../replication/TransportReplicationActionTests.java | 2 -- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java b/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java index 6fd7da91645..0014404057f 100644 --- a/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java +++ b/core/src/main/java/org/elasticsearch/action/support/replication/TransportReplicationAction.java @@ -844,11 +844,11 @@ public abstract class TransportReplicationAction Date: Wed, 6 Jan 2016 10:55:38 -0500 Subject: [PATCH 17/59] Assert that replication requests are sent to the correct shard copies This commit adds tighter assertions in TransportReplicationActionTests#runReplicateTest that replication requests are sent to the correct shard copies. --- .../TransportReplicationActionTests.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java index 43623437b27..e586420a6ce 100644 --- a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java +++ b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java @@ -67,6 +67,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -77,6 +78,7 @@ import static org.elasticsearch.action.support.replication.ClusterStateCreationU import static org.elasticsearch.action.support.replication.ClusterStateCreationUtils.stateWithStartedPrimary; import static org.hamcrest.Matchers.arrayWithSize; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; @@ -486,7 +488,37 @@ public class TransportReplicationActionTests extends ESTestCase { replicationPhase.run(); final CapturingTransport.CapturedRequest[] capturedRequests = transport.capturedRequests(); transport.clear(); + assertThat(capturedRequests.length, equalTo(assignedReplicas)); + Set nodesSentTo = new HashSet<>(); + boolean executeOnReplica = + action.shouldExecuteReplication(clusterService.state().getMetaData().index(shardId.getIndex()).getSettings()); + for (CapturingTransport.CapturedRequest capturedRequest : capturedRequests) { + // no duplicate requests + assertTrue(nodesSentTo.add(capturedRequest.node.getId())); + // the request is hitting the correct shard + Request replicationRequest = (Request)capturedRequest.request; + assertEquals(request.shardId, replicationRequest.shardId); + } + + // requests were sent to the correct shard copies + List shards = + clusterService.state().getRoutingTable().index(shardId.getIndex()).shard(shardId.id()).shards(); + for (ShardRouting shard : shards) { + if (!shard.primary() && !executeOnReplica) { + continue; + } + if (shard.unassigned()) { + continue; + } + if (!clusterService.state().getNodes().localNodeId().equals(shard.currentNodeId())) { + assertThat(nodesSentTo, hasItem(shard.currentNodeId())); + } + if (shard.relocating()) { + assertThat(nodesSentTo, hasItem(shard.relocatingNodeId())); + } + } + if (assignedReplicas > 0) { assertThat("listener is done, but there are outstanding replicas", listener.isDone(), equalTo(false)); } From c291c1714295dd0ab7024f50518fc39fa21d742d Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 11:40:07 -0500 Subject: [PATCH 18/59] Cleanup TransportReplicationActionTests#runReplicateTest This commit cleans up some of the assertions in TransportReplicationActionTests#runReplicateTest: - use a Map to track actual vs. expected requests - assert that no request was sent to the local node - use RoutingTable#shardRoutingTable convenience method - explicitly use false in boolean conditions - clarify requests are expected on replica shards when assigned and execution on replicas is true - test ShardRouting equality when checking the failed shard request --- .../TransportReplicationActionTests.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java index e586420a6ce..4f052e9fbd7 100644 --- a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java +++ b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java @@ -65,9 +65,9 @@ import org.junit.BeforeClass; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -76,10 +76,13 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.elasticsearch.action.support.replication.ClusterStateCreationUtils.state; import static org.elasticsearch.action.support.replication.ClusterStateCreationUtils.stateWithStartedPrimary; +import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.Matchers.arrayWithSize; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; @@ -490,35 +493,38 @@ public class TransportReplicationActionTests extends ESTestCase { transport.clear(); assertThat(capturedRequests.length, equalTo(assignedReplicas)); - Set nodesSentTo = new HashSet<>(); + HashMap nodesSentTo = new HashMap<>(); boolean executeOnReplica = action.shouldExecuteReplication(clusterService.state().getMetaData().index(shardId.getIndex()).getSettings()); for (CapturingTransport.CapturedRequest capturedRequest : capturedRequests) { // no duplicate requests - assertTrue(nodesSentTo.add(capturedRequest.node.getId())); + Request replicationRequest = (Request) capturedRequest.request; + assertNull(nodesSentTo.put(capturedRequest.node.getId(), replicationRequest)); // the request is hitting the correct shard - Request replicationRequest = (Request)capturedRequest.request; assertEquals(request.shardId, replicationRequest.shardId); } + // no request was sent to the local node + assertThat(nodesSentTo.keySet(), not(hasItem(clusterService.state().getNodes().localNodeId()))); + // requests were sent to the correct shard copies - List shards = - clusterService.state().getRoutingTable().index(shardId.getIndex()).shard(shardId.id()).shards(); - for (ShardRouting shard : shards) { - if (!shard.primary() && !executeOnReplica) { + for (ShardRouting shard : clusterService.state().getRoutingTable().shardRoutingTable(shardId.getIndex(), shardId.id())) { + if (shard.primary() == false && executeOnReplica == false) { continue; } if (shard.unassigned()) { continue; } - if (!clusterService.state().getNodes().localNodeId().equals(shard.currentNodeId())) { - assertThat(nodesSentTo, hasItem(shard.currentNodeId())); + if (shard.primary() == false) { + nodesSentTo.remove(shard.currentNodeId()); } if (shard.relocating()) { - assertThat(nodesSentTo, hasItem(shard.relocatingNodeId())); + nodesSentTo.remove(shard.relocatingNodeId()); } } + assertThat(nodesSentTo.entrySet(), is(empty())); + if (assignedReplicas > 0) { assertThat("listener is done, but there are outstanding replicas", listener.isDone(), equalTo(false)); } @@ -548,7 +554,7 @@ public class TransportReplicationActionTests extends ESTestCase { // and the shard that was requested to be failed ShardStateAction.ShardRoutingEntry shardRoutingEntry = (ShardStateAction.ShardRoutingEntry)shardFailedRequest.request; // the shard the request was sent to and the shard to be failed should be the same - assertTrue(shardRoutingEntry.getShardRouting().isSameAllocation(routing)); + assertEquals(shardRoutingEntry.getShardRouting(), routing); failures.add(shardFailedRequest); transport.handleResponse(shardFailedRequest.requestId, TransportResponse.Empty.INSTANCE); } From bb4d857e447b64c31812fbbde0af7619b4518aed Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 12:51:01 -0500 Subject: [PATCH 19/59] Redundant assertion in TransportReplicationActionTests#runReplicateTest --- .../support/replication/TransportReplicationActionTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java index 4f052e9fbd7..6ccf48c7930 100644 --- a/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java +++ b/core/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationActionTests.java @@ -492,7 +492,6 @@ public class TransportReplicationActionTests extends ESTestCase { final CapturingTransport.CapturedRequest[] capturedRequests = transport.capturedRequests(); transport.clear(); - assertThat(capturedRequests.length, equalTo(assignedReplicas)); HashMap nodesSentTo = new HashMap<>(); boolean executeOnReplica = action.shouldExecuteReplication(clusterService.state().getMetaData().index(shardId.getIndex()).getSettings()); From 04b79c112fc1c05bc7550032742cdb25edef10d2 Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 6 Jan 2016 19:09:12 +0100 Subject: [PATCH 20/59] test: unmuted test test failed, because now the percolator returns upto 10 matches whereas before this was unbounded. The test has been updated to take this in account by checking the total count instead of the number of matches --- .../elasticsearch/percolator/ConcurrentPercolatorIT.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java index 031b305864c..178f070927c 100644 --- a/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/ConcurrentPercolatorIT.java @@ -148,7 +148,6 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { assertThat(assertionError + " should be null", assertionError, nullValue()); } - @AwaitsFix(bugUrl = "reproduces= -Dtests.seed=DA9C1BDEB045305C") public void testConcurrentAddingAndPercolating() throws Exception { assertAcked(prepareCreate("index").addMapping("type", "field1", "type=string", "field2", "type=string")); ensureGreen(); @@ -252,7 +251,7 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { .setSource(onlyField1Doc).execute().actionGet(); assertNoFailures(response); assertThat(response.getSuccessfulShards(), equalTo(response.getTotalShards())); - assertThat(response.getMatches().length, greaterThanOrEqualTo(atLeastExpected)); + assertThat(response.getCount(), greaterThanOrEqualTo((long) atLeastExpected)); break; case 1: atLeastExpected = type2.get(); @@ -260,7 +259,7 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { .setSource(onlyField2Doc).execute().actionGet(); assertNoFailures(response); assertThat(response.getSuccessfulShards(), equalTo(response.getTotalShards())); - assertThat(response.getMatches().length, greaterThanOrEqualTo(atLeastExpected)); + assertThat(response.getCount(), greaterThanOrEqualTo((long) atLeastExpected)); break; case 2: atLeastExpected = type3.get(); @@ -268,7 +267,7 @@ public class ConcurrentPercolatorIT extends ESIntegTestCase { .setSource(field1AndField2Doc).execute().actionGet(); assertNoFailures(response); assertThat(response.getSuccessfulShards(), equalTo(response.getTotalShards())); - assertThat(response.getMatches().length, greaterThanOrEqualTo(atLeastExpected)); + assertThat(response.getCount(), greaterThanOrEqualTo((long) atLeastExpected)); break; } } From 7df9ba605332231955ac533e2a1a3f0f6737ede4 Mon Sep 17 00:00:00 2001 From: Nicholas Knize Date: Wed, 6 Jan 2016 12:41:04 -0600 Subject: [PATCH 21/59] [TEST] Speed up GeoShapeQueryTests This commit speeds up GeoShapeQueryTests by reducing the size of the random generated shapes and defaulting geo_shape indexes to use quadtree (more efficient for shapes) over geohash. --- .../search/geo/GeoShapeQueryTests.java | 10 +++--- .../test/geo/RandomShapeGenerator.java | 34 +++++++++++++++++-- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/search/geo/GeoShapeQueryTests.java b/core/src/test/java/org/elasticsearch/search/geo/GeoShapeQueryTests.java index 1ae211bc242..88943f87ee7 100644 --- a/core/src/test/java/org/elasticsearch/search/geo/GeoShapeQueryTests.java +++ b/core/src/test/java/org/elasticsearch/search/geo/GeoShapeQueryTests.java @@ -299,7 +299,7 @@ public class GeoShapeQueryTests extends ESSingleNodeTestCase { logger.info("Created Random GeometryCollection containing " + gcb.numShapes() + " shapes"); - client().admin().indices().prepareCreate("test").addMapping("type", "location", "type=geo_shape") + client().admin().indices().prepareCreate("test").addMapping("type", "location", "type=geo_shape,tree=quadtree") .execute().actionGet(); XContentBuilder docSource = gcb.toXContent(jsonBuilder().startObject().field("location"), null).endObject(); @@ -317,10 +317,10 @@ public class GeoShapeQueryTests extends ESSingleNodeTestCase { public void testContainsShapeQuery() throws Exception { // Create a random geometry collection. - Rectangle mbr = xRandomRectangle(getRandom(), xRandomPoint(getRandom())); + Rectangle mbr = xRandomRectangle(getRandom(), xRandomPoint(getRandom()), true); GeometryCollectionBuilder gcb = createGeometryCollectionWithin(getRandom(), mbr); - client().admin().indices().prepareCreate("test").addMapping("type", "location", "type=geo_shape") + client().admin().indices().prepareCreate("test").addMapping("type", "location", "type=geo_shape,tree=quadtree" ) .execute().actionGet(); XContentBuilder docSource = gcb.toXContent(jsonBuilder().startObject().field("location"), null).endObject(); @@ -333,7 +333,7 @@ public class GeoShapeQueryTests extends ESSingleNodeTestCase { ShapeBuilder filterShape = (gcb.getShapeAt(randomIntBetween(0, gcb.numShapes() - 1))); GeoShapeQueryBuilder filter = QueryBuilders.geoShapeQuery("location", filterShape) - .relation(ShapeRelation.INTERSECTS); + .relation(ShapeRelation.CONTAINS); SearchResponse response = client().prepareSearch("test").setTypes("type").setQuery(QueryBuilders.matchAllQuery()) .setPostFilter(filter).get(); assertSearchResponse(response); @@ -343,7 +343,7 @@ public class GeoShapeQueryTests extends ESSingleNodeTestCase { public void testShapeFilterWithDefinedGeoCollection() throws Exception { createIndex("shapes"); - client().admin().indices().prepareCreate("test").addMapping("type", "location", "type=geo_shape") + client().admin().indices().prepareCreate("test").addMapping("type", "location", "type=geo_shape,tree=quadtree") .execute().actionGet(); XContentBuilder docSource = jsonBuilder().startObject().startObject("location") diff --git a/core/src/test/java/org/elasticsearch/test/geo/RandomShapeGenerator.java b/core/src/test/java/org/elasticsearch/test/geo/RandomShapeGenerator.java index 55744697b4d..cb0049dc84c 100644 --- a/core/src/test/java/org/elasticsearch/test/geo/RandomShapeGenerator.java +++ b/core/src/test/java/org/elasticsearch/test/geo/RandomShapeGenerator.java @@ -114,7 +114,7 @@ public class RandomShapeGenerator extends RandomGeoGenerator { throws InvalidShapeException { if (numGeometries <= 0) { // cap geometry collection at 4 shapes (to save test time) - numGeometries = RandomInts.randomIntBetween(r, 2, 5); + numGeometries = RandomInts.randomIntBetween(r, 2, 4); } if (nearPoint == null) { @@ -255,11 +255,31 @@ public class RandomShapeGenerator extends RandomGeoGenerator { return p; } - public static Rectangle xRandomRectangle(Random r, Point nearP) { - Rectangle bounds = ctx.getWorldBounds(); + private static Rectangle xRandomRectangle(Random r, Point nearP, Rectangle bounds, boolean small) { if (nearP == null) nearP = xRandomPointIn(r, bounds); + if (small == true) { + // between 3 and 6 degrees + final double latRange = 3 * r.nextDouble() + 3; + final double lonRange = 3 * r.nextDouble() + 3; + + double minX = nearP.getX(); + double maxX = minX + lonRange; + if (maxX > 180) { + maxX = minX; + minX -= lonRange; + } + double minY = nearP.getY(); + double maxY = nearP.getY() + latRange; + if (maxY > 90) { + maxY = minY; + minY -= latRange; + } + + return ctx.makeRectangle(minX, maxX, minY, maxY); + } + Range xRange = xRandomRange(r, rarely(r) ? 0 : nearP.getX(), Range.xRange(bounds, ctx)); Range yRange = xRandomRange(r, rarely(r) ? 0 : nearP.getY(), Range.yRange(bounds, ctx)); @@ -270,6 +290,14 @@ public class RandomShapeGenerator extends RandomGeoGenerator { xDivisible(yRange.getMax()*10e3)/10e3); } + public static Rectangle xRandomRectangle(Random r, Point nearP) { + return xRandomRectangle(r, nearP, ctx.getWorldBounds(), false); + } + + public static Rectangle xRandomRectangle(Random r, Point nearP, boolean small) { + return xRandomRectangle(r, nearP, ctx.getWorldBounds(), small); + } + private static boolean rarely(Random r) { return RandomInts.randomInt(r, 100) >= 90; } From add60a7560c1b47c604ad3d34e858ab7eaa296f8 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 13:42:15 -0500 Subject: [PATCH 22/59] [highlighting] Another test for boundary chars --- .../search/highlight/HighlighterSearchIT.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java b/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java index 008aac38832..80636388f54 100644 --- a/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java +++ b/core/src/test/java/org/elasticsearch/search/highlight/HighlighterSearchIT.java @@ -851,6 +851,15 @@ public class HighlighterSearchIT extends ESIntegTestCase { assertHighlight(searchResponse, 0, "field2", 0, 1, equalTo("The quick brown fox jumps over")); + logger.info("--> searching with boundary characters on the field"); + source = searchSource() + .query(matchQuery("field2", "quick")) + .highlighter(highlight().field(new Field("field2").fragmentSize(30).numOfFragments(1).boundaryChars(new char[] {' '}))); + + searchResponse = client().prepareSearch("test").setSource(source).get(); + + assertHighlight(searchResponse, 0, "field2", 0, 1, equalTo("The quick brown fox jumps over")); + } /** From 71d146b94027cf4d3f7b2260ce1f9f556b092f94 Mon Sep 17 00:00:00 2001 From: debadair Date: Wed, 6 Jan 2016 11:01:01 -0800 Subject: [PATCH 23/59] Docs: Removed NSFW link. --- docs/plugins/repository.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/repository.asciidoc b/docs/plugins/repository.asciidoc index 5706fc74c12..73447bb07e5 100644 --- a/docs/plugins/repository.asciidoc +++ b/docs/plugins/repository.asciidoc @@ -28,7 +28,7 @@ The Hadoop HDFS Repository plugin adds support for using HDFS as a repository. The following plugin has been contributed by our community: -* https://github.com/wikimedia/search-repository-swift[Openstack Swift] (by http://en.cam4.es/youngqcmeat/Wikimedia Foundation) +* https://github.com/wikimedia/search-repository-swift[Openstack Swift] (by Wikimedia Foundation) This community plugin appears to have been abandoned: From 270b08b302ba64aa742b740f86be833b26f79b10 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Tue, 29 Dec 2015 13:10:56 -0500 Subject: [PATCH 24/59] Add test that cluster state update tasks are executed in order This commit adds a test that ensures that cluster state update tasks are executed in order from the perspective of a single thread. --- .../cluster/ClusterServiceIT.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java index 6e7e338d8b9..9e0b65b6f79 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java @@ -796,6 +796,100 @@ public class ClusterServiceIT extends ESIntegTestCase { assertTrue(published.get()); } + // test that for a single thread, tasks are executed in the order + // that they are submitted + public void testClusterStateUpdateTasksAreExecutedInOrder() throws InterruptedException { + Settings settings = settingsBuilder() + .put("discovery.type", "local") + .build(); + internalCluster().startNode(settings); + ClusterService clusterService = internalCluster().getInstance(ClusterService.class); + + class TaskExecutor implements ClusterStateTaskExecutor { + int tracking = -1; + + @Override + public BatchResult execute(ClusterState currentState, List tasks) throws Exception { + for (Integer task : tasks) { + try { + assertEquals("task was executed out of order", tracking + 1, (int)task); + tracking++; + } catch (AssertionError e) { + return BatchResult.builder().failures(tasks, e).build(currentState); + } + } + return BatchResult.builder().successes(tasks).build(ClusterState.builder(currentState).build()); + } + + @Override + public boolean runOnlyOnMaster() { + return false; + } + } + + int numberOfThreads = randomIntBetween(2, 8); + TaskExecutor[] executors = new TaskExecutor[numberOfThreads]; + for (int i = 0; i < numberOfThreads; i++) { + executors[i] = new TaskExecutor(); + } + + int tasksSubmittedPerThread = randomIntBetween(2, 1024); + + AtomicBoolean failure = new AtomicBoolean(); + CountDownLatch updateLatch = new CountDownLatch(numberOfThreads * tasksSubmittedPerThread); + + ClusterStateTaskListener listener = new ClusterStateTaskListener() { + @Override + public void onFailure(String source, Throwable t) { + logger.debug("failure: [{}]", t, source); + failure.set(true); + updateLatch.countDown(); + } + + @Override + public void clusterStateProcessed(String source, ClusterState oldState, ClusterState newState) { + updateLatch.countDown(); + } + }; + + CountDownLatch startGate = new CountDownLatch(1); + CountDownLatch endGate = new CountDownLatch(numberOfThreads); + AtomicBoolean interrupted = new AtomicBoolean(); + + for (int i = 0; i < numberOfThreads; i++) { + final int index = i; + Thread thread = new Thread(() -> { + for (int j = 0; j < tasksSubmittedPerThread; j++) { + try { + try { + startGate.await(); + } catch (InterruptedException e) { + interrupted.set(true); + return; + } + clusterService.submitStateUpdateTask("[" + index + "][" + j + "]", j, ClusterStateTaskConfig.build(randomFrom(Priority.values())), executors[index], listener); + } finally { + endGate.countDown(); + } + } + }); + thread.start(); + } + + startGate.countDown(); + endGate.await(); + + assertFalse(interrupted.get()); + + updateLatch.await(); + + assertFalse(failure.get()); + + for (int i = 0; i < numberOfThreads; i++) { + assertEquals(tasksSubmittedPerThread - 1, executors[i].tracking); + } + } + public void testClusterStateBatchedUpdates() throws InterruptedException { Settings settings = settingsBuilder() .put("discovery.type", "local") From 18b42ce79818e5d5f46e3f976cd5166140878094 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Tue, 29 Dec 2015 20:45:54 -0500 Subject: [PATCH 25/59] Simplify cluster state task execution ordering test --- .../java/org/elasticsearch/cluster/ClusterServiceIT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java index 9e0b65b6f79..2a7c22f9141 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java @@ -806,13 +806,13 @@ public class ClusterServiceIT extends ESIntegTestCase { ClusterService clusterService = internalCluster().getInstance(ClusterService.class); class TaskExecutor implements ClusterStateTaskExecutor { - int tracking = -1; + int tracking = 0; @Override public BatchResult execute(ClusterState currentState, List tasks) throws Exception { for (Integer task : tasks) { try { - assertEquals("task was executed out of order", tracking + 1, (int)task); + assertEquals("task was executed out of order", tracking, (int)task); tracking++; } catch (AssertionError e) { return BatchResult.builder().failures(tasks, e).build(currentState); @@ -886,7 +886,7 @@ public class ClusterServiceIT extends ESIntegTestCase { assertFalse(failure.get()); for (int i = 0; i < numberOfThreads; i++) { - assertEquals(tasksSubmittedPerThread - 1, executors[i].tracking); + assertEquals(tasksSubmittedPerThread, executors[i].tracking); } } From d1b4cf6778c5cef3a0626353cf5136bda7e18c72 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 1 Jan 2016 12:50:50 -0500 Subject: [PATCH 26/59] Further simplify cluster state update task execution ordering test --- .../cluster/ClusterServiceIT.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java index 2a7c22f9141..e87a353649e 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java @@ -806,18 +806,11 @@ public class ClusterServiceIT extends ESIntegTestCase { ClusterService clusterService = internalCluster().getInstance(ClusterService.class); class TaskExecutor implements ClusterStateTaskExecutor { - int tracking = 0; + List tasks = new ArrayList<>(); @Override public BatchResult execute(ClusterState currentState, List tasks) throws Exception { - for (Integer task : tasks) { - try { - assertEquals("task was executed out of order", tracking, (int)task); - tracking++; - } catch (AssertionError e) { - return BatchResult.builder().failures(tasks, e).build(currentState); - } - } + this.tasks.addAll(tasks); return BatchResult.builder().successes(tasks).build(ClusterState.builder(currentState).build()); } @@ -841,7 +834,7 @@ public class ClusterServiceIT extends ESIntegTestCase { ClusterStateTaskListener listener = new ClusterStateTaskListener() { @Override public void onFailure(String source, Throwable t) { - logger.debug("failure: [{}]", t, source); + logger.debug("unexpected failure: [{}]", t, source); failure.set(true); updateLatch.countDown(); } @@ -886,7 +879,11 @@ public class ClusterServiceIT extends ESIntegTestCase { assertFalse(failure.get()); for (int i = 0; i < numberOfThreads; i++) { - assertEquals(tasksSubmittedPerThread, executors[i].tracking); + assertEquals(tasksSubmittedPerThread, executors[i].tasks.size()); + for (int j = 0; j < tasksSubmittedPerThread; j++) { + assertNotNull(executors[i].tasks.get(j)); + assertEquals("cluster state update task executed out of order", j, (int)executors[i].tasks.get(j)); + } } } From 557b11cc2b7577f1d34a7f650f14b0d9f91f7107 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 14:20:30 -0500 Subject: [PATCH 27/59] Sychronize threads in cluster state update task execution ordering test This commit uses a CyclicBarrier to correctly and simply sychronize the driver and test threads in ClusterServiceIT#testClusterStateUpdateTasksAreExecutedInOrder. --- .../cluster/ClusterServiceIT.java | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java index e87a353649e..a334010c071 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java @@ -51,9 +51,11 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -798,7 +800,7 @@ public class ClusterServiceIT extends ESIntegTestCase { // test that for a single thread, tasks are executed in the order // that they are submitted - public void testClusterStateUpdateTasksAreExecutedInOrder() throws InterruptedException { + public void testClusterStateUpdateTasksAreExecutedInOrder() throws BrokenBarrierException, InterruptedException { Settings settings = settingsBuilder() .put("discovery.type", "local") .build(); @@ -845,34 +847,28 @@ public class ClusterServiceIT extends ESIntegTestCase { } }; - CountDownLatch startGate = new CountDownLatch(1); - CountDownLatch endGate = new CountDownLatch(numberOfThreads); - AtomicBoolean interrupted = new AtomicBoolean(); + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); for (int i = 0; i < numberOfThreads; i++) { final int index = i; Thread thread = new Thread(() -> { - for (int j = 0; j < tasksSubmittedPerThread; j++) { - try { - try { - startGate.await(); - } catch (InterruptedException e) { - interrupted.set(true); - return; - } + try { + barrier.await(); + for (int j = 0; j < tasksSubmittedPerThread; j++) { clusterService.submitStateUpdateTask("[" + index + "][" + j + "]", j, ClusterStateTaskConfig.build(randomFrom(Priority.values())), executors[index], listener); - } finally { - endGate.countDown(); } + barrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + throw new AssertionError(e); } }); thread.start(); } - startGate.countDown(); - endGate.await(); - - assertFalse(interrupted.get()); + // wait for all threads to be ready + barrier.await(); + // wait for all threads to finish + barrier.await(); updateLatch.await(); From 22abf148126cb439f4f55ab8a263c45f3dd90769 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 14:30:51 -0500 Subject: [PATCH 28/59] Visible failures in cluster state update task execution ordering test --- .../org/elasticsearch/cluster/ClusterServiceIT.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java index a334010c071..5093e5c27f5 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java @@ -27,6 +27,7 @@ import org.elasticsearch.cluster.service.InternalClusterService; import org.elasticsearch.cluster.service.PendingClusterTask; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Priority; +import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.component.LifecycleComponent; import org.elasticsearch.common.inject.Inject; @@ -54,6 +55,7 @@ import java.util.Set; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.Semaphore; @@ -63,6 +65,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.elasticsearch.common.settings.Settings.settingsBuilder; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.greaterThanOrEqualTo; @@ -830,14 +833,14 @@ public class ClusterServiceIT extends ESIntegTestCase { int tasksSubmittedPerThread = randomIntBetween(2, 1024); - AtomicBoolean failure = new AtomicBoolean(); + CopyOnWriteArrayList> failures = new CopyOnWriteArrayList<>(); CountDownLatch updateLatch = new CountDownLatch(numberOfThreads * tasksSubmittedPerThread); ClusterStateTaskListener listener = new ClusterStateTaskListener() { @Override public void onFailure(String source, Throwable t) { - logger.debug("unexpected failure: [{}]", t, source); - failure.set(true); + logger.error("unexpected failure: [{}]", t, source); + failures.add(new Tuple<>(source, t)); updateLatch.countDown(); } @@ -872,7 +875,7 @@ public class ClusterServiceIT extends ESIntegTestCase { updateLatch.await(); - assertFalse(failure.get()); + assertThat(failures, empty()); for (int i = 0; i < numberOfThreads; i++) { assertEquals(tasksSubmittedPerThread, executors[i].tasks.size()); From 4c0f5bda47164d5cbced314bf30951d398f8430b Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 15:07:05 -0500 Subject: [PATCH 29/59] Use CyclicBarriers for sychronizing driver and test threads This commit modifies some tests to use CyclicBarriers to correctly and simply sychronize driver and test threads. --- .../cluster/ClusterServiceIT.java | 25 ++--- .../common/cache/CacheTests.java | 99 +++++++++---------- 2 files changed, 55 insertions(+), 69 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java index 5093e5c27f5..2d781c866de 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ClusterServiceIT.java @@ -886,7 +886,7 @@ public class ClusterServiceIT extends ESIntegTestCase { } } - public void testClusterStateBatchedUpdates() throws InterruptedException { + public void testClusterStateBatchedUpdates() throws BrokenBarrierException, InterruptedException { Settings settings = settingsBuilder() .put("discovery.type", "local") .build(); @@ -974,19 +974,12 @@ public class ClusterServiceIT extends ESIntegTestCase { counts.merge(executor, 1, (previous, one) -> previous + one); } - CountDownLatch startGate = new CountDownLatch(1); - CountDownLatch endGate = new CountDownLatch(numberOfThreads); - AtomicBoolean interrupted = new AtomicBoolean(); + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); for (int i = 0; i < numberOfThreads; i++) { final int index = i; Thread thread = new Thread(() -> { try { - try { - startGate.await(); - } catch (InterruptedException e) { - interrupted.set(true); - return; - } + barrier.await(); for (int j = 0; j < tasksSubmittedPerThread; j++) { ClusterStateTaskExecutor executor = assignments.get(index * tasksSubmittedPerThread + j); clusterService.submitStateUpdateTask( @@ -996,16 +989,18 @@ public class ClusterServiceIT extends ESIntegTestCase { executor, listener); } - } finally { - endGate.countDown(); + barrier.await(); + } catch (BrokenBarrierException | InterruptedException e) { + throw new AssertionError(e); } }); thread.start(); } - startGate.countDown(); - endGate.await(); - assertFalse(interrupted.get()); + // wait for all threads to be ready + barrier.await(); + // wait for all threads to finish + barrier.await(); // wait until all the cluster state updates have been processed updateLatch.await(); diff --git a/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java b/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java index 0985bc4b88e..a397b75a6aa 100644 --- a/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java +++ b/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java @@ -31,7 +31,9 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -491,25 +493,19 @@ public class CacheTests extends ESTestCase { } } - public void testComputeIfAbsentCallsOnce() throws InterruptedException { + public void testComputeIfAbsentCallsOnce() throws BrokenBarrierException, InterruptedException { int numberOfThreads = randomIntBetween(2, 32); final Cache cache = CacheBuilder.builder().build(); AtomicReferenceArray flags = new AtomicReferenceArray(numberOfEntries); for (int j = 0; j < numberOfEntries; j++) { flags.set(j, false); } - CountDownLatch startGate = new CountDownLatch(1); - CountDownLatch endGate = new CountDownLatch(numberOfThreads); - AtomicBoolean interrupted = new AtomicBoolean(); + + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); for (int i = 0; i < numberOfThreads; i++) { Thread thread = new Thread(() -> { try { - try { - startGate.await(); - } catch (InterruptedException e) { - interrupted.set(true); - return; - } + barrier.await(); for (int j = 0; j < numberOfEntries; j++) { try { cache.computeIfAbsent(j, key -> { @@ -517,18 +513,21 @@ public class CacheTests extends ESTestCase { return Integer.toString(key); }); } catch (ExecutionException e) { - throw new RuntimeException(e); + fail(e.getMessage()); } } - } finally { - endGate.countDown(); + barrier.await(); + } catch (BrokenBarrierException | InterruptedException e) { + throw new AssertionError(e); } }); thread.start(); } - startGate.countDown(); - endGate.await(); - assertFalse(interrupted.get()); + + // wait for all threads to be ready + barrier.await(); + // wait for all threads to finish + barrier.await(); } public void testComputeIfAbsentThrowsExceptionIfLoaderReturnsANullValue() { @@ -541,7 +540,7 @@ public class CacheTests extends ESTestCase { } } - public void testDependentKeyDeadlock() throws InterruptedException { + public void testDependentKeyDeadlock() throws BrokenBarrierException, InterruptedException { class Key { private final int key; @@ -568,18 +567,17 @@ public class CacheTests extends ESTestCase { int numberOfThreads = randomIntBetween(2, 32); final Cache cache = CacheBuilder.builder().build(); - CountDownLatch startGate = new CountDownLatch(1); + + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); CountDownLatch deadlockLatch = new CountDownLatch(numberOfThreads); - AtomicBoolean interrupted = new AtomicBoolean(); List threads = new ArrayList<>(); for (int i = 0; i < numberOfThreads; i++) { Thread thread = new Thread(() -> { try { try { - startGate.await(); - } catch (InterruptedException e) { - interrupted.set(true); - return; + barrier.await(); + } catch (BrokenBarrierException | InterruptedException e) { + throw new AssertionError(e); } Random random = new Random(random().nextLong()); for (int j = 0; j < numberOfEntries; j++) { @@ -631,7 +629,7 @@ public class CacheTests extends ESTestCase { }, 1, 1, TimeUnit.SECONDS); // everything is setup, release the hounds - startGate.countDown(); + barrier.await(); // wait for either deadlock to be detected or the threads to terminate deadlockLatch.await(); @@ -642,21 +640,16 @@ public class CacheTests extends ESTestCase { assertFalse("deadlock", deadlock.get()); } - public void testCachePollution() throws InterruptedException { + public void testCachePollution() throws BrokenBarrierException, InterruptedException { int numberOfThreads = randomIntBetween(2, 32); final Cache cache = CacheBuilder.builder().build(); - CountDownLatch startGate = new CountDownLatch(1); - CountDownLatch endGate = new CountDownLatch(numberOfThreads); - AtomicBoolean interrupted = new AtomicBoolean(); + + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); + for (int i = 0; i < numberOfThreads; i++) { Thread thread = new Thread(() -> { try { - try { - startGate.await(); - } catch (InterruptedException e) { - interrupted.set(true); - return; - } + barrier.await(); Random random = new Random(random().nextLong()); for (int j = 0; j < numberOfEntries; j++) { Integer key = random.nextInt(numberOfEntries); @@ -686,21 +679,23 @@ public class CacheTests extends ESTestCase { cache.get(key); } } - } finally { - endGate.countDown(); + barrier.await(); + } catch (BrokenBarrierException | InterruptedException e) { + throw new AssertionError(e); } }); thread.start(); } - startGate.countDown(); - endGate.await(); - assertFalse(interrupted.get()); + // wait for all threads to be ready + barrier.await(); + // wait for all threads to finish + barrier.await(); } // test that the cache is not corrupted under lots of concurrent modifications, even hitting the same key // here be dragons: this test did catch one subtle bug during development; do not remove lightly - public void testTorture() throws InterruptedException { + public void testTorture() throws BrokenBarrierException, InterruptedException { int numberOfThreads = randomIntBetween(2, 32); final Cache cache = CacheBuilder.builder() @@ -708,32 +703,28 @@ public class CacheTests extends ESTestCase { .weigher((k, v) -> 2) .build(); - CountDownLatch startGate = new CountDownLatch(1); - CountDownLatch endGate = new CountDownLatch(numberOfThreads); - AtomicBoolean interrupted = new AtomicBoolean(); + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); for (int i = 0; i < numberOfThreads; i++) { Thread thread = new Thread(() -> { try { - try { - startGate.await(); - } catch (InterruptedException e) { - interrupted.set(true); - return; - } + barrier.await(); Random random = new Random(random().nextLong()); for (int j = 0; j < numberOfEntries; j++) { Integer key = random.nextInt(numberOfEntries); cache.put(key, Integer.toString(j)); } - } finally { - endGate.countDown(); + barrier.await(); + } catch (BrokenBarrierException | InterruptedException e) { + throw new AssertionError(e); } }); thread.start(); } - startGate.countDown(); - endGate.await(); - assertFalse(interrupted.get()); + + // wait for all threads to be ready + barrier.await(); + // wait for all threads to finish + barrier.await(); cache.refresh(); assertEquals(500, cache.count()); From 9935ae921e8d7d88e6550442d1a32db3ca8f4bda Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 17:34:44 -0500 Subject: [PATCH 30/59] Version.LATEST instead of Lucene.VERSION There was a TODO for it. --- core/src/main/java/org/elasticsearch/Version.java | 10 +++------- .../java/org/elasticsearch/common/lucene/Lucene.java | 6 ------ .../org/elasticsearch/index/analysis/Analysis.java | 4 ++-- .../org/elasticsearch/common/lucene/LuceneTests.java | 9 --------- 4 files changed, 5 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/Version.java b/core/src/main/java/org/elasticsearch/Version.java index ac2575597e8..e55800682dd 100644 --- a/core/src/main/java/org/elasticsearch/Version.java +++ b/core/src/main/java/org/elasticsearch/Version.java @@ -25,7 +25,6 @@ import org.elasticsearch.common.SuppressForbidden; import org.elasticsearch.common.inject.AbstractModule; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.monitor.jvm.JvmInfo; @@ -286,7 +285,8 @@ public class Version { public static final Version CURRENT = V_3_0_0; static { - assert CURRENT.luceneVersion.equals(Lucene.VERSION) : "Version must be upgraded to [" + Lucene.VERSION + "] is still set to [" + CURRENT.luceneVersion + "]"; + assert CURRENT.luceneVersion.equals(org.apache.lucene.util.Version.LATEST) : "Version must be upgraded to [" + + org.apache.lucene.util.Version.LATEST + "] is still set to [" + CURRENT.luceneVersion + "]"; } public static Version readVersion(StreamInput in) throws IOException { @@ -457,7 +457,6 @@ public class Version { return V_0_90_0_RC1; case V_0_90_0_Beta1_ID: return V_0_90_0_Beta1; - case V_0_20_7_ID: return V_0_20_7; case V_0_20_6_ID: @@ -476,7 +475,6 @@ public class Version { return V_0_20_0; case V_0_20_0_RC1_ID: return V_0_20_0_RC1; - case V_0_19_0_RC1_ID: return V_0_19_0_RC1; case V_0_19_0_RC2_ID: @@ -511,7 +509,6 @@ public class Version { return V_0_19_12; case V_0_19_13_ID: return V_0_19_13; - case V_0_18_0_ID: return V_0_18_0; case V_0_18_1_ID: @@ -530,9 +527,8 @@ public class Version { return V_0_18_7; case V_0_18_8_ID: return V_0_18_8; - default: - return new Version(id, false, Lucene.VERSION); + return new Version(id, false, org.apache.lucene.util.Version.LATEST); } } diff --git a/core/src/main/java/org/elasticsearch/common/lucene/Lucene.java b/core/src/main/java/org/elasticsearch/common/lucene/Lucene.java index 558e92c4fb8..b693af1e6d1 100644 --- a/core/src/main/java/org/elasticsearch/common/lucene/Lucene.java +++ b/core/src/main/java/org/elasticsearch/common/lucene/Lucene.java @@ -86,11 +86,6 @@ import java.util.Objects; * */ public class Lucene { - - // TODO: remove VERSION, and have users use Version.LATEST. - public static final Version VERSION = Version.LATEST; - public static final Version ANALYZER_VERSION = VERSION; - public static final Version QUERYPARSER_VERSION = VERSION; public static final String LATEST_DOC_VALUES_FORMAT = "Lucene54"; public static final String LATEST_POSTINGS_FORMAT = "Lucene50"; public static final String LATEST_CODEC = "Lucene54"; @@ -109,7 +104,6 @@ public class Lucene { public static final TopDocs EMPTY_TOP_DOCS = new TopDocs(0, EMPTY_SCORE_DOCS, 0.0f); - @SuppressWarnings("deprecation") public static Version parseVersion(@Nullable String version, Version defaultVersion, ESLogger logger) { if (version == null) { return defaultVersion; diff --git a/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java b/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java index 43c9af672d1..a27b49b9618 100644 --- a/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java +++ b/core/src/main/java/org/elasticsearch/index/analysis/Analysis.java @@ -89,12 +89,12 @@ public class Analysis { // check for explicit version on the specific analyzer component String sVersion = settings.get("version"); if (sVersion != null) { - return Lucene.parseVersion(sVersion, Lucene.ANALYZER_VERSION, logger); + return Lucene.parseVersion(sVersion, Version.LATEST, logger); } // check for explicit version on the index itself as default for all analysis components sVersion = indexSettings.get("index.analysis.version"); if (sVersion != null) { - return Lucene.parseVersion(sVersion, Lucene.ANALYZER_VERSION, logger); + return Lucene.parseVersion(sVersion, Version.LATEST, logger); } // resolve the analysis version based on the version the index was created with return org.elasticsearch.Version.indexCreated(indexSettings).luceneVersion; diff --git a/core/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java b/core/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java index 0a15693dfd5..484b88f096f 100644 --- a/core/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java +++ b/core/src/test/java/org/elasticsearch/common/lucene/LuceneTests.java @@ -38,7 +38,6 @@ import org.apache.lucene.search.TermQuery; import org.apache.lucene.store.Directory; import org.apache.lucene.store.MMapDirectory; import org.apache.lucene.store.MockDirectoryWrapper; -import org.apache.lucene.util.Version; import org.elasticsearch.test.ESTestCase; import java.io.IOException; @@ -54,14 +53,6 @@ import java.util.concurrent.atomic.AtomicBoolean; * */ public class LuceneTests extends ESTestCase { - /** - * simple test that ensures that we bump the version on Upgrade - */ - public void testVersion() { - // note this is just a silly sanity check, we test it in lucene, and we point to it this way - assertEquals(Lucene.VERSION, Version.LATEST); - } - public void testWaitForIndex() throws Exception { final MockDirectoryWrapper dir = newMockDirectory(); From c147fe569169dc8ec2b45b8399d547d21c3e450a Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 6 Jan 2016 20:00:11 -0500 Subject: [PATCH 31/59] Do not lose CacheTest failure stack traces --- .../common/cache/CacheTests.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java b/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java index a397b75a6aa..921c66f7acb 100644 --- a/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java +++ b/core/src/test/java/org/elasticsearch/common/cache/CacheTests.java @@ -32,6 +32,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutionException; @@ -44,6 +45,8 @@ import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.stream.Collectors; import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.is; public class CacheTests extends ESTestCase { private int numberOfEntries; @@ -485,7 +488,7 @@ public class CacheTests extends ESTestCase { return value; }); } catch (ExecutionException e) { - fail(e.getMessage()); + throw new AssertionError(e); } } for (int i = 0; i < numberOfEntries; i++) { @@ -501,6 +504,8 @@ public class CacheTests extends ESTestCase { flags.set(j, false); } + CopyOnWriteArrayList failures = new CopyOnWriteArrayList<>(); + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); for (int i = 0; i < numberOfThreads; i++) { Thread thread = new Thread(() -> { @@ -513,7 +518,8 @@ public class CacheTests extends ESTestCase { return Integer.toString(key); }); } catch (ExecutionException e) { - fail(e.getMessage()); + failures.add(e); + break; } } barrier.await(); @@ -528,6 +534,8 @@ public class CacheTests extends ESTestCase { barrier.await(); // wait for all threads to finish barrier.await(); + + assertThat(failures, is(empty())); } public void testComputeIfAbsentThrowsExceptionIfLoaderReturnsANullValue() { @@ -568,6 +576,8 @@ public class CacheTests extends ESTestCase { int numberOfThreads = randomIntBetween(2, 32); final Cache cache = CacheBuilder.builder().build(); + CopyOnWriteArrayList failures = new CopyOnWriteArrayList<>(); + CyclicBarrier barrier = new CyclicBarrier(1 + numberOfThreads); CountDownLatch deadlockLatch = new CountDownLatch(numberOfThreads); List threads = new ArrayList<>(); @@ -592,7 +602,8 @@ public class CacheTests extends ESTestCase { } }); } catch (ExecutionException e) { - fail(e.getMessage()); + failures.add(e); + break; } } } finally { @@ -637,6 +648,8 @@ public class CacheTests extends ESTestCase { // shutdown the watchdog service scheduler.shutdown(); + assertThat(failures, is(empty())); + assertFalse("deadlock", deadlock.get()); } From 32605ecb4f82206888d509b0a17f1718fd817bfc Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 20:26:50 -0500 Subject: [PATCH 32/59] Cleanups for Def Manually I: 1. Added some missing raw types warnings suppressions. 2. Removed some unused unchecked cast warning suppressions. 3. Added to Class. I let my IDE: 1. Remove unneeded casts. 2. Reorder imports (just ignore these, everyone does). --- .../java/org/elasticsearch/plan/a/Def.java | 272 +++++++++--------- 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Def.java b/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Def.java index bd9b146e41e..c7a8ce410fd 100644 --- a/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Def.java +++ b/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Def.java @@ -19,18 +19,18 @@ package org.elasticsearch.plan.a; +import org.elasticsearch.plan.a.Definition.Cast; +import org.elasticsearch.plan.a.Definition.Field; +import org.elasticsearch.plan.a.Definition.Method; +import org.elasticsearch.plan.a.Definition.Struct; +import org.elasticsearch.plan.a.Definition.Transform; +import org.elasticsearch.plan.a.Definition.Type; + import java.lang.invoke.MethodHandle; import java.lang.reflect.Array; import java.util.List; import java.util.Map; -import static org.elasticsearch.plan.a.Definition.Cast; -import static org.elasticsearch.plan.a.Definition.Field; -import static org.elasticsearch.plan.a.Definition.Method; -import static org.elasticsearch.plan.a.Definition.Struct; -import static org.elasticsearch.plan.a.Definition.Transform; -import static org.elasticsearch.plan.a.Definition.Type; - public class Def { public static Object methodCall(final Object owner, final String name, final Definition definition, final Object[] arguments, final boolean[] typesafe) { @@ -70,7 +70,7 @@ public class Def { } } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public static void fieldStore(final Object owner, Object value, final String name, final Definition definition, final boolean typesafe) { final Field field = getField(owner, name, definition); @@ -117,7 +117,7 @@ public class Def { } } - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") public static Object fieldLoad(final Object owner, final String name, final Definition definition) { if (owner.getClass().isArray() && "length".equals(name)) { return Array.getLength(owner); @@ -163,7 +163,7 @@ public class Def { } } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "rawtypes" }) public static void arrayStore(final Object array, Object index, Object value, final Definition definition, final boolean indexsafe, final boolean valuesafe) { if (array instanceof Map) { @@ -206,7 +206,7 @@ public class Def { } } - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") public static Object arrayLoad(final Object array, Object index, final Definition definition, final boolean indexsafe) { if (array instanceof Map) { @@ -257,7 +257,7 @@ public class Def { } } - for (final Class iface : clazz.getInterfaces()) { + for (final Class iface : clazz.getInterfaces()) { struct = definition.classes.get(iface); if (struct != null) { @@ -303,7 +303,7 @@ public class Def { } } - for (final Class iface : clazz.getInterfaces()) { + for (final Class iface : clazz.getInterfaces()) { struct = definition.classes.get(iface); if (struct != null) { @@ -348,7 +348,7 @@ public class Def { break; } - for (final Class iface : fromClass.getInterfaces()) { + for (final Class iface : fromClass.getInterfaces()) { fromStruct = definition.classes.get(iface); if (fromStruct != null) { @@ -371,7 +371,7 @@ public class Def { break; } - for (final Class iface : toClass.getInterfaces()) { + for (final Class iface : toClass.getInterfaces()) { toStruct = definition.classes.get(iface); if (toStruct != null) { @@ -442,28 +442,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() * (double)(char)right; + return ((Number)left).doubleValue() * (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() * (float)(char)right; + return ((Number)left).floatValue() * (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() * (long)(char)right; + return ((Number)left).longValue() * (char)right; } else { - return ((Number)left).intValue() * (int)(char)right; + return ((Number)left).intValue() * (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left * ((Number)right).doubleValue(); + return (char)left * ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left * ((Number)right).floatValue(); + return (char)left * ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left * ((Number)right).longValue(); + return (char)left * ((Number)right).longValue(); } else { - return (int)(char)left * ((Number)right).intValue(); + return (char)left * ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left * (int)(char)right; + return (char)left * (char)right; } } @@ -485,28 +485,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() / (double)(char)right; + return ((Number)left).doubleValue() / (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() / (float)(char)right; + return ((Number)left).floatValue() / (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() / (long)(char)right; + return ((Number)left).longValue() / (char)right; } else { - return ((Number)left).intValue() / (int)(char)right; + return ((Number)left).intValue() / (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left / ((Number)right).doubleValue(); + return (char)left / ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left / ((Number)right).floatValue(); + return (char)left / ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left / ((Number)right).longValue(); + return (char)left / ((Number)right).longValue(); } else { - return (int)(char)left / ((Number)right).intValue(); + return (char)left / ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left / (int)(char)right; + return (char)left / (char)right; } } @@ -528,28 +528,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() % (double)(char)right; + return ((Number)left).doubleValue() % (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() % (float)(char)right; + return ((Number)left).floatValue() % (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() % (long)(char)right; + return ((Number)left).longValue() % (char)right; } else { - return ((Number)left).intValue() % (int)(char)right; + return ((Number)left).intValue() % (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left % ((Number)right).doubleValue(); + return (char)left % ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left % ((Number)right).floatValue(); + return (char)left % ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left % ((Number)right).longValue(); + return (char)left % ((Number)right).longValue(); } else { - return (int)(char)left % ((Number)right).intValue(); + return (char)left % ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left % (int)(char)right; + return (char)left % (char)right; } } @@ -573,28 +573,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() + (double)(char)right; + return ((Number)left).doubleValue() + (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() + (float)(char)right; + return ((Number)left).floatValue() + (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() + (long)(char)right; + return ((Number)left).longValue() + (char)right; } else { - return ((Number)left).intValue() + (int)(char)right; + return ((Number)left).intValue() + (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left + ((Number)right).doubleValue(); + return (char)left + ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left + ((Number)right).floatValue(); + return (char)left + ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left + ((Number)right).longValue(); + return (char)left + ((Number)right).longValue(); } else { - return (int)(char)left + ((Number)right).intValue(); + return (char)left + ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left + (int)(char)right; + return (char)left + (char)right; } } @@ -616,28 +616,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() - (double)(char)right; + return ((Number)left).doubleValue() - (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() - (float)(char)right; + return ((Number)left).floatValue() - (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() - (long)(char)right; + return ((Number)left).longValue() - (char)right; } else { - return ((Number)left).intValue() - (int)(char)right; + return ((Number)left).intValue() - (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left - ((Number)right).doubleValue(); + return (char)left - ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left - ((Number)right).floatValue(); + return (char)left - ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left - ((Number)right).longValue(); + return (char)left - ((Number)right).longValue(); } else { - return (int)(char)left - ((Number)right).intValue(); + return (char)left - ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left - (int)(char)right; + return (char)left - (char)right; } } @@ -657,9 +657,9 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double || left instanceof Float || left instanceof Long) { - return ((Number)left).longValue() << (long)(char)right; + return ((Number)left).longValue() << (char)right; } else { - return ((Number)left).intValue() << (int)(char)right; + return ((Number)left).intValue() << (char)right; } } } else if (left instanceof Character) { @@ -667,10 +667,10 @@ public class Def { if (right instanceof Double || right instanceof Float || right instanceof Long) { return (long)(char)left << ((Number)right).longValue(); } else { - return (int)(char)left << ((Number)right).intValue(); + return (char)left << ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left << (int)(char)right; + return (char)left << (char)right; } } @@ -690,9 +690,9 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double || left instanceof Float || left instanceof Long) { - return ((Number)left).longValue() >> (long)(char)right; + return ((Number)left).longValue() >> (char)right; } else { - return ((Number)left).intValue() >> (int)(char)right; + return ((Number)left).intValue() >> (char)right; } } } else if (left instanceof Character) { @@ -700,10 +700,10 @@ public class Def { if (right instanceof Double || right instanceof Float || right instanceof Long) { return (long)(char)left >> ((Number)right).longValue(); } else { - return (int)(char)left >> ((Number)right).intValue(); + return (char)left >> ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left >> (int)(char)right; + return (char)left >> (char)right; } } @@ -723,9 +723,9 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double || left instanceof Float || left instanceof Long) { - return ((Number)left).longValue() >>> (long)(char)right; + return ((Number)left).longValue() >>> (char)right; } else { - return ((Number)left).intValue() >>> (int)(char)right; + return ((Number)left).intValue() >>> (char)right; } } } else if (left instanceof Character) { @@ -733,10 +733,10 @@ public class Def { if (right instanceof Double || right instanceof Float || right instanceof Long) { return (long)(char)left >>> ((Number)right).longValue(); } else { - return (int)(char)left >>> ((Number)right).intValue(); + return (char)left >>> ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left >>> (int)(char)right; + return (char)left >>> (char)right; } } @@ -758,20 +758,20 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double || left instanceof Float || left instanceof Long) { - return ((Number)left).longValue() & (long)(char)right; + return ((Number)left).longValue() & (char)right; } else { - return ((Number)left).intValue() & (int)(char)right; + return ((Number)left).intValue() & (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double || right instanceof Float || right instanceof Long) { - return (long)(char)left & ((Number)right).longValue(); + return (char)left & ((Number)right).longValue(); } else { - return (int)(char)left & ((Number)right).intValue(); + return (char)left & ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left & (int)(char)right; + return (char)left & (char)right; } } @@ -793,20 +793,20 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double || left instanceof Float || left instanceof Long) { - return ((Number)left).longValue() ^ (long)(char)right; + return ((Number)left).longValue() ^ (char)right; } else { - return ((Number)left).intValue() ^ (int)(char)right; + return ((Number)left).intValue() ^ (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double || right instanceof Float || right instanceof Long) { - return (long)(char)left ^ ((Number)right).longValue(); + return (char)left ^ ((Number)right).longValue(); } else { - return (int)(char)left ^ ((Number)right).intValue(); + return (char)left ^ ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left ^ (int)(char)right; + return (char)left ^ (char)right; } } @@ -828,20 +828,20 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double || left instanceof Float || left instanceof Long) { - return ((Number)left).longValue() | (long)(char)right; + return ((Number)left).longValue() | (char)right; } else { - return ((Number)left).intValue() | (int)(char)right; + return ((Number)left).intValue() | (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double || right instanceof Float || right instanceof Long) { - return (long)(char)left | ((Number)right).longValue(); + return (char)left | ((Number)right).longValue(); } else { - return (int)(char)left | ((Number)right).intValue(); + return (char)left | ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left | (int)(char)right; + return (char)left | (char)right; } } @@ -855,48 +855,48 @@ public class Def { if (right instanceof Number) { return (double)left == ((Number)right).doubleValue(); } else if (right instanceof Character) { - return (double)left == (double)(char)right; + return (double)left == (char)right; } } else if (right instanceof Double) { if (left instanceof Number) { return ((Number)left).doubleValue() == (double)right; } else if (left instanceof Character) { - return (double)(char)left == ((Number)right).doubleValue(); + return (char)left == ((Number)right).doubleValue(); } } else if (left instanceof Float) { if (right instanceof Number) { return (float)left == ((Number)right).floatValue(); } else if (right instanceof Character) { - return (float)left == (float)(char)right; + return (float)left == (char)right; } } else if (right instanceof Float) { if (left instanceof Number) { return ((Number)left).floatValue() == (float)right; } else if (left instanceof Character) { - return (float)(char)left == ((Number)right).floatValue(); + return (char)left == ((Number)right).floatValue(); } } else if (left instanceof Long) { if (right instanceof Number) { return (long)left == ((Number)right).longValue(); } else if (right instanceof Character) { - return (long)left == (long)(char)right; + return (long)left == (char)right; } } else if (right instanceof Long) { if (left instanceof Number) { return ((Number)left).longValue() == (long)right; } else if (left instanceof Character) { - return (long)(char)left == ((Number)right).longValue(); + return (char)left == ((Number)right).longValue(); } } else if (left instanceof Number) { if (right instanceof Number) { return ((Number)left).intValue() == ((Number)right).intValue(); } else if (right instanceof Character) { - return ((Number)left).intValue() == (int)(char)right; + return ((Number)left).intValue() == (char)right; } } else if (right instanceof Number && left instanceof Character) { - return (int)(char)left == ((Number)right).intValue(); + return (char)left == ((Number)right).intValue(); } else if (left instanceof Character && right instanceof Character) { - return (int)(char)left == (int)(char)right; + return (char)left == (char)right; } return left.equals(right); @@ -919,28 +919,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() < (double)(char)right; + return ((Number)left).doubleValue() < (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() < (float)(char)right; + return ((Number)left).floatValue() < (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() < (long)(char)right; + return ((Number)left).longValue() < (char)right; } else { - return ((Number)left).intValue() < (int)(char)right; + return ((Number)left).intValue() < (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left < ((Number)right).doubleValue(); + return (char)left < ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left < ((Number)right).floatValue(); + return (char)left < ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left < ((Number)right).longValue(); + return (char)left < ((Number)right).longValue(); } else { - return (int)(char)left < ((Number)right).intValue(); + return (char)left < ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left < (int)(char)right; + return (char)left < (char)right; } } @@ -962,28 +962,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() <= (double)(char)right; + return ((Number)left).doubleValue() <= (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() <= (float)(char)right; + return ((Number)left).floatValue() <= (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() <= (long)(char)right; + return ((Number)left).longValue() <= (char)right; } else { - return ((Number)left).intValue() <= (int)(char)right; + return ((Number)left).intValue() <= (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left <= ((Number)right).doubleValue(); + return (char)left <= ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left <= ((Number)right).floatValue(); + return (char)left <= ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left <= ((Number)right).longValue(); + return (char)left <= ((Number)right).longValue(); } else { - return (int)(char)left <= ((Number)right).intValue(); + return (char)left <= ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left <= (int)(char)right; + return (char)left <= (char)right; } } @@ -1005,28 +1005,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() > (double)(char)right; + return ((Number)left).doubleValue() > (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() > (float)(char)right; + return ((Number)left).floatValue() > (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() > (long)(char)right; + return ((Number)left).longValue() > (char)right; } else { - return ((Number)left).intValue() > (int)(char)right; + return ((Number)left).intValue() > (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left > ((Number)right).doubleValue(); + return (char)left > ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left > ((Number)right).floatValue(); + return (char)left > ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left > ((Number)right).longValue(); + return (char)left > ((Number)right).longValue(); } else { - return (int)(char)left > ((Number)right).intValue(); + return (char)left > ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left > (int)(char)right; + return (char)left > (char)right; } } @@ -1048,28 +1048,28 @@ public class Def { } } else if (right instanceof Character) { if (left instanceof Double) { - return ((Number)left).doubleValue() >= (double)(char)right; + return ((Number)left).doubleValue() >= (char)right; } else if (left instanceof Float) { - return ((Number)left).floatValue() >= (float)(char)right; + return ((Number)left).floatValue() >= (char)right; } else if (left instanceof Long) { - return ((Number)left).longValue() >= (long)(char)right; + return ((Number)left).longValue() >= (char)right; } else { - return ((Number)left).intValue() >= (int)(char)right; + return ((Number)left).intValue() >= (char)right; } } } else if (left instanceof Character) { if (right instanceof Number) { if (right instanceof Double) { - return (double)(char)left >= ((Number)right).doubleValue(); + return (char)left >= ((Number)right).doubleValue(); } else if (right instanceof Float) { - return (float)(char)left >= ((Number)right).floatValue(); + return (char)left >= ((Number)right).floatValue(); } else if (right instanceof Long) { - return (long)(char)left >= ((Number)right).longValue(); + return (char)left >= ((Number)right).longValue(); } else { - return (int)(char)left >= ((Number)right).intValue(); + return (char)left >= ((Number)right).intValue(); } } else if (right instanceof Character) { - return (int)(char)left >= (int)(char)right; + return (char)left >= (char)right; } } @@ -1121,7 +1121,7 @@ public class Def { if (value instanceof Boolean) { return ((Boolean)value) ? 1 : 0; } else if (value instanceof Character) { - return (int)(char)value; + return (char)value; } else { return ((Number)value).intValue(); } @@ -1131,7 +1131,7 @@ public class Def { if (value instanceof Boolean) { return ((Boolean)value) ? 1L : 0; } else if (value instanceof Character) { - return (long)(char)value; + return (char)value; } else { return ((Number)value).longValue(); } @@ -1141,7 +1141,7 @@ public class Def { if (value instanceof Boolean) { return ((Boolean)value) ? (float)1 : 0; } else if (value instanceof Character) { - return (float)(char)value; + return (char)value; } else { return ((Number)value).floatValue(); } @@ -1151,7 +1151,7 @@ public class Def { if (value instanceof Boolean) { return ((Boolean)value) ? (double)1 : 0; } else if (value instanceof Character) { - return (double)(char)value; + return (char)value; } else { return ((Number)value).doubleValue(); } From 74c132afc622e9ebd56347c829eed284a5f83d3b Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 21:00:27 -0500 Subject: [PATCH 33/59] Standardize some methods on varargs Right now we define the same sort of methods as taking String arrays and string varargs. We should standardize on one and varargs is easier to call so lets use varargs! --- .../main/java/org/elasticsearch/action/AliasesRequest.java | 2 +- .../main/java/org/elasticsearch/action/IndicesRequest.java | 6 +++--- .../action/admin/cluster/health/ClusterHealthRequest.java | 2 +- .../admin/indices/exists/indices/IndicesExistsRequest.java | 2 +- .../admin/indices/exists/types/TypesExistsRequest.java | 2 +- .../action/admin/indices/mapping/put/PutMappingRequest.java | 3 ++- .../action/admin/indices/warmer/put/PutWarmerRequest.java | 2 +- .../action/deletebyquery/DeleteByQueryRequest.java | 2 +- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/action/AliasesRequest.java b/core/src/main/java/org/elasticsearch/action/AliasesRequest.java index 6e45af0cf84..a4ff57ebd20 100644 --- a/core/src/main/java/org/elasticsearch/action/AliasesRequest.java +++ b/core/src/main/java/org/elasticsearch/action/AliasesRequest.java @@ -35,7 +35,7 @@ public interface AliasesRequest extends IndicesRequest.Replaceable { /** * Sets the array of aliases that the action relates to */ - AliasesRequest aliases(String[] aliases); + AliasesRequest aliases(String... aliases); /** * Returns true if wildcards expressions among aliases should be resolved, false otherwise diff --git a/core/src/main/java/org/elasticsearch/action/IndicesRequest.java b/core/src/main/java/org/elasticsearch/action/IndicesRequest.java index 9200f99c6f7..4c62a7e849b 100644 --- a/core/src/main/java/org/elasticsearch/action/IndicesRequest.java +++ b/core/src/main/java/org/elasticsearch/action/IndicesRequest.java @@ -41,9 +41,9 @@ public interface IndicesRequest { IndicesOptions indicesOptions(); static interface Replaceable extends IndicesRequest { - /* - * Sets the array of indices that the action relates to + /** + * Sets the indices that the action relates to. */ - IndicesRequest indices(String[] indices); + IndicesRequest indices(String... indices); } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/health/ClusterHealthRequest.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/health/ClusterHealthRequest.java index d603886d924..59b426d8c31 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/health/ClusterHealthRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/health/ClusterHealthRequest.java @@ -61,7 +61,7 @@ public class ClusterHealthRequest extends MasterNodeReadRequest im * Sets the indices this put mapping operation will execute on. */ @Override - public PutMappingRequest indices(String[] indices) { + public PutMappingRequest indices(String... indices) { this.indices = indices; return this; } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java index dbf136dec12..77f8f426876 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java @@ -111,7 +111,7 @@ public class PutWarmerRequest extends AcknowledgedRequest impl } @Override - public IndicesRequest indices(String[] indices) { + public IndicesRequest indices(String... indices) { if (searchRequest == null) { throw new IllegalStateException("unable to set indices, search request is null"); } diff --git a/plugins/delete-by-query/src/main/java/org/elasticsearch/action/deletebyquery/DeleteByQueryRequest.java b/plugins/delete-by-query/src/main/java/org/elasticsearch/action/deletebyquery/DeleteByQueryRequest.java index fa83fb4fd3d..7103cf1a4e0 100644 --- a/plugins/delete-by-query/src/main/java/org/elasticsearch/action/deletebyquery/DeleteByQueryRequest.java +++ b/plugins/delete-by-query/src/main/java/org/elasticsearch/action/deletebyquery/DeleteByQueryRequest.java @@ -105,7 +105,7 @@ public class DeleteByQueryRequest extends ActionRequest im } @Override - public DeleteByQueryRequest indices(String[] indices) { + public DeleteByQueryRequest indices(String... indices) { this.indices = indices; return this; } From 20e7fa97db7a0150a44a074107cd5fc4db812e94 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 22:01:45 -0500 Subject: [PATCH 34/59] Remove Xlint:-override,-fallthrough,-static Adds `@SuppressWarnings("fallthrough")` in two places where the fallthrough is used to implement well known hashing algorithms. --- core/build.gradle | 4 ++-- .../elasticsearch/common/hash/MurmurHash3.java | 1 + .../inject/assistedinject/FactoryProvider2.java | 6 ++++++ .../elasticsearch/common/util/BloomFilter.java | 3 ++- .../index/fieldvisitor/SingleFieldsVisitor.java | 13 +++++++++---- .../breaker/RandomExceptionCircuitBreakerIT.java | 15 ++++----------- plugins/discovery-azure/build.gradle | 4 +--- .../cloud/azure/AzureDiscoveryModule.java | 6 +----- plugins/lang-plan-a/build.gradle | 2 +- .../java/org/elasticsearch/plan/a/Analyzer.java | 3 +++ test/framework/build.gradle | 2 +- 11 files changed, 31 insertions(+), 28 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 7b80449729e..229951f895d 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -102,8 +102,8 @@ if (isEclipse) { } } -compileJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-fallthrough,-overrides,-rawtypes,-serial,-try,-unchecked" -compileTestJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-fallthrough,-overrides,-rawtypes,-serial,-try,-unchecked" +compileJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-serial,-try,-unchecked" +compileTestJava.options.compilerArgs << "-Xlint:-cast,-deprecation,-rawtypes,-serial,-try,-unchecked" forbiddenPatterns { exclude '**/*.json' diff --git a/core/src/main/java/org/elasticsearch/common/hash/MurmurHash3.java b/core/src/main/java/org/elasticsearch/common/hash/MurmurHash3.java index c9c0d29c448..ba159f30a22 100644 --- a/core/src/main/java/org/elasticsearch/common/hash/MurmurHash3.java +++ b/core/src/main/java/org/elasticsearch/common/hash/MurmurHash3.java @@ -59,6 +59,7 @@ public enum MurmurHash3 { * Note, this hashing function might be used to persist hashes, so if the way hashes are computed * changes for some reason, it needs to be addressed (like in BloomFilter and MurmurHashField). */ + @SuppressWarnings("fallthrough") // Intentionally uses fallthrough to implement a well known hashing algorithm public static Hash128 hash128(byte[] key, int offset, int length, long seed, Hash128 hash) { long h1 = seed; long h2 = seed; diff --git a/core/src/main/java/org/elasticsearch/common/inject/assistedinject/FactoryProvider2.java b/core/src/main/java/org/elasticsearch/common/inject/assistedinject/FactoryProvider2.java index 1f0e05f43c0..29863527202 100644 --- a/core/src/main/java/org/elasticsearch/common/inject/assistedinject/FactoryProvider2.java +++ b/core/src/main/java/org/elasticsearch/common/inject/assistedinject/FactoryProvider2.java @@ -258,6 +258,12 @@ public final class FactoryProvider2 implements InvocationHandler, Provider return o == this || o == factory; } + @Override + public int hashCode() { + // This way both this and its factory hash to the same spot, making hashCode consistent. + return factory.hashCode(); + } + /** * Returns true if {@code thrown} can be thrown by {@code invoked} without wrapping. */ diff --git a/core/src/main/java/org/elasticsearch/common/util/BloomFilter.java b/core/src/main/java/org/elasticsearch/common/util/BloomFilter.java index b19d727f022..fdc94d53849 100644 --- a/core/src/main/java/org/elasticsearch/common/util/BloomFilter.java +++ b/core/src/main/java/org/elasticsearch/common/util/BloomFilter.java @@ -519,6 +519,7 @@ public class BloomFilter { return k; } + @SuppressWarnings("fallthrough") // Uses fallthrough to implement a well know hashing algorithm public static long hash3_x64_128(byte[] key, int offset, int length, long seed) { final int nblocks = length >> 4; // Process as 128-bit blocks. @@ -598,7 +599,7 @@ public class BloomFilter { case 2: k1 ^= ((long) key[offset + 1]) << 8; case 1: - k1 ^= ((long) key[offset]); + k1 ^= (key[offset]); k1 *= c1; k1 = rotl64(k1, 31); k1 *= c2; diff --git a/core/src/main/java/org/elasticsearch/index/fieldvisitor/SingleFieldsVisitor.java b/core/src/main/java/org/elasticsearch/index/fieldvisitor/SingleFieldsVisitor.java index a9880d59f65..1751a820d8c 100644 --- a/core/src/main/java/org/elasticsearch/index/fieldvisitor/SingleFieldsVisitor.java +++ b/core/src/main/java/org/elasticsearch/index/fieldvisitor/SingleFieldsVisitor.java @@ -58,11 +58,16 @@ public class SingleFieldsVisitor extends FieldsVisitor { public void postProcess(MappedFieldType fieldType) { if (uid != null) { - // TODO: this switch seems very wrong...either each case should be breaking, or this should not be a switch switch (field) { - case UidFieldMapper.NAME: addValue(field, uid.toString()); - case IdFieldMapper.NAME: addValue(field, uid.id()); - case TypeFieldMapper.NAME: addValue(field, uid.type()); + case UidFieldMapper.NAME: + addValue(field, uid.toString()); + break; + case IdFieldMapper.NAME: + addValue(field, uid.id()); + break; + case TypeFieldMapper.NAME: + addValue(field, uid.type()); + break; } } diff --git a/core/src/test/java/org/elasticsearch/indices/memory/breaker/RandomExceptionCircuitBreakerIT.java b/core/src/test/java/org/elasticsearch/indices/memory/breaker/RandomExceptionCircuitBreakerIT.java index 3422959771c..15d334c61a9 100644 --- a/core/src/test/java/org/elasticsearch/indices/memory/breaker/RandomExceptionCircuitBreakerIT.java +++ b/core/src/test/java/org/elasticsearch/indices/memory/breaker/RandomExceptionCircuitBreakerIT.java @@ -151,18 +151,10 @@ public class RandomExceptionCircuitBreakerIT extends ESIntegTestCase { for (int i = 0; i < numSearches; i++) { SearchRequestBuilder searchRequestBuilder = client().prepareSearch().setQuery(QueryBuilders.matchAllQuery()); - switch (randomIntBetween(0, 5)) { - case 5: - case 4: - case 3: - searchRequestBuilder.addSort("test-str", SortOrder.ASC); - // fall through - sometimes get both fields - case 2: - case 1: - default: - searchRequestBuilder.addSort("test-num", SortOrder.ASC); - + if (random().nextBoolean()) { + searchRequestBuilder.addSort("test-str", SortOrder.ASC); } + searchRequestBuilder.addSort("test-num", SortOrder.ASC); boolean success = false; try { // Sort by the string and numeric fields, to load them into field data @@ -249,6 +241,7 @@ public class RandomExceptionCircuitBreakerIT extends ESIntegTestCase { if (random.nextDouble() < topLevelRatio) { throw new IOException("Forced top level Exception on [" + flag.name() + "]"); } + break; case Intersect: break; case Norms: diff --git a/plugins/discovery-azure/build.gradle b/plugins/discovery-azure/build.gradle index d85d08794ea..12b479eb487 100644 --- a/plugins/discovery-azure/build.gradle +++ b/plugins/discovery-azure/build.gradle @@ -56,11 +56,9 @@ dependencyLicenses { mapping from: /jaxb-.*/, to: 'jaxb' } -compileJava.options.compilerArgs << '-Xlint:-path,-serial,-static,-unchecked' +compileJava.options.compilerArgs << '-Xlint:-path,-serial,-unchecked' // TODO: why is deprecation needed here but not in maven....? compileJava.options.compilerArgs << '-Xlint:-deprecation' -// TODO: and why does this static not show up in maven... -compileTestJava.options.compilerArgs << '-Xlint:-static' thirdPartyAudit.excludes = [ // classes are missing diff --git a/plugins/discovery-azure/src/main/java/org/elasticsearch/cloud/azure/AzureDiscoveryModule.java b/plugins/discovery-azure/src/main/java/org/elasticsearch/cloud/azure/AzureDiscoveryModule.java index 35bb20bc8a7..5215b90e7e1 100644 --- a/plugins/discovery-azure/src/main/java/org/elasticsearch/cloud/azure/AzureDiscoveryModule.java +++ b/plugins/discovery-azure/src/main/java/org/elasticsearch/cloud/azure/AzureDiscoveryModule.java @@ -47,11 +47,7 @@ public class AzureDiscoveryModule extends AbstractModule { private Settings settings; // pkg private so it is settable by tests - static Class computeServiceImpl = AzureComputeServiceImpl.class; - - public static Class getComputeServiceImpl() { - return computeServiceImpl; - } + Class computeServiceImpl = AzureComputeServiceImpl.class; @Inject public AzureDiscoveryModule(Settings settings) { diff --git a/plugins/lang-plan-a/build.gradle b/plugins/lang-plan-a/build.gradle index dc0cfca2fa7..810f0df4e16 100644 --- a/plugins/lang-plan-a/build.gradle +++ b/plugins/lang-plan-a/build.gradle @@ -35,7 +35,7 @@ dependencyLicenses { mapping from: /asm-.*/, to: 'asm' } -compileJava.options.compilerArgs << '-Xlint:-cast,-fallthrough,-rawtypes' +compileJava.options.compilerArgs << '-Xlint:-cast,-rawtypes' compileTestJava.options.compilerArgs << '-Xlint:-unchecked' // regeneration logic, comes in via ant right now diff --git a/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Analyzer.java b/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Analyzer.java index a20c32965b2..eb2681cfba8 100644 --- a/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Analyzer.java +++ b/plugins/lang-plan-a/src/main/java/org/elasticsearch/plan/a/Analyzer.java @@ -2223,12 +2223,15 @@ class Analyzer extends PlanAParserBaseVisitor { case LONG: incremd.preConst = positive ? 1L : -1L; incremd.from = definition.longType; + break; case FLOAT: incremd.preConst = positive ? 1.0F : -1.0F; incremd.from = definition.floatType; + break; case DOUBLE: incremd.preConst = positive ? 1.0 : -1.0; incremd.from = definition.doubleType; + break; default: incremd.preConst = positive ? 1 : -1; incremd.from = definition.intType; diff --git a/test/framework/build.gradle b/test/framework/build.gradle index 7356a384574..5c607e1aa61 100644 --- a/test/framework/build.gradle +++ b/test/framework/build.gradle @@ -33,7 +33,7 @@ dependencies { compile 'org.elasticsearch:securemock:1.2' } -compileJava.options.compilerArgs << '-Xlint:-cast,-deprecation,-fallthrough,-overrides,-rawtypes,-serial,-try,-unchecked' +compileJava.options.compilerArgs << '-Xlint:-cast,-deprecation,-rawtypes,-serial,-try,-unchecked' compileTestJava.options.compilerArgs << '-Xlint:-rawtypes' // the main files are actually test files, so use the appopriate forbidden api sigs From 0786c506dcdf6c5db1f652e58ee543542c245cc1 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 23:26:57 -0500 Subject: [PATCH 35/59] Remove a few more Xlint skips --- modules/lang-expression/build.gradle | 3 -- .../expression/CountMethodValueSource.java | 9 +++--- .../expression/DateMethodValueSource.java | 9 +++--- .../expression/FieldDataValueSource.java | 9 +++--- .../ReplaceableConstValueSource.java | 7 +++-- .../expression/MoreExpressionTests.java | 14 +++++----- plugins/analysis-phonetic/build.gradle | 3 -- .../analysis/PhoneticTokenFilterFactory.java | 8 +++--- .../analysis/phonetic/KoelnerPhonetik.java | 28 +++++++++---------- plugins/jvm-example/build.gradle | 2 -- .../plugin/example/JvmExamplePlugin.java | 9 +++--- plugins/mapper-murmur3/build.gradle | 2 -- .../mapper/murmur3/Murmur3FieldMapper.java | 11 ++++---- 13 files changed, 54 insertions(+), 60 deletions(-) diff --git a/modules/lang-expression/build.gradle b/modules/lang-expression/build.gradle index 9e3943a32b2..2fd6e53effa 100644 --- a/modules/lang-expression/build.gradle +++ b/modules/lang-expression/build.gradle @@ -35,6 +35,3 @@ dependencyLicenses { mapping from: /asm-.*/, to: 'asm' } -compileJava.options.compilerArgs << '-Xlint:-rawtypes' -compileTestJava.options.compilerArgs << '-Xlint:-rawtypes' - diff --git a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/CountMethodValueSource.java b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/CountMethodValueSource.java index c50aa4da289..043a11eebad 100644 --- a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/CountMethodValueSource.java +++ b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/CountMethodValueSource.java @@ -19,6 +19,10 @@ package org.elasticsearch.script.expression; +import java.io.IOException; +import java.util.Map; +import java.util.Objects; + import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.queries.function.FunctionValues; import org.apache.lucene.queries.function.ValueSource; @@ -26,10 +30,6 @@ import org.elasticsearch.index.fielddata.AtomicFieldData; import org.elasticsearch.index.fielddata.AtomicNumericFieldData; import org.elasticsearch.index.fielddata.IndexFieldData; -import java.io.IOException; -import java.util.Map; -import java.util.Objects; - /** * A ValueSource to create FunctionValues to get the count of the number of values in a field for a document. */ @@ -43,6 +43,7 @@ public class CountMethodValueSource extends ValueSource { } @Override + @SuppressWarnings("rawtypes") // ValueSource uses a rawtype public FunctionValues getValues(Map context, LeafReaderContext leaf) throws IOException { AtomicFieldData leafData = fieldData.load(leaf); assert(leafData instanceof AtomicNumericFieldData); diff --git a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/DateMethodValueSource.java b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/DateMethodValueSource.java index 9efeed54ff9..e6c9dcddc78 100644 --- a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/DateMethodValueSource.java +++ b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/DateMethodValueSource.java @@ -19,6 +19,10 @@ package org.elasticsearch.script.expression; +import java.io.IOException; +import java.util.Map; +import java.util.Objects; + import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.queries.function.FunctionValues; import org.elasticsearch.index.fielddata.AtomicFieldData; @@ -26,10 +30,6 @@ import org.elasticsearch.index.fielddata.AtomicNumericFieldData; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.search.MultiValueMode; -import java.io.IOException; -import java.util.Map; -import java.util.Objects; - class DateMethodValueSource extends FieldDataValueSource { protected final String methodName; @@ -45,6 +45,7 @@ class DateMethodValueSource extends FieldDataValueSource { } @Override + @SuppressWarnings("rawtypes") // ValueSource uses a rawtype public FunctionValues getValues(Map context, LeafReaderContext leaf) throws IOException { AtomicFieldData leafData = fieldData.load(leaf); assert(leafData instanceof AtomicNumericFieldData); diff --git a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/FieldDataValueSource.java b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/FieldDataValueSource.java index 708cd0af152..ae84a5cbfe7 100644 --- a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/FieldDataValueSource.java +++ b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/FieldDataValueSource.java @@ -19,6 +19,10 @@ package org.elasticsearch.script.expression; +import java.io.IOException; +import java.util.Map; +import java.util.Objects; + import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.queries.function.FunctionValues; import org.apache.lucene.queries.function.ValueSource; @@ -27,10 +31,6 @@ import org.elasticsearch.index.fielddata.AtomicNumericFieldData; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.search.MultiValueMode; -import java.io.IOException; -import java.util.Map; -import java.util.Objects; - /** * A {@link ValueSource} wrapper for field data. */ @@ -67,6 +67,7 @@ class FieldDataValueSource extends ValueSource { } @Override + @SuppressWarnings("rawtypes") // ValueSource uses a rawtype public FunctionValues getValues(Map context, LeafReaderContext leaf) throws IOException { AtomicFieldData leafData = fieldData.load(leaf); assert(leafData instanceof AtomicNumericFieldData); diff --git a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ReplaceableConstValueSource.java b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ReplaceableConstValueSource.java index c9bcc239f28..bb05ef2325d 100644 --- a/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ReplaceableConstValueSource.java +++ b/modules/lang-expression/src/main/java/org/elasticsearch/script/expression/ReplaceableConstValueSource.java @@ -19,13 +19,13 @@ package org.elasticsearch.script.expression; +import java.io.IOException; +import java.util.Map; + import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.queries.function.FunctionValues; import org.apache.lucene.queries.function.ValueSource; -import java.io.IOException; -import java.util.Map; - /** * A {@link ValueSource} which has a stub {@link FunctionValues} that holds a dynamically replaceable constant double. */ @@ -37,6 +37,7 @@ class ReplaceableConstValueSource extends ValueSource { } @Override + @SuppressWarnings("rawtypes") // ValueSource uses a rawtype public FunctionValues getValues(Map map, LeafReaderContext atomicReaderContext) throws IOException { return fv; } diff --git a/modules/lang-expression/src/test/java/org/elasticsearch/script/expression/MoreExpressionTests.java b/modules/lang-expression/src/test/java/org/elasticsearch/script/expression/MoreExpressionTests.java index b4c0106abbe..a866f338e29 100644 --- a/modules/lang-expression/src/test/java/org/elasticsearch/script/expression/MoreExpressionTests.java +++ b/modules/lang-expression/src/test/java/org/elasticsearch/script/expression/MoreExpressionTests.java @@ -19,6 +19,12 @@ package org.elasticsearch.script.expression; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.apache.lucene.expressions.Expression; import org.apache.lucene.expressions.js.JavascriptCompiler; import org.elasticsearch.action.search.SearchPhaseExecutionException; @@ -47,12 +53,6 @@ import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.hamcrest.ElasticsearchAssertions; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import static org.elasticsearch.search.aggregations.AggregationBuilders.histogram; import static org.elasticsearch.search.aggregations.AggregationBuilders.sum; import static org.elasticsearch.search.aggregations.pipeline.PipelineAggregatorBuilders.bucketScript; @@ -121,7 +121,7 @@ public class MoreExpressionTests extends ESIntegTestCase { client().prepareIndex("test", "doc", "1").setSource("text", "hello goodbye"), client().prepareIndex("test", "doc", "2").setSource("text", "hello hello hello goodbye"), client().prepareIndex("test", "doc", "3").setSource("text", "hello hello goodebye")); - ScoreFunctionBuilder score = ScoreFunctionBuilders.scriptFunction(new Script("1 / _score", ScriptType.INLINE, "expression", null)); + ScoreFunctionBuilder score = ScoreFunctionBuilders.scriptFunction(new Script("1 / _score", ScriptType.INLINE, "expression", null)); SearchRequestBuilder req = client().prepareSearch().setIndices("test"); req.setQuery(QueryBuilders.functionScoreQuery(QueryBuilders.termQuery("text", "hello"), score).boostMode(CombineFunction.REPLACE)); req.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); // make sure DF is consistent diff --git a/plugins/analysis-phonetic/build.gradle b/plugins/analysis-phonetic/build.gradle index 13898be05a9..61c4fdbd583 100644 --- a/plugins/analysis-phonetic/build.gradle +++ b/plugins/analysis-phonetic/build.gradle @@ -30,6 +30,3 @@ dependencies { dependencyLicenses { mapping from: /lucene-.*/, to: 'lucene' } - -compileJava.options.compilerArgs << "-Xlint:-rawtypes,-unchecked" - diff --git a/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java b/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java index 9374410765d..e33f1f1e7e2 100644 --- a/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java +++ b/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/PhoneticTokenFilterFactory.java @@ -19,6 +19,9 @@ package org.elasticsearch.index.analysis; +import java.util.Arrays; +import java.util.HashSet; + import org.apache.commons.codec.Encoder; import org.apache.commons.codec.language.Caverphone1; import org.apache.commons.codec.language.Caverphone2; @@ -43,9 +46,6 @@ import org.elasticsearch.index.analysis.phonetic.HaasePhonetik; import org.elasticsearch.index.analysis.phonetic.KoelnerPhonetik; import org.elasticsearch.index.analysis.phonetic.Nysiis; -import java.util.Arrays; -import java.util.HashSet; - /** * */ @@ -122,7 +122,7 @@ public class PhoneticTokenFilterFactory extends AbstractTokenFilterFactory { if (encoder == null) { if (ruletype != null && nametype != null) { if (languageset != null) { - final LanguageSet languages = LanguageSet.from(new HashSet(Arrays.asList(languageset))); + final LanguageSet languages = LanguageSet.from(new HashSet<>(Arrays.asList(languageset))); return new BeiderMorseFilter(tokenStream, new PhoneticEngine(nametype, ruletype, true), languages); } return new BeiderMorseFilter(tokenStream, new PhoneticEngine(nametype, ruletype, true)); diff --git a/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/phonetic/KoelnerPhonetik.java b/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/phonetic/KoelnerPhonetik.java index 57195062cdd..3c658191524 100644 --- a/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/phonetic/KoelnerPhonetik.java +++ b/plugins/analysis-phonetic/src/main/java/org/elasticsearch/index/analysis/phonetic/KoelnerPhonetik.java @@ -19,9 +19,6 @@ package org.elasticsearch.index.analysis.phonetic; -import org.apache.commons.codec.EncoderException; -import org.apache.commons.codec.StringEncoder; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -31,6 +28,9 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.codec.EncoderException; +import org.apache.commons.codec.StringEncoder; + /** * Kölner Phonetik * @@ -49,13 +49,13 @@ public class KoelnerPhonetik implements StringEncoder { private static final String[] POSTEL_VARIATIONS_REPLACEMENTS = {"OWN", "AUN", "RW", "RB", "RSK", "WSK"}; private Pattern[] variationsPatterns; private boolean primary = false; - private final Set csz = new HashSet(Arrays.asList( + private final Set csz = new HashSet<>(Arrays.asList( 'C', 'S', 'Z')); - private final Set ckq = new HashSet(Arrays.asList( + private final Set ckq = new HashSet<>(Arrays.asList( 'C', 'K', 'Q')); - private final Set aouhkxq = new HashSet(Arrays.asList( + private final Set aouhkxq = new HashSet<>(Arrays.asList( 'A', 'O', 'U', 'H', 'K', 'X', 'Q')); - private final Set ahkloqrux = new HashSet(Arrays.asList( + private final Set ahkloqrux = new HashSet<>(Arrays.asList( 'A', 'H', 'K', 'L', 'O', 'Q', 'R', 'U', 'X')); /** @@ -139,10 +139,10 @@ public class KoelnerPhonetik implements StringEncoder { private List partition(String str) { String primaryForm = str; - List parts = new ArrayList(); + List parts = new ArrayList<>(); parts.add(primaryForm.replaceAll("[^\\p{L}\\p{N}]", "")); if (!primary) { - List tmpParts = new ArrayList(); + List tmpParts = new ArrayList<>(); tmpParts.addAll((Arrays.asList(str.split("[\\p{Z}\\p{C}\\p{P}]")))); int numberOfParts = tmpParts.size(); while (tmpParts.size() > 0) { @@ -156,9 +156,9 @@ public class KoelnerPhonetik implements StringEncoder { tmpParts.remove(0); } } - List variations = new ArrayList(); + List variations = new ArrayList<>(); for (int i = 0; i < parts.size(); i++) { - List variation = getVariations(parts.get(i)); + List variation = getVariations(parts.get(i)); if (variation != null) { variations.addAll(variation); } @@ -166,9 +166,9 @@ public class KoelnerPhonetik implements StringEncoder { return variations; } - private List getVariations(String str) { + private List getVariations(String str) { int position = 0; - List variations = new ArrayList(); + List variations = new ArrayList<>(); variations.add(""); while (position < str.length()) { int i = 0; @@ -182,7 +182,7 @@ public class KoelnerPhonetik implements StringEncoder { } if (substPos >= position) { i--; - List varNew = new ArrayList(); + List varNew = new ArrayList<>(); String prevPart = str.substring(position, substPos); for (int ii = 0; ii < variations.size(); ii++) { String tmp = variations.get(ii); diff --git a/plugins/jvm-example/build.gradle b/plugins/jvm-example/build.gradle index f0dd69ff8c4..c5828d9c86d 100644 --- a/plugins/jvm-example/build.gradle +++ b/plugins/jvm-example/build.gradle @@ -25,8 +25,6 @@ esplugin { // no unit tests test.enabled = false -compileJava.options.compilerArgs << "-Xlint:-rawtypes" - configurations { exampleFixture } diff --git a/plugins/jvm-example/src/main/java/org/elasticsearch/plugin/example/JvmExamplePlugin.java b/plugins/jvm-example/src/main/java/org/elasticsearch/plugin/example/JvmExamplePlugin.java index c1bcc65bfe2..0c0e71dc1c0 100644 --- a/plugins/jvm-example/src/main/java/org/elasticsearch/plugin/example/JvmExamplePlugin.java +++ b/plugins/jvm-example/src/main/java/org/elasticsearch/plugin/example/JvmExamplePlugin.java @@ -19,6 +19,10 @@ package org.elasticsearch.plugin.example; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; + import org.elasticsearch.common.component.LifecycleComponent; import org.elasticsearch.common.inject.AbstractModule; import org.elasticsearch.common.inject.Module; @@ -28,10 +32,6 @@ import org.elasticsearch.plugins.Plugin; import org.elasticsearch.repositories.RepositoriesModule; import org.elasticsearch.rest.action.cat.AbstractCatAction; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; - /** * Example of a plugin. */ @@ -59,6 +59,7 @@ public class JvmExamplePlugin extends Plugin { } @Override + @SuppressWarnings("rawtypes") // Plugin use a rawtype public Collection> nodeServices() { Collection> services = new ArrayList<>(); return services; diff --git a/plugins/mapper-murmur3/build.gradle b/plugins/mapper-murmur3/build.gradle index ca93c118487..5b985d9138f 100644 --- a/plugins/mapper-murmur3/build.gradle +++ b/plugins/mapper-murmur3/build.gradle @@ -21,5 +21,3 @@ esplugin { description 'The Mapper Murmur3 plugin allows to compute hashes of a field\'s values at index-time and to store them in the index.' classname 'org.elasticsearch.plugin.mapper.MapperMurmur3Plugin' } - -compileJava.options.compilerArgs << "-Xlint:-rawtypes" diff --git a/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java b/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java index 03b00d2ac39..ce78c75d783 100644 --- a/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java +++ b/plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java @@ -19,6 +19,10 @@ package org.elasticsearch.index.mapper.murmur3; +import java.io.IOException; +import java.util.List; +import java.util.Map; + import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.util.BytesRef; @@ -35,10 +39,6 @@ import org.elasticsearch.index.mapper.ParseContext; import org.elasticsearch.index.mapper.core.LongFieldMapper; import org.elasticsearch.index.mapper.core.NumberFieldMapper; -import java.io.IOException; -import java.util.List; -import java.util.Map; - import static org.elasticsearch.index.mapper.core.TypeParsers.parseNumberField; public class Murmur3FieldMapper extends LongFieldMapper { @@ -93,8 +93,7 @@ public class Murmur3FieldMapper extends LongFieldMapper { public static class TypeParser implements Mapper.TypeParser { @Override - @SuppressWarnings("unchecked") - public Mapper.Builder parse(String name, Map node, ParserContext parserContext) throws MapperParsingException { + public Mapper.Builder parse(String name, Map node, ParserContext parserContext) throws MapperParsingException { Builder builder = new Builder(name); // tweaking these settings is no longer allowed, the entire purpose of murmur3 fields is to store a hash From 244120a065a1198a32235609dd6e4d03b83cefe4 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Wed, 6 Jan 2016 23:53:05 -0500 Subject: [PATCH 36/59] Remove more Xlint skips --- plugins/lang-javascript/build.gradle | 4 - .../JavaScriptScriptEngineService.java | 32 ++-- .../script/javascript/support/NativeMap.java | 98 +++------- .../support/ScriptValueConverter.java | 20 +- .../support/ScriptableLinkedHashMap.java | 26 ++- .../support/ScriptableWrappedMap.java | 178 +++++------------- .../JavaScriptScriptEngineTests.java | 21 ++- plugins/lang-python/build.gradle | 3 - .../python/PythonScriptEngineTests.java | 13 +- 9 files changed, 137 insertions(+), 258 deletions(-) diff --git a/plugins/lang-javascript/build.gradle b/plugins/lang-javascript/build.gradle index ead459f29d1..cce5869341e 100644 --- a/plugins/lang-javascript/build.gradle +++ b/plugins/lang-javascript/build.gradle @@ -26,13 +26,9 @@ dependencies { compile 'org.mozilla:rhino:1.7.7' } -compileJava.options.compilerArgs << "-Xlint:-rawtypes,-unchecked" -compileTestJava.options.compilerArgs << "-Xlint:-rawtypes,-unchecked" - integTest { cluster { systemProperty 'es.script.inline', 'on' systemProperty 'es.script.indexed', 'on' } } - diff --git a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineService.java b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineService.java index eca1265766d..14124551e76 100644 --- a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineService.java +++ b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineService.java @@ -19,6 +19,18 @@ package org.elasticsearch.script.javascript; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.CodeSource; +import java.security.PrivilegedAction; +import java.security.cert.Certificate; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; + import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.search.Scorer; import org.elasticsearch.SpecialPermission; @@ -49,18 +61,6 @@ import org.mozilla.javascript.ScriptableObject; import org.mozilla.javascript.SecurityController; import org.mozilla.javascript.WrapFactory; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.security.AccessControlContext; -import java.security.AccessController; -import java.security.CodeSource; -import java.security.PrivilegedAction; -import java.security.cert.Certificate; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicLong; - /** * */ @@ -348,12 +348,14 @@ public class JavaScriptScriptEngineService extends AbstractComponent implements setJavaPrimitiveWrap(false); // RingoJS does that..., claims its annoying... } - public Scriptable wrapAsJavaObject(Context cx, Scriptable scope, Object javaObject, Class staticType) { + @Override + @SuppressWarnings("unchecked") + public Scriptable wrapAsJavaObject(Context cx, Scriptable scope, Object javaObject, Class staticType) { if (javaObject instanceof Map) { - return NativeMap.wrap(scope, (Map) javaObject); + return NativeMap.wrap(scope, (Map) javaObject); } if (javaObject instanceof List) { - return NativeList.wrap(scope, (List) javaObject, staticType); + return NativeList.wrap(scope, (List) javaObject, staticType); } return super.wrapAsJavaObject(cx, scope, javaObject, staticType); } diff --git a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/NativeMap.java b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/NativeMap.java index 1dbf3454900..ef9be14b0dd 100644 --- a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/NativeMap.java +++ b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/NativeMap.java @@ -19,12 +19,12 @@ package org.elasticsearch.script.javascript.support; -import org.mozilla.javascript.Scriptable; -import org.mozilla.javascript.Wrapper; - import java.util.Iterator; import java.util.Map; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.Wrapper; + /** * Wrapper for exposing maps in Rhino scripts. * @@ -55,26 +55,17 @@ public class NativeMap implements Scriptable, Wrapper { this.map = map; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Wrapper#unwrap() - */ - + @Override public Object unwrap() { return map; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getClassName() - */ - + @Override public String getClassName() { return "NativeMap"; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#get(java.lang.String, org.mozilla.javascript.Scriptable) - */ - + @Override public Object get(String name, Scriptable start) { // get the property from the underlying QName map if ("length".equals(name)) { @@ -84,69 +75,47 @@ public class NativeMap implements Scriptable, Wrapper { } } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#get(int, org.mozilla.javascript.Scriptable) - */ - + @Override public Object get(int index, Scriptable start) { Object value = null; int i = 0; - Iterator itrValues = map.values().iterator(); + Iterator itrValues = map.values().iterator(); while (i++ <= index && itrValues.hasNext()) { value = itrValues.next(); } return value; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#has(java.lang.String, org.mozilla.javascript.Scriptable) - */ - + @Override public boolean has(String name, Scriptable start) { // locate the property in the underlying map return map.containsKey(name); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#has(int, org.mozilla.javascript.Scriptable) - */ - + @Override public boolean has(int index, Scriptable start) { return (index >= 0 && map.values().size() > index); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#put(java.lang.String, org.mozilla.javascript.Scriptable, java.lang.Object) - */ - - @SuppressWarnings("unchecked") + @Override public void put(String name, Scriptable start, Object value) { map.put(name, value); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#put(int, org.mozilla.javascript.Scriptable, java.lang.Object) - */ - + @Override public void put(int index, Scriptable start, Object value) { // TODO: implement? } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#delete(java.lang.String) - */ - + @Override public void delete(String name) { map.remove(name); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#delete(int) - */ - + @Override public void delete(int index) { int i = 0; - Iterator itrKeys = map.keySet().iterator(); + Iterator itrKeys = map.keySet().iterator(); while (i <= index && itrKeys.hasNext()) { Object key = itrKeys.next(); if (i == index) { @@ -156,58 +125,37 @@ public class NativeMap implements Scriptable, Wrapper { } } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getPrototype() - */ - + @Override public Scriptable getPrototype() { return this.prototype; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#setPrototype(org.mozilla.javascript.Scriptable) - */ - + @Override public void setPrototype(Scriptable prototype) { this.prototype = prototype; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getParentScope() - */ - + @Override public Scriptable getParentScope() { return this.parentScope; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#setParentScope(org.mozilla.javascript.Scriptable) - */ - + @Override public void setParentScope(Scriptable parent) { this.parentScope = parent; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getIds() - */ - + @Override public Object[] getIds() { return map.keySet().toArray(); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getDefaultValue(java.lang.Class) - */ - - public Object getDefaultValue(Class hint) { + @Override + public Object getDefaultValue(Class hint) { return null; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#hasInstance(org.mozilla.javascript.Scriptable) - */ - + @Override public boolean hasInstance(Scriptable value) { if (!(value instanceof Wrapper)) return false; diff --git a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptValueConverter.java b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptValueConverter.java index a90948c1877..111d2a22b87 100644 --- a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptValueConverter.java +++ b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptValueConverter.java @@ -19,13 +19,6 @@ package org.elasticsearch.script.javascript.support; -import org.mozilla.javascript.Context; -import org.mozilla.javascript.IdScriptableObject; -import org.mozilla.javascript.NativeArray; -import org.mozilla.javascript.ScriptRuntime; -import org.mozilla.javascript.Scriptable; -import org.mozilla.javascript.Wrapper; - import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -33,6 +26,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.IdScriptableObject; +import org.mozilla.javascript.NativeArray; +import org.mozilla.javascript.ScriptRuntime; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.Wrapper; + /** * Value Converter to marshal objects between Java and Javascript. * @@ -126,6 +126,7 @@ public final class ScriptValueConverter { value = list; } else if (value instanceof Map) { // ensure each value in the Map is unwrapped (which may have been an unwrapped NativeMap!) + @SuppressWarnings("unchecked") Map map = (Map) value; Map copyMap = new HashMap(map.size()); for (Object key : map.keySet()) { @@ -157,6 +158,7 @@ public final class ScriptValueConverter { Context.getCurrentContext(), scope, TYPE_DATE, new Object[]{date.getTime()}); } else if (value instanceof Collection) { // recursively convert each value in the collection + @SuppressWarnings("unchecked") Collection collection = (Collection) value; Object[] array = new Object[collection.size()]; int index = 0; @@ -166,7 +168,9 @@ public final class ScriptValueConverter { // convert array to a native JavaScript Array value = Context.getCurrentContext().newArray(scope, array); } else if (value instanceof Map) { - value = NativeMap.wrap(scope, (Map) value); + @SuppressWarnings("unchecked") + Map map = (Map) value; + value = NativeMap.wrap(scope, map); } // simple numbers, strings and booleans are wrapped automatically by Rhino diff --git a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableLinkedHashMap.java b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableLinkedHashMap.java index 680b20a0256..f4df25f0861 100644 --- a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableLinkedHashMap.java +++ b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableLinkedHashMap.java @@ -19,12 +19,12 @@ package org.elasticsearch.script.javascript.support; -import org.mozilla.javascript.Scriptable; - import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; +import org.mozilla.javascript.Scriptable; + /** * Implementation of a Scriptable Map. This is the best choice for maps that want to represent * JavaScript associative arrays - allowing access via key and integer index. It maintains and @@ -53,6 +53,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#getClassName() */ + @Override public String getClassName() { return "ScriptableMap"; } @@ -60,6 +61,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#get(java.lang.String, org.mozilla.javascript.Scriptable) */ + @Override public Object get(String name, Scriptable start) { // get the property from the underlying QName map if ("length".equals(name)) { @@ -72,10 +74,11 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#get(int, org.mozilla.javascript.Scriptable) */ + @Override public Object get(int index, Scriptable start) { Object value = null; int i = 0; - Iterator itrValues = this.values().iterator(); + Iterator itrValues = this.values().iterator(); while (i++ <= index && itrValues.hasNext()) { value = itrValues.next(); } @@ -85,6 +88,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#has(java.lang.String, org.mozilla.javascript.Scriptable) */ + @Override public boolean has(String name, Scriptable start) { // locate the property in the underlying map return containsKey(name); @@ -93,6 +97,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#has(int, org.mozilla.javascript.Scriptable) */ + @Override public boolean has(int index, Scriptable start) { return (index >= 0 && this.values().size() > index); } @@ -100,6 +105,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#put(java.lang.String, org.mozilla.javascript.Scriptable, java.lang.Object) */ + @Override @SuppressWarnings("unchecked") public void put(String name, Scriptable start, Object value) { // add the property to the underlying QName map @@ -109,6 +115,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#put(int, org.mozilla.javascript.Scriptable, java.lang.Object) */ + @Override public void put(int index, Scriptable start, Object value) { // TODO: implement? } @@ -116,6 +123,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#delete(java.lang.String) */ + @Override public void delete(String name) { // remove the property from the underlying QName map remove(name); @@ -124,9 +132,10 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#delete(int) */ + @Override public void delete(int index) { int i = 0; - Iterator itrKeys = this.keySet().iterator(); + Iterator itrKeys = this.keySet().iterator(); while (i <= index && itrKeys.hasNext()) { Object key = itrKeys.next(); if (i == index) { @@ -139,6 +148,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#getPrototype() */ + @Override public Scriptable getPrototype() { return this.prototype; } @@ -146,6 +156,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#setPrototype(org.mozilla.javascript.Scriptable) */ + @Override public void setPrototype(Scriptable prototype) { this.prototype = prototype; } @@ -153,6 +164,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#getParentScope() */ + @Override public Scriptable getParentScope() { return this.parentScope; } @@ -160,6 +172,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#setParentScope(org.mozilla.javascript.Scriptable) */ + @Override public void setParentScope(Scriptable parent) { this.parentScope = parent; } @@ -167,6 +180,7 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#getIds() */ + @Override public Object[] getIds() { return keySet().toArray(); } @@ -174,13 +188,15 @@ public class ScriptableLinkedHashMap extends LinkedHashMap implement /** * @see org.mozilla.javascript.Scriptable#getDefaultValue(java.lang.Class) */ - public Object getDefaultValue(Class hint) { + @Override + public Object getDefaultValue(Class hint) { return null; } /** * @see org.mozilla.javascript.Scriptable#hasInstance(org.mozilla.javascript.Scriptable) */ + @Override public boolean hasInstance(Scriptable instance) { return instance instanceof ScriptableLinkedHashMap; } diff --git a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableWrappedMap.java b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableWrappedMap.java index 9ff1f61c8d5..1aa2326482a 100644 --- a/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableWrappedMap.java +++ b/plugins/lang-javascript/src/main/java/org/elasticsearch/script/javascript/support/ScriptableWrappedMap.java @@ -19,14 +19,14 @@ package org.elasticsearch.script.javascript.support; -import org.mozilla.javascript.Scriptable; -import org.mozilla.javascript.Wrapper; - import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Set; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.Wrapper; + /** * Implementation of a Scriptable Map. This is the best choice where you want values to be * persisted directly to an underlying map supplied on construction. The class automatically @@ -37,8 +37,8 @@ import java.util.Set; * * */ -public class ScriptableWrappedMap implements ScriptableMap, Wrapper { - private Map map; +public class ScriptableWrappedMap implements ScriptableMap, Wrapper { + private Map map; private Scriptable parentScope; private Scriptable prototype; @@ -54,38 +54,29 @@ public class ScriptableWrappedMap implements ScriptableMap, Wrapper { /** * Construct */ - public ScriptableWrappedMap(Map map) { + public ScriptableWrappedMap(Map map) { this.map = map; } /** * Construct */ - public ScriptableWrappedMap(Scriptable scope, Map map) { + public ScriptableWrappedMap(Scriptable scope, Map map) { this.parentScope = scope; this.map = map; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Wrapper#unwrap() - */ - + @Override public Object unwrap() { return map; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getClassName() - */ - + @Override public String getClassName() { return "ScriptableWrappedMap"; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#get(java.lang.String, org.mozilla.javascript.Scriptable) - */ - + @Override public Object get(String name, Scriptable start) { // get the property from the underlying QName map if ("length".equals(name)) { @@ -95,69 +86,47 @@ public class ScriptableWrappedMap implements ScriptableMap, Wrapper { } } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#get(int, org.mozilla.javascript.Scriptable) - */ - + @Override public Object get(int index, Scriptable start) { Object value = null; int i = 0; - Iterator itrValues = map.values().iterator(); + Iterator itrValues = map.values().iterator(); while (i++ <= index && itrValues.hasNext()) { value = itrValues.next(); } return ScriptValueConverter.wrapValue(this.parentScope != null ? this.parentScope : start, value); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#has(java.lang.String, org.mozilla.javascript.Scriptable) - */ - + @Override public boolean has(String name, Scriptable start) { // locate the property in the underlying map return map.containsKey(name); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#has(int, org.mozilla.javascript.Scriptable) - */ - + @Override public boolean has(int index, Scriptable start) { return (index >= 0 && map.values().size() > index); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#put(java.lang.String, org.mozilla.javascript.Scriptable, java.lang.Object) - */ - - @SuppressWarnings("unchecked") + @Override public void put(String name, Scriptable start, Object value) { map.put(name, ScriptValueConverter.unwrapValue(value)); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#put(int, org.mozilla.javascript.Scriptable, java.lang.Object) - */ - + @Override public void put(int index, Scriptable start, Object value) { // TODO: implement? } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#delete(java.lang.String) - */ - + @Override public void delete(String name) { map.remove(name); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#delete(int) - */ - + @Override public void delete(int index) { int i = 0; - Iterator itrKeys = map.keySet().iterator(); + Iterator itrKeys = map.keySet().iterator(); while (i <= index && itrKeys.hasNext()) { Object key = itrKeys.next(); if (i == index) { @@ -167,58 +136,37 @@ public class ScriptableWrappedMap implements ScriptableMap, Wrapper { } } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getPrototype() - */ - + @Override public Scriptable getPrototype() { return this.prototype; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#setPrototype(org.mozilla.javascript.Scriptable) - */ - + @Override public void setPrototype(Scriptable prototype) { this.prototype = prototype; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getParentScope() - */ - + @Override public Scriptable getParentScope() { return this.parentScope; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#setParentScope(org.mozilla.javascript.Scriptable) - */ - + @Override public void setParentScope(Scriptable parent) { this.parentScope = parent; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getIds() - */ - + @Override public Object[] getIds() { return map.keySet().toArray(); } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#getDefaultValue(java.lang.Class) - */ - - public Object getDefaultValue(Class hint) { + @Override + public Object getDefaultValue(Class hint) { return null; } - /* (non-Javadoc) - * @see org.mozilla.javascript.Scriptable#hasInstance(org.mozilla.javascript.Scriptable) - */ - + @Override public boolean hasInstance(Scriptable value) { if (!(value instanceof Wrapper)) return false; @@ -226,106 +174,66 @@ public class ScriptableWrappedMap implements ScriptableMap, Wrapper { return Map.class.isInstance(instance); } - /* (non-Javadoc) - * @see java.util.Map#clear() - */ - + @Override public void clear() { this.map.clear(); } - /* (non-Javadoc) - * @see java.util.Map#containsKey(java.lang.Object) - */ - + @Override public boolean containsKey(Object key) { return this.map.containsKey(key); } - /* (non-Javadoc) - * @see java.util.Map#containsValue(java.lang.Object) - */ - + @Override public boolean containsValue(Object value) { return this.map.containsValue(value); } - /* (non-Javadoc) - * @see java.util.Map#entrySet() - */ - - public Set entrySet() { + @Override + public Set> entrySet() { return this.map.entrySet(); } - /* (non-Javadoc) - * @see java.util.Map#get(java.lang.Object) - */ - + @Override public Object get(Object key) { return this.map.get(key); } - /* (non-Javadoc) - * @see java.util.Map#isEmpty() - */ - + @Override public boolean isEmpty() { return (this.map.size() == 0); } - /* (non-Javadoc) - * @see java.util.Map#keySet() - */ - - public Set keySet() { + @Override + public Set keySet() { return this.map.keySet(); } - /* (non-Javadoc) - * @see java.util.Map#put(java.lang.Object, java.lang.Object) - */ - + @Override public Object put(Object key, Object value) { return this.map.put(key, value); } - /* (non-Javadoc) - * @see java.util.Map#putAll(java.util.Map) - */ - - public void putAll(Map t) { + @Override + public void putAll(Map t) { this.map.putAll(t); } - /* (non-Javadoc) - * @see java.util.Map#remove(java.lang.Object) - */ - + @Override public Object remove(Object key) { return this.map.remove(key); } - /* (non-Javadoc) - * @see java.util.Map#size() - */ - + @Override public int size() { return this.map.size(); } - /* (non-Javadoc) - * @see java.util.Map#values() - */ - - public Collection values() { + @Override + public Collection values() { return this.map.values(); } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override public String toString() { return (this.map != null ? this.map.toString() : super.toString()); diff --git a/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineTests.java b/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineTests.java index 9d8357bb582..5ed2e7e4cb8 100644 --- a/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineTests.java +++ b/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptEngineTests.java @@ -19,6 +19,12 @@ package org.elasticsearch.script.javascript; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.script.CompiledScript; @@ -28,12 +34,6 @@ import org.elasticsearch.test.ESTestCase; import org.junit.After; import org.junit.Before; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; @@ -59,6 +59,7 @@ public class JavaScriptScriptEngineTests extends ESTestCase { assertThat(((Number) o).intValue(), equalTo(3)); } + @SuppressWarnings("unchecked") public void testMapAccess() { Map vars = new HashMap(); @@ -75,15 +76,17 @@ public class JavaScriptScriptEngineTests extends ESTestCase { assertThat(((String) o), equalTo("2")); } + @SuppressWarnings("unchecked") public void testJavaScriptObjectToMap() { Map vars = new HashMap(); Object o = se.executable(new CompiledScript(ScriptService.ScriptType.INLINE, "testJavaScriptObjectToMap", "js", se.compile("var obj1 = {}; obj1.prop1 = 'value1'; obj1.obj2 = {}; obj1.obj2.prop2 = 'value2'; obj1", Collections.emptyMap())), vars).run(); - Map obj1 = (Map) o; + Map obj1 = (Map) o; assertThat((String) obj1.get("prop1"), equalTo("value1")); assertThat((String) ((Map) obj1.get("obj2")).get("prop2"), equalTo("value2")); } + @SuppressWarnings("unchecked") public void testJavaScriptObjectMapInter() { Map vars = new HashMap(); Map ctx = new HashMap(); @@ -102,6 +105,7 @@ public class JavaScriptScriptEngineTests extends ESTestCase { assertThat((String) ((Map) ctx.get("obj2")).get("prop2"), equalTo("value2")); } + @SuppressWarnings("unchecked") public void testJavaScriptInnerArrayCreation() { Map ctx = new HashMap(); Map doc = new HashMap(); @@ -115,9 +119,10 @@ public class JavaScriptScriptEngineTests extends ESTestCase { Map unwrap = (Map) script.unwrap(ctx); - assertThat(((Map) unwrap.get("doc")).get("field1"), instanceOf(List.class)); + assertThat(((Map) unwrap.get("doc")).get("field1"), instanceOf(List.class)); } + @SuppressWarnings("unchecked") public void testAccessListInScript() { Map vars = new HashMap(); Map obj2 = MapBuilder.newMapBuilder().put("prop2", "value2").map(); diff --git a/plugins/lang-python/build.gradle b/plugins/lang-python/build.gradle index 103a15784ea..dde9a63bad1 100644 --- a/plugins/lang-python/build.gradle +++ b/plugins/lang-python/build.gradle @@ -26,9 +26,6 @@ dependencies { compile 'org.python:jython-standalone:2.7.0' } -compileJava.options.compilerArgs << "-Xlint:-unchecked" -compileTestJava.options.compilerArgs << "-Xlint:-unchecked" - integTest { cluster { systemProperty 'es.script.inline', 'on' diff --git a/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptEngineTests.java b/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptEngineTests.java index a0bfab43c54..fd876d8cee8 100644 --- a/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptEngineTests.java +++ b/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptEngineTests.java @@ -19,6 +19,11 @@ package org.elasticsearch.script.python; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.script.CompiledScript; @@ -28,11 +33,6 @@ import org.elasticsearch.test.ESTestCase; import org.junit.After; import org.junit.Before; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; @@ -58,6 +58,7 @@ public class PythonScriptEngineTests extends ESTestCase { assertThat(((Number) o).intValue(), equalTo(3)); } + @SuppressWarnings("unchecked") public void testMapAccess() { Map vars = new HashMap(); @@ -74,6 +75,7 @@ public class PythonScriptEngineTests extends ESTestCase { assertThat(((String) o), equalTo("2")); } + @SuppressWarnings("unchecked") public void testObjectMapInter() { Map vars = new HashMap(); Map ctx = new HashMap(); @@ -92,6 +94,7 @@ public class PythonScriptEngineTests extends ESTestCase { assertThat((String) ((Map) ctx.get("obj2")).get("prop2"), equalTo("value2")); } + @SuppressWarnings("unchecked") public void testAccessListInScript() { Map vars = new HashMap(); Map obj2 = MapBuilder.newMapBuilder().put("prop2", "value2").map(); From 604d59a95e9c48a70474594d8f8fc9ffb4f5eba8 Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Thu, 7 Jan 2016 09:54:47 +0100 Subject: [PATCH 37/59] muted test --- .../java/org/elasticsearch/percolator/RecoveryPercolatorIT.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java b/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java index 6ddd5b71b7c..57eb2e37ddf 100644 --- a/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java +++ b/core/src/test/java/org/elasticsearch/percolator/RecoveryPercolatorIT.java @@ -223,6 +223,7 @@ public class RecoveryPercolatorIT extends ESIntegTestCase { percolatorRecovery(false); } + @AwaitsFix(bugUrl = "sometimes reprodes with: gradle :core:integTest -Dtests.seed=21DDCAA92013B00C -Dtests.class=org.elasticsearch.percolator.RecoveryPercolatorIT -Dtests.method=\"testMultiPercolatorRecovery\"") public void testMultiPercolatorRecovery() throws Exception { percolatorRecovery(true); } From 67d233cecd74469308739f03f4a2708ad74d9119 Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Tue, 22 Dec 2015 17:08:35 +0100 Subject: [PATCH 38/59] Remove warmers and the warmer API. Warmers are now barely useful and will be removed in 3.0. Note that this only removes the warmer API and query-based warmers. We still have warmers internally for eg. global ordinals. Close #15607 --- .../elasticsearch/ElasticsearchException.java | 2 +- .../elasticsearch/action/ActionModule.java | 9 - .../admin/indices/get/GetIndexRequest.java | 5 +- .../admin/indices/get/GetIndexResponse.java | 47 +-- .../indices/get/TransportGetIndexAction.java | 11 +- .../warmer/delete/DeleteWarmerAction.java | 46 --- .../warmer/delete/DeleteWarmerRequest.java | 147 -------- .../delete/DeleteWarmerRequestBuilder.java | 60 --- .../warmer/delete/DeleteWarmerResponse.java | 51 --- .../delete/TransportDeleteWarmerAction.java | 163 -------- .../indices/warmer/get/GetWarmersAction.java | 46 --- .../indices/warmer/get/GetWarmersRequest.java | 64 ---- .../warmer/get/GetWarmersRequestBuilder.java | 46 --- .../warmer/get/GetWarmersResponse.java | 107 ------ .../warmer/get/TransportGetWarmersAction.java | 75 ---- .../admin/indices/warmer/package-info.java | 30 -- .../indices/warmer/put/PutWarmerAction.java | 46 --- .../indices/warmer/put/PutWarmerRequest.java | 153 -------- .../warmer/put/PutWarmerRequestBuilder.java | 72 ---- .../indices/warmer/put/PutWarmerResponse.java | 52 --- .../warmer/put/TransportPutWarmerAction.java | 167 --------- .../client/IndicesAdminClient.java | 54 --- .../client/support/AbstractClient.java | 57 --- .../cluster/metadata/IndexMetaData.java | 12 +- .../cluster/metadata/MetaData.java | 46 --- .../common/network/NetworkModule.java | 7 - .../indices/get/RestGetIndicesAction.java | 13 - .../warmer/delete/RestDeleteWarmerAction.java | 58 --- .../warmer/get/RestGetWarmerAction.java | 92 ----- .../warmer/put/RestPutWarmerAction.java | 85 ----- .../elasticsearch/search/SearchService.java | 74 ---- .../warmer/IndexWarmerMissingException.java | 61 --- .../search/warmer/IndexWarmersMetaData.java | 354 ------------------ .../ExceptionSerializationTests.java | 8 - .../action/admin/indices/get/GetIndexIT.java | 43 --- .../warmer/put/PutWarmerRequestTests.java | 35 -- .../GetIndexBackwardsCompatibilityIT.java | 18 - .../OldIndexBackwardsCompatibilityIT.java | 65 +++- .../cluster/ClusterStateDiffIT.java | 30 +- .../org/elasticsearch/cluster/ack/AckIT.java | 84 ----- .../indices/IndicesOptionsIntegrationIT.java | 91 ----- .../warmer/GatewayIndicesWarmerIT.java | 143 ------- .../indices/warmer/IndicesWarmerBlocksIT.java | 159 -------- .../indices/warmer/SimpleIndicesWarmerIT.java | 287 -------------- .../HeadersAndContextCopyClientTests.java | 1 - .../resources/indices/bwc/index-2.0.0.zip | Bin 73896 -> 91254 bytes .../resources/indices/bwc/index-2.0.1.zip | Bin 83074 -> 88838 bytes .../resources/indices/bwc/index-2.0.2.zip | Bin 83456 -> 86936 bytes .../resources/indices/bwc/index-2.1.0.zip | Bin 83669 -> 99075 bytes .../resources/indices/bwc/index-2.1.1.zip | Bin 71994 -> 72435 bytes .../test/resources/indices/bwc/repo-2.0.0.zip | Bin 71989 -> 89087 bytes .../test/resources/indices/bwc/repo-2.0.1.zip | Bin 81144 -> 86724 bytes .../test/resources/indices/bwc/repo-2.0.2.zip | Bin 81369 -> 84789 bytes .../test/resources/indices/bwc/repo-2.1.0.zip | Bin 81795 -> 97021 bytes .../test/resources/indices/bwc/repo-2.1.1.zip | Bin 70133 -> 70566 bytes dev-tools/create_bwc_index.py | 11 +- docs/reference/cat/thread_pool.asciidoc | 2 +- docs/reference/indices.asciidoc | 6 +- docs/reference/indices/create-index.asciidoc | 21 -- docs/reference/indices/get-index.asciidoc | 2 +- docs/reference/indices/warmers.asciidoc | 194 ---------- .../mapping/dynamic-mapping.asciidoc | 2 +- docs/reference/migration/migrate_1_0.asciidoc | 2 +- docs/reference/migration/migrate_1_4.asciidoc | 2 +- docs/reference/migration/migrate_3_0.asciidoc | 12 +- docs/reference/redirects.asciidoc | 6 + .../api/indices.delete_warmer.json | 33 -- .../rest-api-spec/api/indices.get.json | 2 +- .../rest-api-spec/api/indices.get_warmer.json | 45 --- .../rest-api-spec/api/indices.put_warmer.json | 53 --- .../test/indices.create/10_basic.yaml | 65 ---- .../all_path_options.yaml | 218 ----------- .../test/indices.get/10_basic.yaml | 24 +- .../test/indices.get_warmer/10_basic.yaml | 201 ---------- .../test/indices.get_warmer/20_empty.yaml | 19 - .../test/indices.put_warmer/10_basic.yaml | 145 ------- .../test/indices.put_warmer/20_aliases.yaml | 30 -- .../indices.put_warmer/all_path_options.yaml | 134 ------- 78 files changed, 111 insertions(+), 4394 deletions(-) delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerAction.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequest.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequestBuilder.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerResponse.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/TransportDeleteWarmerAction.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersAction.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequest.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequestBuilder.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersResponse.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/TransportGetWarmersAction.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/package-info.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerAction.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestBuilder.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerResponse.java delete mode 100644 core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/TransportPutWarmerAction.java delete mode 100644 core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/delete/RestDeleteWarmerAction.java delete mode 100644 core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/get/RestGetWarmerAction.java delete mode 100644 core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/put/RestPutWarmerAction.java delete mode 100644 core/src/main/java/org/elasticsearch/search/warmer/IndexWarmerMissingException.java delete mode 100644 core/src/main/java/org/elasticsearch/search/warmer/IndexWarmersMetaData.java delete mode 100644 core/src/test/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestTests.java delete mode 100644 core/src/test/java/org/elasticsearch/indices/warmer/GatewayIndicesWarmerIT.java delete mode 100644 core/src/test/java/org/elasticsearch/indices/warmer/IndicesWarmerBlocksIT.java delete mode 100644 core/src/test/java/org/elasticsearch/indices/warmer/SimpleIndicesWarmerIT.java delete mode 100644 docs/reference/indices/warmers.asciidoc delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/api/indices.delete_warmer.json delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/api/indices.get_warmer.json delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_warmer.json delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/test/indices.delete_warmer/all_path_options.yaml delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/10_basic.yaml delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/20_empty.yaml delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/10_basic.yaml delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/20_aliases.yaml delete mode 100644 rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/all_path_options.yaml diff --git a/core/src/main/java/org/elasticsearch/ElasticsearchException.java b/core/src/main/java/org/elasticsearch/ElasticsearchException.java index 9f9dbf18869..4a35bcbcfb0 100644 --- a/core/src/main/java/org/elasticsearch/ElasticsearchException.java +++ b/core/src/main/java/org/elasticsearch/ElasticsearchException.java @@ -566,7 +566,7 @@ public class ElasticsearchException extends RuntimeException implements ToXConte REFRESH_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.RefreshFailedEngineException.class, org.elasticsearch.index.engine.RefreshFailedEngineException::new, 90), AGGREGATION_INITIALIZATION_EXCEPTION(org.elasticsearch.search.aggregations.AggregationInitializationException.class, org.elasticsearch.search.aggregations.AggregationInitializationException::new, 91), DELAY_RECOVERY_EXCEPTION(org.elasticsearch.indices.recovery.DelayRecoveryException.class, org.elasticsearch.indices.recovery.DelayRecoveryException::new, 92), - INDEX_WARMER_MISSING_EXCEPTION(org.elasticsearch.search.warmer.IndexWarmerMissingException.class, org.elasticsearch.search.warmer.IndexWarmerMissingException::new, 93), + // 93 used to be for IndexWarmerMissingException NO_NODE_AVAILABLE_EXCEPTION(org.elasticsearch.client.transport.NoNodeAvailableException.class, org.elasticsearch.client.transport.NoNodeAvailableException::new, 94), INVALID_SNAPSHOT_NAME_EXCEPTION(org.elasticsearch.snapshots.InvalidSnapshotNameException.class, org.elasticsearch.snapshots.InvalidSnapshotNameException::new, 96), ILLEGAL_INDEX_SHARD_STATE_EXCEPTION(org.elasticsearch.index.shard.IllegalIndexShardStateException.class, org.elasticsearch.index.shard.IllegalIndexShardStateException::new, 97), diff --git a/core/src/main/java/org/elasticsearch/action/ActionModule.java b/core/src/main/java/org/elasticsearch/action/ActionModule.java index 11cafb326a0..5f1a181fabb 100644 --- a/core/src/main/java/org/elasticsearch/action/ActionModule.java +++ b/core/src/main/java/org/elasticsearch/action/ActionModule.java @@ -127,12 +127,6 @@ import org.elasticsearch.action.admin.indices.upgrade.post.UpgradeAction; import org.elasticsearch.action.admin.indices.upgrade.post.UpgradeSettingsAction; import org.elasticsearch.action.admin.indices.validate.query.TransportValidateQueryAction; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryAction; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerAction; -import org.elasticsearch.action.admin.indices.warmer.delete.TransportDeleteWarmerAction; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersAction; -import org.elasticsearch.action.admin.indices.warmer.get.TransportGetWarmersAction; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerAction; -import org.elasticsearch.action.admin.indices.warmer.put.TransportPutWarmerAction; import org.elasticsearch.action.bulk.BulkAction; import org.elasticsearch.action.bulk.TransportBulkAction; import org.elasticsearch.action.bulk.TransportShardBulkAction; @@ -304,9 +298,6 @@ public class ActionModule extends AbstractModule { registerAction(UpgradeStatusAction.INSTANCE, TransportUpgradeStatusAction.class); registerAction(UpgradeSettingsAction.INSTANCE, TransportUpgradeSettingsAction.class); registerAction(ClearIndicesCacheAction.INSTANCE, TransportClearIndicesCacheAction.class); - registerAction(PutWarmerAction.INSTANCE, TransportPutWarmerAction.class); - registerAction(DeleteWarmerAction.INSTANCE, TransportDeleteWarmerAction.class); - registerAction(GetWarmersAction.INSTANCE, TransportGetWarmersAction.class); registerAction(GetAliasesAction.INSTANCE, TransportGetAliasesAction.class); registerAction(AliasesExistAction.INSTANCE, TransportAliasesExistAction.class); registerAction(GetSettingsAction.INSTANCE, TransportGetSettingsAction.class); diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java b/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java index 4c85cd85f3d..80ce5050f0a 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java @@ -37,8 +37,7 @@ public class GetIndexRequest extends ClusterInfoRequest { public static enum Feature { ALIASES((byte) 0, "_aliases", "_alias"), MAPPINGS((byte) 1, "_mappings", "_mapping"), - SETTINGS((byte) 2, "_settings"), - WARMERS((byte) 3, "_warmers", "_warmer"); + SETTINGS((byte) 2, "_settings"); private static final Feature[] FEATURES = new Feature[Feature.values().length]; @@ -97,7 +96,7 @@ public class GetIndexRequest extends ClusterInfoRequest { } } - private static final Feature[] DEFAULT_FEATURES = new Feature[] { Feature.ALIASES, Feature.MAPPINGS, Feature.SETTINGS, Feature.WARMERS }; + private static final Feature[] DEFAULT_FEATURES = new Feature[] { Feature.ALIASES, Feature.MAPPINGS, Feature.SETTINGS }; private Feature[] features = DEFAULT_FEATURES; private boolean humanReadable = false; diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexResponse.java index 1f06a25acc3..3a29237faeb 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexResponse.java @@ -27,7 +27,6 @@ import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import java.io.IOException; import java.util.ArrayList; @@ -39,19 +38,15 @@ import java.util.List; */ public class GetIndexResponse extends ActionResponse { - private ImmutableOpenMap> warmers = ImmutableOpenMap.of(); private ImmutableOpenMap> mappings = ImmutableOpenMap.of(); private ImmutableOpenMap> aliases = ImmutableOpenMap.of(); private ImmutableOpenMap settings = ImmutableOpenMap.of(); private String[] indices; - GetIndexResponse(String[] indices, ImmutableOpenMap> warmers, + GetIndexResponse(String[] indices, ImmutableOpenMap> mappings, ImmutableOpenMap> aliases, ImmutableOpenMap settings) { this.indices = indices; - if (warmers != null) { - this.warmers = warmers; - } if (mappings != null) { this.mappings = mappings; } @@ -74,14 +69,6 @@ public class GetIndexResponse extends ActionResponse { return indices(); } - public ImmutableOpenMap> warmers() { - return warmers; - } - - public ImmutableOpenMap> getWarmers() { - return warmers(); - } - public ImmutableOpenMap> mappings() { return mappings; } @@ -110,23 +97,6 @@ public class GetIndexResponse extends ActionResponse { public void readFrom(StreamInput in) throws IOException { super.readFrom(in); this.indices = in.readStringArray(); - int warmersSize = in.readVInt(); - ImmutableOpenMap.Builder> warmersMapBuilder = ImmutableOpenMap.builder(); - for (int i = 0; i < warmersSize; i++) { - String key = in.readString(); - int valueSize = in.readVInt(); - List warmerEntryBuilder = new ArrayList<>(); - for (int j = 0; j < valueSize; j++) { - warmerEntryBuilder.add(new IndexWarmersMetaData.Entry( - in.readString(), - in.readStringArray(), - in.readOptionalBoolean(), - in.readBoolean() ? new IndexWarmersMetaData.SearchSource(in) : null) - ); - } - warmersMapBuilder.put(key, Collections.unmodifiableList(warmerEntryBuilder)); - } - warmers = warmersMapBuilder.build(); int mappingsSize = in.readVInt(); ImmutableOpenMap.Builder> mappingsMapBuilder = ImmutableOpenMap.builder(); for (int i = 0; i < mappingsSize; i++) { @@ -164,21 +134,6 @@ public class GetIndexResponse extends ActionResponse { public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeStringArray(indices); - out.writeVInt(warmers.size()); - for (ObjectObjectCursor> indexEntry : warmers) { - out.writeString(indexEntry.key); - out.writeVInt(indexEntry.value.size()); - for (IndexWarmersMetaData.Entry warmerEntry : indexEntry.value) { - out.writeString(warmerEntry.name()); - out.writeStringArray(warmerEntry.types()); - out.writeOptionalBoolean(warmerEntry.requestCache()); - boolean hasSource = warmerEntry.source() != null; - out.writeBoolean(hasSource); - if (hasSource) { - warmerEntry.source().writeTo(out); - } - } - } out.writeVInt(mappings.size()); for (ObjectObjectCursor> indexEntry : mappings) { out.writeString(indexEntry.key); diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/get/TransportGetIndexAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/get/TransportGetIndexAction.java index 4edbd5216cd..1b9180ce192 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/get/TransportGetIndexAction.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/get/TransportGetIndexAction.java @@ -36,7 +36,6 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.search.warmer.IndexWarmersMetaData.Entry; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; @@ -72,7 +71,6 @@ public class TransportGetIndexAction extends TransportClusterInfoAction listener) { - ImmutableOpenMap> warmersResult = ImmutableOpenMap.of(); ImmutableOpenMap> mappingsResult = ImmutableOpenMap.of(); ImmutableOpenMap> aliasesResult = ImmutableOpenMap.of(); ImmutableOpenMap settings = ImmutableOpenMap.of(); @@ -80,15 +78,8 @@ public class TransportGetIndexAction extends TransportClusterInfoAction { - - public static final DeleteWarmerAction INSTANCE = new DeleteWarmerAction(); - public static final String NAME = "indices:admin/warmers/delete"; - - private DeleteWarmerAction() { - super(NAME); - } - - @Override - public DeleteWarmerResponse newResponse() { - return new DeleteWarmerResponse(); - } - - @Override - public DeleteWarmerRequestBuilder newRequestBuilder(ElasticsearchClient client) { - return new DeleteWarmerRequestBuilder(client, this); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequest.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequest.java deleted file mode 100644 index 39312e5a3d7..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequest.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * 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.action.admin.indices.warmer.delete; - -import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.action.IndicesRequest; -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.action.support.master.AcknowledgedRequest; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.util.CollectionUtils; - -import java.io.IOException; - -import static org.elasticsearch.action.ValidateActions.addValidationError; - -/** - * A request that deletes a index warmer (name, {@link org.elasticsearch.action.search.SearchRequest}) - * tuple from the clusters metadata. - */ -public class DeleteWarmerRequest extends AcknowledgedRequest implements IndicesRequest.Replaceable { - - private String[] names = Strings.EMPTY_ARRAY; - private IndicesOptions indicesOptions = IndicesOptions.fromOptions(false, false, true, false); - private String[] indices = Strings.EMPTY_ARRAY; - - public DeleteWarmerRequest() { - } - - /** - * Constructs a new delete warmer request for the specified name. - * - * @param names the name (or wildcard expression) of the warmer to match, null to delete all. - */ - public DeleteWarmerRequest(String... names) { - names(names); - } - - @Override - public ActionRequestValidationException validate() { - ActionRequestValidationException validationException = null; - if (CollectionUtils.isEmpty(names)) { - validationException = addValidationError("warmer names are missing", validationException); - } else { - validationException = checkForEmptyString(validationException, names); - } - if (CollectionUtils.isEmpty(indices)) { - validationException = addValidationError("indices are missing", validationException); - } else { - validationException = checkForEmptyString(validationException, indices); - } - return validationException; - } - - private ActionRequestValidationException checkForEmptyString(ActionRequestValidationException validationException, String[] strings) { - boolean containsEmptyString = false; - for (String string : strings) { - if (!Strings.hasText(string)) { - containsEmptyString = true; - } - } - if (containsEmptyString) { - validationException = addValidationError("types must not contain empty strings", validationException); - } - return validationException; - } - - /** - * The name to delete. - */ - @Nullable - public String[] names() { - return names; - } - - /** - * The name (or wildcard expression) of the index warmer to delete, or null - * to delete all warmers. - */ - public DeleteWarmerRequest names(@Nullable String... names) { - this.names = names; - return this; - } - - /** - * Sets the indices this put mapping operation will execute on. - */ - @Override - public DeleteWarmerRequest indices(String... indices) { - this.indices = indices; - return this; - } - - /** - * The indices the mappings will be put. - */ - @Override - public String[] indices() { - return indices; - } - - @Override - public IndicesOptions indicesOptions() { - return indicesOptions; - } - - public DeleteWarmerRequest indicesOptions(IndicesOptions indicesOptions) { - this.indicesOptions = indicesOptions; - return this; - } - - @Override - public void readFrom(StreamInput in) throws IOException { - super.readFrom(in); - names = in.readStringArray(); - indices = in.readStringArray(); - indicesOptions = IndicesOptions.readIndicesOptions(in); - readTimeout(in); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - out.writeStringArrayNullable(names); - out.writeStringArrayNullable(indices); - indicesOptions.writeIndicesOptions(out); - writeTimeout(out); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequestBuilder.java deleted file mode 100644 index fdba95b590f..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerRequestBuilder.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.action.admin.indices.warmer.delete; - -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.action.support.master.AcknowledgedRequestBuilder; -import org.elasticsearch.client.ElasticsearchClient; - -/** - * A builder for the {@link DeleteWarmerRequest} - * - * @see DeleteWarmerRequest for details - */ -public class DeleteWarmerRequestBuilder extends AcknowledgedRequestBuilder { - - public DeleteWarmerRequestBuilder(ElasticsearchClient client, DeleteWarmerAction action) { - super(client, action, new DeleteWarmerRequest()); - } - - public DeleteWarmerRequestBuilder setIndices(String... indices) { - request.indices(indices); - return this; - } - - /** - * The name (or wildcard expression) of the index warmer to delete, or null - * to delete all warmers. - */ - public DeleteWarmerRequestBuilder setNames(String... names) { - request.names(names); - return this; - } - - /** - * Specifies what type of requested indices to ignore and wildcard indices expressions. - *

- * For example indices that don't exist. - */ - public DeleteWarmerRequestBuilder setIndicesOptions(IndicesOptions options) { - request.indicesOptions(options); - return this; - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerResponse.java deleted file mode 100644 index 6e5235f78b2..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/DeleteWarmerResponse.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.action.admin.indices.warmer.delete; - -import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; - -import java.io.IOException; - -/** - * An acknowledged response of delete warmer operation. - */ -public class DeleteWarmerResponse extends AcknowledgedResponse { - - DeleteWarmerResponse() { - super(); - } - - DeleteWarmerResponse(boolean acknowledged) { - super(acknowledged); - } - - @Override - public void readFrom(StreamInput in) throws IOException { - super.readFrom(in); - readAcknowledged(in); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - writeAcknowledged(out); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/TransportDeleteWarmerAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/TransportDeleteWarmerAction.java deleted file mode 100644 index 293729af462..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/delete/TransportDeleteWarmerAction.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * 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.action.admin.indices.warmer.delete; - -import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.support.ActionFilters; -import org.elasticsearch.action.support.master.TransportMasterNodeAction; -import org.elasticsearch.cluster.AckedClusterStateUpdateTask; -import org.elasticsearch.cluster.ClusterService; -import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.block.ClusterBlockException; -import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.IndexMetaData; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; -import org.elasticsearch.cluster.metadata.MetaData; -import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.regex.Regex; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.IndexNotFoundException; -import org.elasticsearch.search.warmer.IndexWarmerMissingException; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; -import org.elasticsearch.threadpool.ThreadPool; -import org.elasticsearch.transport.TransportService; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Internal Actions executed on the master deleting the warmer from the cluster state metadata. - * - * Note: this is an internal API and should not be used / called by any client code. - */ -public class TransportDeleteWarmerAction extends TransportMasterNodeAction { - - @Inject - public TransportDeleteWarmerAction(Settings settings, TransportService transportService, ClusterService clusterService, - ThreadPool threadPool, ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver) { - super(settings, DeleteWarmerAction.NAME, transportService, clusterService, threadPool, actionFilters, indexNameExpressionResolver, DeleteWarmerRequest::new); - } - - @Override - protected String executor() { - // we go async right away - return ThreadPool.Names.SAME; - } - - @Override - protected DeleteWarmerResponse newResponse() { - return new DeleteWarmerResponse(); - } - - @Override - protected ClusterBlockException checkBlock(DeleteWarmerRequest request, ClusterState state) { - return state.blocks().indicesBlockedException(ClusterBlockLevel.METADATA_WRITE, indexNameExpressionResolver.concreteIndices(state, request)); - } - - @Override - protected void masterOperation(final DeleteWarmerRequest request, final ClusterState state, final ActionListener listener) { - final String[] concreteIndices = indexNameExpressionResolver.concreteIndices(state, request); - clusterService.submitStateUpdateTask("delete_warmer [" + Arrays.toString(request.names()) + "]", new AckedClusterStateUpdateTask(request, listener) { - - @Override - protected DeleteWarmerResponse newResponse(boolean acknowledged) { - return new DeleteWarmerResponse(acknowledged); - } - - @Override - public void onFailure(String source, Throwable t) { - logger.debug("failed to delete warmer [{}] on indices [{}]", t, Arrays.toString(request.names()), concreteIndices); - super.onFailure(source, t); - } - - @Override - public ClusterState execute(ClusterState currentState) { - MetaData.Builder mdBuilder = MetaData.builder(currentState.metaData()); - - boolean globalFoundAtLeastOne = false; - boolean deleteAll = false; - for (int i=0; i entries = new ArrayList<>(); - for (IndexWarmersMetaData.Entry entry : warmers.entries()) { - boolean keepWarmer = true; - for (String warmer : request.names()) { - if (Regex.simpleMatch(warmer, entry.name()) || warmer.equals(MetaData.ALL)) { - globalFoundAtLeastOne = true; - keepWarmer = false; - // don't add it... - break; - } - } - if (keepWarmer) { - entries.add(entry); - } - } - // a change, update it... - if (entries.size() != warmers.entries().size()) { - warmers = new IndexWarmersMetaData(entries.toArray(new IndexWarmersMetaData.Entry[entries.size()])); - IndexMetaData.Builder indexBuilder = IndexMetaData.builder(indexMetaData).putCustom(IndexWarmersMetaData.TYPE, warmers); - mdBuilder.put(indexBuilder); - } - } - } - - if (globalFoundAtLeastOne == false && deleteAll == false) { - throw new IndexWarmerMissingException(request.names()); - } - - if (logger.isInfoEnabled()) { - for (String index : concreteIndices) { - IndexMetaData indexMetaData = currentState.metaData().index(index); - if (indexMetaData == null) { - throw new IndexNotFoundException(index); - } - IndexWarmersMetaData warmers = indexMetaData.custom(IndexWarmersMetaData.TYPE); - if (warmers != null) { - for (IndexWarmersMetaData.Entry entry : warmers.entries()) { - for (String warmer : request.names()) { - if (Regex.simpleMatch(warmer, entry.name()) || warmer.equals(MetaData.ALL)) { - logger.info("[{}] delete warmer [{}]", index, entry.name()); - } - } - } - } else if(deleteAll){ - logger.debug("no warmers to delete on index [{}]", index); - } - } - } - - return ClusterState.builder(currentState).metaData(mdBuilder).build(); - } - }); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersAction.java deleted file mode 100644 index e2debde72a6..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersAction.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.action.admin.indices.warmer.get; - -import org.elasticsearch.action.Action; -import org.elasticsearch.client.ElasticsearchClient; - -/** - * Action for the admin/warmers/get API. - */ -public class GetWarmersAction extends Action { - - public static final GetWarmersAction INSTANCE = new GetWarmersAction(); - public static final String NAME = "indices:admin/warmers/get"; - - private GetWarmersAction() { - super(NAME); - } - - @Override - public GetWarmersRequestBuilder newRequestBuilder(ElasticsearchClient client) { - return new GetWarmersRequestBuilder(client, this); - } - - @Override - public GetWarmersResponse newResponse() { - return new GetWarmersResponse(); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequest.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequest.java deleted file mode 100644 index bebf0d40b6e..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.action.admin.indices.warmer.get; - -import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.action.support.master.info.ClusterInfoRequest; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; - -import java.io.IOException; - -/** - * A {@link ClusterInfoRequest} that fetches {@link org.elasticsearch.search.warmer.IndexWarmersMetaData} for - * a list or all existing index warmers in the cluster-state - */ -public class GetWarmersRequest extends ClusterInfoRequest { - - private String[] warmers = Strings.EMPTY_ARRAY; - - public GetWarmersRequest warmers(String[] warmers) { - this.warmers = warmers; - return this; - } - - public String[] warmers() { - return warmers; - } - - @Override - public ActionRequestValidationException validate() { - return null; - } - - @Override - public void readFrom(StreamInput in) throws IOException { - super.readFrom(in); - warmers = in.readStringArray(); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - out.writeStringArray(warmers); - } - -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequestBuilder.java deleted file mode 100644 index de67d38603a..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersRequestBuilder.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.action.admin.indices.warmer.get; - -import org.elasticsearch.action.support.master.info.ClusterInfoRequestBuilder; -import org.elasticsearch.client.ElasticsearchClient; -import org.elasticsearch.common.util.ArrayUtils; - -/** - * Builder for {@link GetWarmersRequest} - * - * @see GetWarmersRequest for details - */ -public class GetWarmersRequestBuilder extends ClusterInfoRequestBuilder { - - public GetWarmersRequestBuilder(ElasticsearchClient client, GetWarmersAction action, String... indices) { - super(client, action, new GetWarmersRequest().indices(indices)); - } - - public GetWarmersRequestBuilder setWarmers(String... warmers) { - request.warmers(warmers); - return this; - } - - public GetWarmersRequestBuilder addWarmers(String... warmers) { - request.warmers(ArrayUtils.concat(request.warmers(), warmers)); - return this; - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersResponse.java deleted file mode 100644 index 0559e522925..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/GetWarmersResponse.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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.action.admin.indices.warmer.get; - -import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import org.elasticsearch.action.ActionResponse; -import org.elasticsearch.common.collect.ImmutableOpenMap; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Holds a warmer-name to a list of {@link IndexWarmersMetaData} mapping for each warmer specified - * in the {@link GetWarmersRequest}. This information is fetched from the current master since the metadata - * is contained inside the cluster-state - */ -public class GetWarmersResponse extends ActionResponse { - - private ImmutableOpenMap> warmers = ImmutableOpenMap.of(); - - GetWarmersResponse(ImmutableOpenMap> warmers) { - this.warmers = warmers; - } - - GetWarmersResponse() { - } - - public ImmutableOpenMap> warmers() { - return warmers; - } - - public ImmutableOpenMap> getWarmers() { - return warmers(); - } - - @Override - public void readFrom(StreamInput in) throws IOException { - super.readFrom(in); - int size = in.readVInt(); - ImmutableOpenMap.Builder> indexMapBuilder = ImmutableOpenMap.builder(); - for (int i = 0; i < size; i++) { - String key = in.readString(); - int valueSize = in.readVInt(); - List warmerEntryBuilder = new ArrayList<>(); - for (int j = 0; j < valueSize; j++) { - String name = in.readString(); - String[] types = in.readStringArray(); - IndexWarmersMetaData.SearchSource source = null; - if (in.readBoolean()) { - source = new IndexWarmersMetaData.SearchSource(in); - } - Boolean queryCache = null; - queryCache = in.readOptionalBoolean(); - warmerEntryBuilder.add(new IndexWarmersMetaData.Entry( - name, - types, - queryCache, - source) - ); - } - indexMapBuilder.put(key, Collections.unmodifiableList(warmerEntryBuilder)); - } - warmers = indexMapBuilder.build(); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - out.writeVInt(warmers.size()); - for (ObjectObjectCursor> indexEntry : warmers) { - out.writeString(indexEntry.key); - out.writeVInt(indexEntry.value.size()); - for (IndexWarmersMetaData.Entry warmerEntry : indexEntry.value) { - out.writeString(warmerEntry.name()); - out.writeStringArray(warmerEntry.types()); - boolean hasWarmerSource = warmerEntry != null; - out.writeBoolean(hasWarmerSource); - if (hasWarmerSource) { - warmerEntry.source().writeTo(out); - } - out.writeOptionalBoolean(warmerEntry.requestCache()); - } - } - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/TransportGetWarmersAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/TransportGetWarmersAction.java deleted file mode 100644 index a86a6260ca3..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/get/TransportGetWarmersAction.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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.action.admin.indices.warmer.get; - -import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.support.ActionFilters; -import org.elasticsearch.action.support.master.info.TransportClusterInfoAction; -import org.elasticsearch.cluster.ClusterService; -import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.block.ClusterBlockException; -import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; -import org.elasticsearch.common.collect.ImmutableOpenMap; -import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; -import org.elasticsearch.threadpool.ThreadPool; -import org.elasticsearch.transport.TransportService; - -import java.util.List; - -/** - * Internal Actions executed on the master fetching the warmer from the cluster state metadata. - * - * Note: this is an internal API and should not be used / called by any client code. - */ -public class TransportGetWarmersAction extends TransportClusterInfoAction { - - @Inject - public TransportGetWarmersAction(Settings settings, TransportService transportService, ClusterService clusterService, - ThreadPool threadPool, ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver) { - super(settings, GetWarmersAction.NAME, transportService, clusterService, threadPool, actionFilters, indexNameExpressionResolver, GetWarmersRequest::new); - } - - @Override - protected String executor() { - // very lightweight operation, no need to fork - return ThreadPool.Names.SAME; - } - - @Override - protected ClusterBlockException checkBlock(GetWarmersRequest request, ClusterState state) { - return state.blocks().indicesBlockedException(ClusterBlockLevel.METADATA_READ, indexNameExpressionResolver.concreteIndices(state, request)); - } - - @Override - protected GetWarmersResponse newResponse() { - return new GetWarmersResponse(); - } - - @Override - protected void doMasterOperation(final GetWarmersRequest request, String[] concreteIndices, final ClusterState state, final ActionListener listener) { - ImmutableOpenMap> result = state.metaData().findWarmers( - concreteIndices, request.types(), request.warmers() - ); - listener.onResponse(new GetWarmersResponse(result)); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/package-info.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/package-info.java deleted file mode 100644 index 053cc75caa3..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/package-info.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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. - */ - -/** - * Index / Search Warmer Administrative Actions - *

- * Index warming allows to run registered search requests to warm up the index before it is available for search. - * With the near real time aspect of search, cold data (segments) will be warmed up before they become available for - * search. This includes things such as the query cache, filesystem cache, and loading field data for fields. - *

- * - * See the reference guide for more detailed information about the Indices / Search Warmer - */ -package org.elasticsearch.action.admin.indices.warmer; diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerAction.java deleted file mode 100644 index 3c5c8b7c412..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerAction.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.action.admin.indices.warmer.put; - -import org.elasticsearch.action.Action; -import org.elasticsearch.client.ElasticsearchClient; - -/** - * Action for the admin/warmers/put API. - */ -public class PutWarmerAction extends Action { - - public static final PutWarmerAction INSTANCE = new PutWarmerAction(); - public static final String NAME = "indices:admin/warmers/put"; - - private PutWarmerAction() { - super(NAME); - } - - @Override - public PutWarmerResponse newResponse() { - return new PutWarmerResponse(); - } - - @Override - public PutWarmerRequestBuilder newRequestBuilder(ElasticsearchClient client) { - return new PutWarmerRequestBuilder(client, this); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java deleted file mode 100644 index 77f8f426876..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequest.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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.action.admin.indices.warmer.put; - -import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.action.IndicesRequest; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchRequestBuilder; -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.action.support.master.AcknowledgedRequest; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; - -import java.io.IOException; - -import static org.elasticsearch.action.ValidateActions.addValidationError; - -/** - * A request that associates a {@link SearchRequest} with a name in the cluster that is - * in-turn used to warm up indices before they are available for search. - * - * Note: neither the search request nor the name must be null - */ -public class PutWarmerRequest extends AcknowledgedRequest implements IndicesRequest.Replaceable { - - private String name; - - private SearchRequest searchRequest; - - public PutWarmerRequest() { - } - - /** - * Constructs a new warmer. - * - * @param name The name of the warmer. - */ - public PutWarmerRequest(String name) { - this.name = name; - } - - /** - * Sets the name of the warmer. - */ - public PutWarmerRequest name(String name) { - this.name = name; - return this; - } - - public String name() { - return this.name; - } - - /** - * Sets the search request to warm. - */ - public PutWarmerRequest searchRequest(SearchRequest searchRequest) { - this.searchRequest = searchRequest; - return this; - } - - /** - * Sets the search request to warm. - */ - public PutWarmerRequest searchRequest(SearchRequestBuilder searchRequest) { - this.searchRequest = searchRequest.request(); - return this; - } - - public SearchRequest searchRequest() { - return this.searchRequest; - } - - @Override - public ActionRequestValidationException validate() { - ActionRequestValidationException validationException = null; - if (searchRequest == null) { - validationException = addValidationError("search request is missing", validationException); - } else { - validationException = searchRequest.validate(); - } - if (name == null) { - validationException = addValidationError("name is missing", validationException); - } - return validationException; - } - - @Override - public String[] indices() { - if (searchRequest == null) { - throw new IllegalStateException("unable to retrieve indices, search request is null"); - } - return searchRequest.indices(); - } - - @Override - public IndicesRequest indices(String... indices) { - if (searchRequest == null) { - throw new IllegalStateException("unable to set indices, search request is null"); - } - searchRequest.indices(indices); - return this; - } - - @Override - public IndicesOptions indicesOptions() { - if (searchRequest == null) { - throw new IllegalStateException("unable to retrieve indices options, search request is null"); - } - return searchRequest.indicesOptions(); - } - - @Override - public void readFrom(StreamInput in) throws IOException { - super.readFrom(in); - name = in.readString(); - if (in.readBoolean()) { - searchRequest = new SearchRequest(); - searchRequest.readFrom(in); - } - readTimeout(in); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - out.writeString(name); - if (searchRequest == null) { - out.writeBoolean(false); - } else { - out.writeBoolean(true); - searchRequest.writeTo(out); - } - writeTimeout(out); - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestBuilder.java deleted file mode 100644 index 39b7a370584..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestBuilder.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.action.admin.indices.warmer.put; - -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchRequestBuilder; -import org.elasticsearch.action.support.master.AcknowledgedRequestBuilder; -import org.elasticsearch.client.ElasticsearchClient; - -/** - * Builder for {@link PutWarmerRequest} - * - * @see PutWarmerRequest for details - */ -public class PutWarmerRequestBuilder extends AcknowledgedRequestBuilder { - - /** - * Creates a new {@link PutWarmerRequestBuilder} with a given name. - */ - public PutWarmerRequestBuilder(ElasticsearchClient client, PutWarmerAction action, String name) { - super(client, action, new PutWarmerRequest().name(name)); - } - - /** - * Creates a new {@link PutWarmerRequestBuilder} - * Note: {@link #setName(String)} must be called with a non-null value before this request is executed. - */ - public PutWarmerRequestBuilder(ElasticsearchClient client, PutWarmerAction action) { - super(client, action, new PutWarmerRequest()); - } - - /** - * Sets the name of the warmer. - */ - public PutWarmerRequestBuilder setName(String name) { - request.name(name); - return this; - } - - /** - * Sets the search request to use to warm the index when applicable. - */ - public PutWarmerRequestBuilder setSearchRequest(SearchRequest searchRequest) { - request.searchRequest(searchRequest); - return this; - } - - /** - * Sets the search request to use to warm the index when applicable. - */ - public PutWarmerRequestBuilder setSearchRequest(SearchRequestBuilder searchRequest) { - request.searchRequest(searchRequest); - return this; - } -} diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerResponse.java deleted file mode 100644 index 008b239920c..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerResponse.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.action.admin.indices.warmer.put; - -import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; - -import java.io.IOException; - -/** - * An acknowledged response of put warmer operation. - */ -public class PutWarmerResponse extends AcknowledgedResponse { - - PutWarmerResponse() { - super(); - } - - PutWarmerResponse(boolean acknowledged) { - super(acknowledged); - } - - @Override - public void readFrom(StreamInput in) throws IOException { - super.readFrom(in); - readAcknowledged(in); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - writeAcknowledged(out); - } -} \ No newline at end of file diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/TransportPutWarmerAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/TransportPutWarmerAction.java deleted file mode 100644 index 8dd671b4da0..00000000000 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/warmer/put/TransportPutWarmerAction.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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.action.admin.indices.warmer.put; - -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.search.TransportSearchAction; -import org.elasticsearch.action.support.ActionFilters; -import org.elasticsearch.action.support.master.TransportMasterNodeAction; -import org.elasticsearch.cluster.AckedClusterStateUpdateTask; -import org.elasticsearch.cluster.ClusterService; -import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.block.ClusterBlockException; -import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.IndexMetaData; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; -import org.elasticsearch.cluster.metadata.MetaData; -import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.IndexNotFoundException; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; -import org.elasticsearch.threadpool.ThreadPool; -import org.elasticsearch.transport.TransportService; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Internal Actions executed on the master associating a warmer with a name in the cluster state metadata. - * - * Note: this is an internal API and should not be used / called by any client code. - */ -public class TransportPutWarmerAction extends TransportMasterNodeAction { - - private final TransportSearchAction searchAction; - - @Inject - public TransportPutWarmerAction(Settings settings, TransportService transportService, ClusterService clusterService, ThreadPool threadPool, - TransportSearchAction searchAction, ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver) { - super(settings, PutWarmerAction.NAME, transportService, clusterService, threadPool, actionFilters, indexNameExpressionResolver, PutWarmerRequest::new); - this.searchAction = searchAction; - } - - @Override - protected String executor() { - return ThreadPool.Names.SAME; - } - - @Override - protected PutWarmerResponse newResponse() { - return new PutWarmerResponse(); - } - - @Override - protected ClusterBlockException checkBlock(PutWarmerRequest request, ClusterState state) { - String[] concreteIndices = indexNameExpressionResolver.concreteIndices(state, request); - ClusterBlockException status = state.blocks().indicesBlockedException(ClusterBlockLevel.METADATA_WRITE, concreteIndices); - if (status != null) { - return status; - } - // PutWarmer executes a SearchQuery before adding the new warmer to the cluster state, - // so we need to check the same block as TransportSearchTypeAction here - return state.blocks().indicesBlockedException(ClusterBlockLevel.READ, concreteIndices); - } - - @Override - protected void masterOperation(final PutWarmerRequest request, final ClusterState state, final ActionListener listener) { - // first execute the search request, see that its ok... - SearchRequest searchRequest = new SearchRequest(request.searchRequest(), request); - searchAction.execute(searchRequest, new ActionListener() { - @Override - public void onResponse(SearchResponse searchResponse) { - if (searchResponse.getFailedShards() > 0) { - listener.onFailure(new ElasticsearchException("search failed with failed shards: " + Arrays.toString(searchResponse.getShardFailures()))); - return; - } - - clusterService.submitStateUpdateTask("put_warmer [" + request.name() + "]", new AckedClusterStateUpdateTask(request, listener) { - - @Override - protected PutWarmerResponse newResponse(boolean acknowledged) { - return new PutWarmerResponse(acknowledged); - } - - @Override - public void onFailure(String source, Throwable t) { - logger.debug("failed to put warmer [{}] on indices [{}]", t, request.name(), request.searchRequest().indices()); - super.onFailure(source, t); - } - - @Override - public ClusterState execute(ClusterState currentState) { - MetaData metaData = currentState.metaData(); - String[] concreteIndices = indexNameExpressionResolver.concreteIndices(currentState, request.searchRequest().indicesOptions(), request.searchRequest().indices()); - - IndexWarmersMetaData.SearchSource source = null; - if (request.searchRequest().source() != null) { - source = new IndexWarmersMetaData.SearchSource(request.searchRequest().source()); - } - - // now replace it on the metadata - MetaData.Builder mdBuilder = MetaData.builder(currentState.metaData()); - - for (String index : concreteIndices) { - IndexMetaData indexMetaData = metaData.index(index); - if (indexMetaData == null) { - throw new IndexNotFoundException(index); - } - IndexWarmersMetaData warmers = indexMetaData.custom(IndexWarmersMetaData.TYPE); - if (warmers == null) { - logger.info("[{}] putting warmer [{}]", index, request.name()); - warmers = new IndexWarmersMetaData(new IndexWarmersMetaData.Entry(request.name(), request.searchRequest().types(), request.searchRequest().requestCache(), source)); - } else { - boolean found = false; - List entries = new ArrayList<>(warmers.entries().size() + 1); - for (IndexWarmersMetaData.Entry entry : warmers.entries()) { - if (entry.name().equals(request.name())) { - found = true; - entries.add(new IndexWarmersMetaData.Entry(request.name(), request.searchRequest().types(), request.searchRequest().requestCache(), source)); - } else { - entries.add(entry); - } - } - if (!found) { - logger.info("[{}] put warmer [{}]", index, request.name()); - entries.add(new IndexWarmersMetaData.Entry(request.name(), request.searchRequest().types(), request.searchRequest().requestCache(), source)); - } else { - logger.info("[{}] update warmer [{}]", index, request.name()); - } - warmers = new IndexWarmersMetaData(entries.toArray(new IndexWarmersMetaData.Entry[entries.size()])); - } - IndexMetaData.Builder indexBuilder = IndexMetaData.builder(indexMetaData).putCustom(IndexWarmersMetaData.TYPE, warmers); - mdBuilder.put(indexBuilder); - } - - return ClusterState.builder(currentState).metaData(mdBuilder).build(); - } - }); - } - - @Override - public void onFailure(Throwable e) { - listener.onFailure(e); - } - }); - } -} diff --git a/core/src/main/java/org/elasticsearch/client/IndicesAdminClient.java b/core/src/main/java/org/elasticsearch/client/IndicesAdminClient.java index 67205fc0a9a..a475ce15d4e 100644 --- a/core/src/main/java/org/elasticsearch/client/IndicesAdminClient.java +++ b/core/src/main/java/org/elasticsearch/client/IndicesAdminClient.java @@ -113,15 +113,6 @@ import org.elasticsearch.action.admin.indices.upgrade.post.UpgradeResponse; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryRequest; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryRequestBuilder; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryResponse; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerRequest; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerRequestBuilder; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerResponse; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersRequest; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersRequestBuilder; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersResponse; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerRequest; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerRequestBuilder; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerResponse; import org.elasticsearch.common.Nullable; /** @@ -771,51 +762,6 @@ public interface IndicesAdminClient extends ElasticsearchClient { */ ValidateQueryRequestBuilder prepareValidateQuery(String... indices); - /** - * Puts an index search warmer to be applies when applicable. - */ - ActionFuture putWarmer(PutWarmerRequest request); - - /** - * Puts an index search warmer to be applies when applicable. - */ - void putWarmer(PutWarmerRequest request, ActionListener listener); - - /** - * Puts an index search warmer to be applies when applicable. - */ - PutWarmerRequestBuilder preparePutWarmer(String name); - - /** - * Deletes an index warmer. - */ - ActionFuture deleteWarmer(DeleteWarmerRequest request); - - /** - * Deletes an index warmer. - */ - void deleteWarmer(DeleteWarmerRequest request, ActionListener listener); - - /** - * Deletes an index warmer. - */ - DeleteWarmerRequestBuilder prepareDeleteWarmer(); - - /** - * Returns a map of index warmers for the given get request. - */ - void getWarmers(GetWarmersRequest request, ActionListener listener); - - /** - * Returns a map of index warmers for the given get request. - */ - ActionFuture getWarmers(GetWarmersRequest request); - - /** - * Returns a new builder to fetch index warmer metadata for the given indices. - */ - GetWarmersRequestBuilder prepareGetWarmers(String... indices); - /** * Executed a per index settings get request and returns the settings for the indices specified. * Note: this is a per index request and will not include settings that are set on the cluster diff --git a/core/src/main/java/org/elasticsearch/client/support/AbstractClient.java b/core/src/main/java/org/elasticsearch/client/support/AbstractClient.java index e085c8da075..e5a465442bb 100644 --- a/core/src/main/java/org/elasticsearch/client/support/AbstractClient.java +++ b/core/src/main/java/org/elasticsearch/client/support/AbstractClient.java @@ -232,18 +232,6 @@ import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryAction import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryRequest; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryRequestBuilder; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryResponse; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerAction; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerRequest; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerRequestBuilder; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerResponse; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersAction; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersRequest; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersRequestBuilder; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersResponse; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerAction; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerRequest; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerRequestBuilder; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerResponse; import org.elasticsearch.action.bulk.BulkAction; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkRequestBuilder; @@ -1669,51 +1657,6 @@ public abstract class AbstractClient extends AbstractComponent implements Client return new ValidateQueryRequestBuilder(this, ValidateQueryAction.INSTANCE).setIndices(indices); } - @Override - public ActionFuture putWarmer(PutWarmerRequest request) { - return execute(PutWarmerAction.INSTANCE, request); - } - - @Override - public void putWarmer(PutWarmerRequest request, ActionListener listener) { - execute(PutWarmerAction.INSTANCE, request, listener); - } - - @Override - public PutWarmerRequestBuilder preparePutWarmer(String name) { - return new PutWarmerRequestBuilder(this, PutWarmerAction.INSTANCE, name); - } - - @Override - public ActionFuture deleteWarmer(DeleteWarmerRequest request) { - return execute(DeleteWarmerAction.INSTANCE, request); - } - - @Override - public void deleteWarmer(DeleteWarmerRequest request, ActionListener listener) { - execute(DeleteWarmerAction.INSTANCE, request, listener); - } - - @Override - public DeleteWarmerRequestBuilder prepareDeleteWarmer() { - return new DeleteWarmerRequestBuilder(this, DeleteWarmerAction.INSTANCE); - } - - @Override - public GetWarmersRequestBuilder prepareGetWarmers(String... indices) { - return new GetWarmersRequestBuilder(this, GetWarmersAction.INSTANCE, indices); - } - - @Override - public ActionFuture getWarmers(GetWarmersRequest request) { - return execute(GetWarmersAction.INSTANCE, request); - } - - @Override - public void getWarmers(GetWarmersRequest request, ActionListener listener) { - execute(GetWarmersAction.INSTANCE, request, listener); - } - @Override public GetSettingsRequestBuilder prepareGetSettings(String... indices) { return new GetSettingsRequestBuilder(this, GetSettingsAction.INSTANCE, indices); diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java index af98d9c2fde..d7b70b8ca8f 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java @@ -46,7 +46,6 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.rest.RestStatus; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -92,11 +91,6 @@ public class IndexMetaData implements Diffable, FromXContentBuild public static Map customPrototypes = new HashMap<>(); - static { - // register non plugin custom metadata - registerPrototype(IndexWarmersMetaData.TYPE, IndexWarmersMetaData.PROTO); - } - /** * Register a custom index meta data factory. Make sure to call it from a static block. */ @@ -904,6 +898,12 @@ public class IndexMetaData implements Diffable, FromXContentBuild builder.putActiveAllocationIds(Integer.valueOf(shardId), allocationIds); } } + } else if ("warmers".equals(currentFieldName)) { + // TODO: do this in 4.0: + // throw new IllegalArgumentException("Warmers are not supported anymore - are you upgrading from 1.x?"); + // ignore: warmers have been removed in 3.0 and are + // simply ignored when upgrading from 2.x + assert Version.CURRENT.major <= 3; } else { // check if its a custom index metadata Custom proto = lookupPrototype(currentFieldName); diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java index d904a3ca3ea..d96e1f17a0b 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java @@ -55,12 +55,10 @@ import org.elasticsearch.index.store.IndexStoreConfig; import org.elasticsearch.indices.recovery.RecoverySettings; import org.elasticsearch.indices.ttl.IndicesTTLService; import org.elasticsearch.rest.RestStatus; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; @@ -71,7 +69,6 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; -import java.util.stream.Collectors; import static java.util.Collections.unmodifiableSet; import static org.elasticsearch.common.settings.Settings.readSettingsFromStream; @@ -365,49 +362,6 @@ public class MetaData implements Iterable, Diffable, Fr return indexMapBuilder.build(); } - public ImmutableOpenMap> findWarmers(String[] concreteIndices, final String[] types, final String[] uncheckedWarmers) { - assert uncheckedWarmers != null; - assert concreteIndices != null; - if (concreteIndices.length == 0) { - return ImmutableOpenMap.of(); - } - // special _all check to behave the same like not specifying anything for the warmers (not for the indices) - final String[] warmers = Strings.isAllOrWildcard(uncheckedWarmers) ? Strings.EMPTY_ARRAY : uncheckedWarmers; - - ImmutableOpenMap.Builder> mapBuilder = ImmutableOpenMap.builder(); - Iterable intersection = HppcMaps.intersection(ObjectHashSet.from(concreteIndices), indices.keys()); - for (String index : intersection) { - IndexMetaData indexMetaData = indices.get(index); - IndexWarmersMetaData indexWarmersMetaData = indexMetaData.custom(IndexWarmersMetaData.TYPE); - if (indexWarmersMetaData == null || indexWarmersMetaData.entries().isEmpty()) { - continue; - } - - // TODO: make this a List so we don't have to copy below - Collection filteredWarmers = - indexWarmersMetaData - .entries() - .stream() - .filter(warmer -> { - if (warmers.length != 0 && types.length != 0) { - return Regex.simpleMatch(warmers, warmer.name()) && Regex.simpleMatch(types, warmer.types()); - } else if (warmers.length != 0) { - return Regex.simpleMatch(warmers, warmer.name()); - } else if (types.length != 0) { - return Regex.simpleMatch(types, warmer.types()); - } else { - return true; - } - }) - .collect(Collectors.toCollection(ArrayList::new)); - - if (!filteredWarmers.isEmpty()) { - mapBuilder.put(index, Collections.unmodifiableList(new ArrayList<>(filteredWarmers))); - } - } - return mapBuilder.build(); - } - /** * Returns all the concrete indices. */ diff --git a/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java b/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java index 12e22a7693b..b3abed6e230 100644 --- a/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java +++ b/core/src/main/java/org/elasticsearch/common/network/NetworkModule.java @@ -88,9 +88,6 @@ import org.elasticsearch.rest.action.admin.indices.template.put.RestPutIndexTemp import org.elasticsearch.rest.action.admin.indices.upgrade.RestUpgradeAction; import org.elasticsearch.rest.action.admin.indices.validate.query.RestValidateQueryAction; import org.elasticsearch.rest.action.admin.indices.validate.template.RestRenderSearchTemplateAction; -import org.elasticsearch.rest.action.admin.indices.warmer.delete.RestDeleteWarmerAction; -import org.elasticsearch.rest.action.admin.indices.warmer.get.RestGetWarmerAction; -import org.elasticsearch.rest.action.admin.indices.warmer.put.RestPutWarmerAction; import org.elasticsearch.rest.action.bulk.RestBulkAction; import org.elasticsearch.rest.action.cat.AbstractCatAction; import org.elasticsearch.rest.action.cat.RestAliasAction; @@ -205,10 +202,6 @@ public class NetworkModule extends AbstractModule { RestDeleteIndexTemplateAction.class, RestHeadIndexTemplateAction.class, - RestPutWarmerAction.class, - RestDeleteWarmerAction.class, - RestGetWarmerAction.class, - RestPutMappingAction.class, RestGetMappingAction.class, RestGetFieldMappingAction.class, diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/get/RestGetIndicesAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/get/RestGetIndicesAction.java index 86336ccf971..b7371f7b80e 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/get/RestGetIndicesAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/get/RestGetIndicesAction.java @@ -40,7 +40,6 @@ import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.RestResponse; import org.elasticsearch.rest.action.support.RestBuilderListener; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import java.io.IOException; import java.util.List; @@ -100,9 +99,6 @@ public class RestGetIndicesAction extends BaseRestHandler { case SETTINGS: writeSettings(response.settings().get(index), builder, request); break; - case WARMERS: - writeWarmers(response.warmers().get(index), builder, request); - break; default: throw new IllegalStateException("feature [" + feature + "] is not valid"); } @@ -142,15 +138,6 @@ public class RestGetIndicesAction extends BaseRestHandler { builder.endObject(); } - private void writeWarmers(List warmers, XContentBuilder builder, Params params) throws IOException { - builder.startObject(Fields.WARMERS); - if (warmers != null) { - for (IndexWarmersMetaData.Entry warmer : warmers) { - IndexWarmersMetaData.toXContent(warmer, builder, params); - } - } - builder.endObject(); - } }); } diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/delete/RestDeleteWarmerAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/delete/RestDeleteWarmerAction.java deleted file mode 100644 index 4fe07564031..00000000000 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/delete/RestDeleteWarmerAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.rest.action.admin.indices.warmer.delete; - -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerRequest; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerResponse; -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.client.Client; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.rest.BaseRestHandler; -import org.elasticsearch.rest.RestChannel; -import org.elasticsearch.rest.RestController; -import org.elasticsearch.rest.RestRequest; -import org.elasticsearch.rest.action.support.AcknowledgedRestListener; - -import static org.elasticsearch.rest.RestRequest.Method.DELETE; - -/** - */ -public class RestDeleteWarmerAction extends BaseRestHandler { - - @Inject - public RestDeleteWarmerAction(Settings settings, RestController controller, Client client) { - super(settings, controller, client); - controller.registerHandler(DELETE, "/{index}/_warmer", this); - controller.registerHandler(DELETE, "/{index}/_warmer/{name}", this); - controller.registerHandler(DELETE, "/{index}/_warmers", this); - controller.registerHandler(DELETE, "/{index}/_warmers/{name}", this); - } - - @Override - public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) { - DeleteWarmerRequest deleteWarmerRequest = new DeleteWarmerRequest(Strings.splitStringByCommaToArray(request.param("name"))) - .indices(Strings.splitStringByCommaToArray(request.param("index"))); - deleteWarmerRequest.timeout(request.paramAsTime("timeout", deleteWarmerRequest.timeout())); - deleteWarmerRequest.masterNodeTimeout(request.paramAsTime("master_timeout", deleteWarmerRequest.masterNodeTimeout())); - deleteWarmerRequest.indicesOptions(IndicesOptions.fromRequest(request, deleteWarmerRequest.indicesOptions())); - client.admin().indices().deleteWarmer(deleteWarmerRequest, new AcknowledgedRestListener(channel)); - } -} diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/get/RestGetWarmerAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/get/RestGetWarmerAction.java deleted file mode 100644 index 26f1186f550..00000000000 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/get/RestGetWarmerAction.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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.rest.action.admin.indices.warmer.get; - -import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersRequest; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersResponse; -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.client.Client; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.rest.BaseRestHandler; -import org.elasticsearch.rest.BytesRestResponse; -import org.elasticsearch.rest.RestChannel; -import org.elasticsearch.rest.RestController; -import org.elasticsearch.rest.RestRequest; -import org.elasticsearch.rest.RestResponse; -import org.elasticsearch.rest.action.support.RestBuilderListener; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; - -import java.util.List; - -import static org.elasticsearch.rest.RestRequest.Method.GET; -import static org.elasticsearch.rest.RestStatus.OK; - -/** - * - */ -public class RestGetWarmerAction extends BaseRestHandler { - - @Inject - public RestGetWarmerAction(Settings settings, RestController controller, Client client) { - super(settings, controller, client); - controller.registerHandler(GET, "/_warmer/{name}", this); - controller.registerHandler(GET, "/{index}/_warmer/{name}", this); - controller.registerHandler(GET, "/{index}/_warmers/{name}", this); - controller.registerHandler(GET, "/{index}/{type}/_warmer/{name}", this); - } - - @Override - public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) { - final String[] indices = Strings.splitStringByCommaToArray(request.param("index")); - final String[] types = Strings.splitStringByCommaToArray(request.param("type")); - final String[] names = request.paramAsStringArray("name", Strings.EMPTY_ARRAY); - - GetWarmersRequest getWarmersRequest = new GetWarmersRequest(); - getWarmersRequest.indices(indices).types(types).warmers(names); - getWarmersRequest.local(request.paramAsBoolean("local", getWarmersRequest.local())); - getWarmersRequest.indicesOptions(IndicesOptions.fromRequest(request, getWarmersRequest.indicesOptions())); - client.admin().indices().getWarmers(getWarmersRequest, new RestBuilderListener(channel) { - - @Override - public RestResponse buildResponse(GetWarmersResponse response, XContentBuilder builder) throws Exception { - if (indices.length > 0 && response.warmers().isEmpty()) { - return new BytesRestResponse(OK, builder.startObject().endObject()); - } - - builder.startObject(); - for (ObjectObjectCursor> entry : response.warmers()) { - builder.startObject(entry.key, XContentBuilder.FieldCaseConversion.NONE); - builder.startObject(IndexWarmersMetaData.TYPE, XContentBuilder.FieldCaseConversion.NONE); - for (IndexWarmersMetaData.Entry warmerEntry : entry.value) { - IndexWarmersMetaData.toXContent(warmerEntry, builder, request); - } - builder.endObject(); - builder.endObject(); - } - builder.endObject(); - - return new BytesRestResponse(OK, builder); - } - }); - } -} diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/put/RestPutWarmerAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/put/RestPutWarmerAction.java deleted file mode 100644 index b47c2542abf..00000000000 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/warmer/put/RestPutWarmerAction.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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.rest.action.admin.indices.warmer.put; - -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerRequest; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.client.Client; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.indices.query.IndicesQueriesRegistry; -import org.elasticsearch.rest.BaseRestHandler; -import org.elasticsearch.rest.RestChannel; -import org.elasticsearch.rest.RestController; -import org.elasticsearch.rest.RestRequest; -import org.elasticsearch.rest.action.support.AcknowledgedRestListener; -import org.elasticsearch.rest.action.support.RestActions; -import org.elasticsearch.search.builder.SearchSourceBuilder; - -import java.io.IOException; - -import static org.elasticsearch.rest.RestRequest.Method.POST; -import static org.elasticsearch.rest.RestRequest.Method.PUT; - -/** - */ -public class RestPutWarmerAction extends BaseRestHandler { - - private final IndicesQueriesRegistry queryRegistry; - - @Inject - public RestPutWarmerAction(Settings settings, RestController controller, Client client, IndicesQueriesRegistry queryRegistry) { - super(settings, controller, client); - this.queryRegistry = queryRegistry; - controller.registerHandler(PUT, "/_warmer/{name}", this); - controller.registerHandler(PUT, "/{index}/_warmer/{name}", this); - controller.registerHandler(PUT, "/{index}/{type}/_warmer/{name}", this); - - controller.registerHandler(PUT, "/_warmers/{name}", this); - controller.registerHandler(PUT, "/{index}/_warmers/{name}", this); - controller.registerHandler(PUT, "/{index}/{type}/_warmers/{name}", this); - - controller.registerHandler(POST, "/_warmer/{name}", this); - controller.registerHandler(POST, "/{index}/_warmer/{name}", this); - controller.registerHandler(POST, "/{index}/{type}/_warmer/{name}", this); - - controller.registerHandler(POST, "/_warmers/{name}", this); - controller.registerHandler(POST, "/{index}/_warmers/{name}", this); - controller.registerHandler(POST, "/{index}/{type}/_warmers/{name}", this); - } - - @Override - public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) throws IOException { - PutWarmerRequest putWarmerRequest = new PutWarmerRequest(request.param("name")); - - BytesReference sourceBytes = RestActions.getRestContent(request); - SearchSourceBuilder source = RestActions.getRestSearchSource(sourceBytes, queryRegistry, parseFieldMatcher); - SearchRequest searchRequest = new SearchRequest(Strings.splitStringByCommaToArray(request.param("index"))) - .types(Strings.splitStringByCommaToArray(request.param("type"))) - .requestCache(request.paramAsBoolean("request_cache", null)).source(source); - searchRequest.indicesOptions(IndicesOptions.fromRequest(request, searchRequest.indicesOptions())); - putWarmerRequest.searchRequest(searchRequest); - putWarmerRequest.timeout(request.paramAsTime("timeout", putWarmerRequest.timeout())); - putWarmerRequest.masterNodeTimeout(request.paramAsTime("master_timeout", putWarmerRequest.masterNodeTimeout())); - client.admin().indices().putWarmer(putWarmerRequest, new AcknowledgedRestListener<>(channel)); - } -} diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java index 02efa373ab0..473282a5777 100644 --- a/core/src/main/java/org/elasticsearch/search/SearchService.java +++ b/core/src/main/java/org/elasticsearch/search/SearchService.java @@ -28,7 +28,6 @@ import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.NumericDocValues; import org.apache.lucene.search.TopDocs; import org.elasticsearch.ExceptionsHelper; -import org.elasticsearch.action.search.SearchType; import org.elasticsearch.cache.recycler.PageCacheRecycler; import org.elasticsearch.cluster.ClusterService; import org.elasticsearch.cluster.metadata.IndexMetaData; @@ -94,7 +93,6 @@ import org.elasticsearch.search.internal.InternalScrollSearchRequest; import org.elasticsearch.search.internal.ScrollContext; import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.SearchContext.Lifetime; -import org.elasticsearch.search.internal.ShardSearchLocalRequest; import org.elasticsearch.search.internal.ShardSearchRequest; import org.elasticsearch.search.profile.Profilers; import org.elasticsearch.search.query.QueryPhase; @@ -102,7 +100,6 @@ import org.elasticsearch.search.query.QuerySearchRequest; import org.elasticsearch.search.query.QuerySearchResult; import org.elasticsearch.search.query.QuerySearchResultProvider; import org.elasticsearch.search.query.ScrollQuerySearchResult; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import org.elasticsearch.threadpool.ThreadPool; import java.io.IOException; @@ -201,7 +198,6 @@ public class SearchService extends AbstractLifecycleComponent imp this.indicesWarmer.addListener(new NormsWarmer(indicesWarmer)); this.indicesWarmer.addListener(new FieldDataWarmer(indicesWarmer)); - this.indicesWarmer.addListener(new SearchWarmer()); defaultSearchTimeout = DEFAULT_SEARCH_TIMEOUT_SETTING.get(settings); clusterSettings.addSettingsUpdateConsumer(DEFAULT_SEARCH_TIMEOUT_SETTING, this::setDefaultSearchTimeout); @@ -1163,76 +1159,6 @@ public class SearchService extends AbstractLifecycleComponent imp } } - class SearchWarmer implements IndicesWarmer.Listener { - - @Override - public TerminationHandle warmNewReaders(IndexShard indexShard, final Engine.Searcher searcher) { - return internalWarm(indexShard, searcher, false); - } - - @Override - public TerminationHandle warmTopReader(IndexShard indexShard, final Engine.Searcher searcher) { - return internalWarm(indexShard, searcher, true); - } - - public TerminationHandle internalWarm(final IndexShard indexShard, final Engine.Searcher searcher, final boolean top) { - IndexWarmersMetaData custom = indexShard.getIndexSettings().getIndexMetaData().custom(IndexWarmersMetaData.TYPE); - if (custom == null) { - return TerminationHandle.NO_WAIT; - } - final Executor executor = indicesWarmer.getExecutor(); - final CountDownLatch latch = new CountDownLatch(custom.entries().size()); - for (final IndexWarmersMetaData.Entry entry : custom.entries()) { - executor.execute(() -> { - SearchContext context = null; - try { - long now = System.nanoTime(); - final IndexService indexService = indicesService.indexServiceSafe(indexShard.shardId().index().name()); - QueryParseContext queryParseContext = new QueryParseContext(indicesService.getIndicesQueryRegistry()); - queryParseContext.parseFieldMatcher(indexService.getIndexSettings().getParseFieldMatcher()); - ShardSearchRequest request = new ShardSearchLocalRequest(indexShard.shardId(), indexShard.getIndexSettings() - .getNumberOfShards(), - SearchType.QUERY_THEN_FETCH, entry.source().build(queryParseContext), entry.types(), entry.requestCache()); - context = createContext(request, searcher); - // if we use sort, we need to do query to sort on - // it and load relevant field data - // if not, we might as well set size=0 (and cache - // if needed) - if (context.sort() == null) { - context.size(0); - } - boolean canCache = indicesQueryCache.canCache(request, context); - // early terminate when we can cache, since we - // can only do proper caching on top level searcher - // also, if we can't cache, and its top, we don't - // need to execute it, since we already did when its - // not top - if (canCache != top) { - return; - } - loadOrExecuteQueryPhase(request, context, queryPhase); - long took = System.nanoTime() - now; - if (indexShard.warmerService().logger().isTraceEnabled()) { - indexShard.warmerService().logger().trace("warmed [{}], took [{}]", entry.name(), TimeValue.timeValueNanos(took)); - } - } catch (Throwable t) { - indexShard.warmerService().logger().warn("warmer [{}] failed", t, entry.name()); - } finally { - try { - if (context != null) { - freeContext(context.id()); - cleanContext(context); - } - } finally { - latch.countDown(); - } - } - }); - } - return () -> latch.await(); - } - } - class Reaper implements Runnable { @Override public void run() { diff --git a/core/src/main/java/org/elasticsearch/search/warmer/IndexWarmerMissingException.java b/core/src/main/java/org/elasticsearch/search/warmer/IndexWarmerMissingException.java deleted file mode 100644 index 1253a24544d..00000000000 --- a/core/src/main/java/org/elasticsearch/search/warmer/IndexWarmerMissingException.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.search.warmer; - -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.rest.RestStatus; - -import java.io.IOException; -import java.util.Arrays; - -/** - * - */ -public class IndexWarmerMissingException extends ElasticsearchException { - - private final String[] names; - - public IndexWarmerMissingException(String... names) { - super("index_warmer " + Arrays.toString(names) + " missing"); - this.names = names; - } - - public String[] names() { - return this.names; - } - - - public IndexWarmerMissingException(StreamInput in) throws IOException{ - super(in); - names = in.readStringArray(); - } - - @Override - public RestStatus status() { - return RestStatus.NOT_FOUND; - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); - out.writeStringArray(names); - } -} diff --git a/core/src/main/java/org/elasticsearch/search/warmer/IndexWarmersMetaData.java b/core/src/main/java/org/elasticsearch/search/warmer/IndexWarmersMetaData.java deleted file mode 100644 index 1ce27f97cff..00000000000 --- a/core/src/main/java/org/elasticsearch/search/warmer/IndexWarmersMetaData.java +++ /dev/null @@ -1,354 +0,0 @@ -/* - * 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.search.warmer; - -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.support.ToXContentToBytes; -import org.elasticsearch.cluster.AbstractDiffable; -import org.elasticsearch.cluster.metadata.IndexMetaData; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.io.stream.Writeable; -import org.elasticsearch.common.xcontent.ToXContent; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.common.xcontent.XContentGenerator; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.index.query.QueryParseContext; -import org.elasticsearch.search.builder.SearchSourceBuilder; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - */ -public class IndexWarmersMetaData extends AbstractDiffable implements IndexMetaData.Custom { - - public static final String TYPE = "warmers"; - - public static final IndexWarmersMetaData PROTO = new IndexWarmersMetaData(); - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - IndexWarmersMetaData that = (IndexWarmersMetaData) o; - - return entries.equals(that.entries); - - } - - @Override - public int hashCode() { - return entries.hashCode(); - } - - public static class Entry { - private final String name; - private final String[] types; - private final SearchSource source; - private final Boolean requestCache; - - public Entry(String name, String[] types, Boolean requestCache, SearchSource source) { - this.name = name; - this.types = types == null ? Strings.EMPTY_ARRAY : types; - this.source = source; - this.requestCache = requestCache; - } - - public String name() { - return this.name; - } - - public String[] types() { - return this.types; - } - - @Nullable - public SearchSource source() { - return this.source; - } - - @Nullable - public Boolean requestCache() { - return this.requestCache; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Entry entry = (Entry) o; - - if (!name.equals(entry.name)) return false; - if (!Arrays.equals(types, entry.types)) return false; - if (!source.equals(entry.source)) return false; - return Objects.equals(requestCache, entry.requestCache); - - } - - @Override - public int hashCode() { - int result = name.hashCode(); - result = 31 * result + Arrays.hashCode(types); - result = 31 * result + source.hashCode(); - result = 31 * result + (requestCache != null ? requestCache.hashCode() : 0); - return result; - } - } - - private final List entries; - - - public IndexWarmersMetaData(Entry... entries) { - this.entries = Arrays.asList(entries); - } - - public List entries() { - return this.entries; - } - - @Override - public String type() { - return TYPE; - } - - @Override - public IndexWarmersMetaData readFrom(StreamInput in) throws IOException { - Entry[] entries = new Entry[in.readVInt()]; - for (int i = 0; i < entries.length; i++) { - String name = in.readString(); - String[] types = in.readStringArray(); - SearchSource source = null; - if (in.readBoolean()) { - source = new SearchSource(in); - } - Boolean queryCache; - queryCache = in.readOptionalBoolean(); - entries[i] = new Entry(name, types, queryCache, source); - } - return new IndexWarmersMetaData(entries); - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - out.writeVInt(entries().size()); - for (Entry entry : entries()) { - out.writeString(entry.name()); - out.writeStringArray(entry.types()); - if (entry.source() == null) { - out.writeBoolean(false); - } else { - out.writeBoolean(true); - entry.source.writeTo(out); - } - out.writeOptionalBoolean(entry.requestCache()); - } - } - - @Override - public IndexWarmersMetaData fromMap(Map map) throws IOException { - // if it starts with the type, remove it - if (map.size() == 1 && map.containsKey(TYPE)) { - map = (Map) map.values().iterator().next(); - } - XContentBuilder builder = XContentFactory.smileBuilder().map(map); - try (XContentParser parser = XContentFactory.xContent(XContentType.SMILE).createParser(builder.bytes())) { - // move to START_OBJECT - parser.nextToken(); - return fromXContent(parser); - } - } - - @Override - public IndexWarmersMetaData fromXContent(XContentParser parser) throws IOException { - // we get here after we are at warmers token - String currentFieldName = null; - XContentParser.Token token; - List entries = new ArrayList<>(); - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (token == XContentParser.Token.START_OBJECT) { - String name = currentFieldName; - List types = new ArrayList<>(2); - SearchSource source = null; - Boolean queryCache = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (token == XContentParser.Token.START_ARRAY) { - if ("types".equals(currentFieldName)) { - while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { - types.add(parser.text()); - } - } - } else if (token == XContentParser.Token.START_OBJECT) { - if ("source".equals(currentFieldName)) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try (XContentGenerator generator = XContentType.JSON.xContent().createGenerator(out)) { - generator.copyCurrentStructure(parser); - } - source = new SearchSource(new BytesArray(out.toByteArray())); - } - } else if (token == XContentParser.Token.VALUE_EMBEDDED_OBJECT) { - if ("source".equals(currentFieldName)) { - source = new SearchSource(new BytesArray(parser.binaryValue())); - } - } else if (token.isValue()) { - if ("requestCache".equals(currentFieldName) || "request_cache".equals(currentFieldName)) { - queryCache = parser.booleanValue(); - } - } - } - entries.add(new Entry(name, types.size() == 0 ? Strings.EMPTY_ARRAY : types.toArray(new String[types.size()]), queryCache, source)); - } - } - return new IndexWarmersMetaData(entries.toArray(new Entry[entries.size()])); - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, ToXContent.Params params) throws IOException { - //No need, IndexMetaData already writes it - //builder.startObject(TYPE, XContentBuilder.FieldCaseConversion.NONE); - for (Entry entry : entries()) { - toXContent(entry, builder, params); - } - //No need, IndexMetaData already writes it - //builder.endObject(); - return builder; - } - - public static void toXContent(Entry entry, XContentBuilder builder, ToXContent.Params params) throws IOException { - builder.startObject(entry.name(), XContentBuilder.FieldCaseConversion.NONE); - builder.field("types", entry.types()); - if (entry.requestCache() != null) { - builder.field("requestCache", entry.requestCache()); - } - builder.field("source", entry.source()); - builder.endObject(); - } - - @Override - public IndexMetaData.Custom mergeWith(IndexMetaData.Custom other) { - IndexWarmersMetaData second = (IndexWarmersMetaData) other; - List entries = new ArrayList<>(); - entries.addAll(entries()); - for (Entry secondEntry : second.entries()) { - boolean found = false; - for (Entry firstEntry : entries()) { - if (firstEntry.name().equals(secondEntry.name())) { - found = true; - break; - } - } - if (!found) { - entries.add(secondEntry); - } - } - return new IndexWarmersMetaData(entries.toArray(new Entry[entries.size()])); - } - - public static class SearchSource extends ToXContentToBytes implements Writeable { - private final BytesReference binary; - private SearchSourceBuilder cached; - - public SearchSource(BytesReference bytesArray) { - if (bytesArray == null) { - throw new IllegalArgumentException("bytesArray must not be null"); - } - this.binary = bytesArray; - } - - public SearchSource(StreamInput input) throws IOException { - this(input.readBytesReference()); - } - - public SearchSource(SearchSourceBuilder source) { - try (XContentBuilder builder = XContentBuilder.builder(XContentType.JSON.xContent())) { - source.toXContent(builder, ToXContent.EMPTY_PARAMS); - binary = builder.bytes(); - } catch (IOException ex) { - throw new ElasticsearchException("failed to generate XContent", ex); - } - } - - public SearchSourceBuilder build(QueryParseContext ctx) throws IOException { - if (cached == null) { - try (XContentParser parser = XContentFactory.xContent(binary).createParser(binary)) { - ctx.reset(parser); - cached = SearchSourceBuilder.parseSearchSource(parser, ctx); - } - } - return cached; - } - - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - if (binary == null) { - cached.toXContent(builder, params); - } else { - try (XContentParser parser = XContentFactory.xContent(binary).createParser(binary)) { - builder.copyCurrentStructure(parser); - } - } - return builder; - } - - @Override - public void writeTo(StreamOutput out) throws IOException { - out.writeBytesReference(binary); - } - - @Override - public SearchSource readFrom(StreamInput in) throws IOException { - return new SearchSource(in); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - SearchSource that = (SearchSource) o; - - return binary.equals(that.binary); - - } - - @Override - public int hashCode() { - return binary.hashCode(); - } - } -} diff --git a/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java b/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java index 975de9e8f0e..db7b5df6662 100644 --- a/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java +++ b/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java @@ -71,7 +71,6 @@ import org.elasticsearch.search.SearchException; import org.elasticsearch.search.SearchParseException; import org.elasticsearch.search.SearchShardTarget; import org.elasticsearch.search.internal.SearchContext; -import org.elasticsearch.search.warmer.IndexWarmerMissingException; import org.elasticsearch.snapshots.SnapshotException; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.TestSearchContext; @@ -494,12 +493,6 @@ public class ExceptionSerializationTests extends ESTestCase { assertEquals("[_na] msg", ex.getMessage()); } - public void testIndexWarmerMissingException() throws IOException { - IndexWarmerMissingException ex = serialize(new IndexWarmerMissingException("w1", "w2")); - assertEquals("index_warmer [w1, w2] missing", ex.getMessage()); - assertArrayEquals(new String[]{"w1", "w2"}, ex.names()); - } - public void testIndexTemplateMissingException() throws IOException { IndexTemplateMissingException ex = serialize(new IndexTemplateMissingException("name")); assertEquals("index_template [name] missing", ex.getMessage()); @@ -735,7 +728,6 @@ public class ExceptionSerializationTests extends ESTestCase { ids.put(90, org.elasticsearch.index.engine.RefreshFailedEngineException.class); ids.put(91, org.elasticsearch.search.aggregations.AggregationInitializationException.class); ids.put(92, org.elasticsearch.indices.recovery.DelayRecoveryException.class); - ids.put(93, org.elasticsearch.search.warmer.IndexWarmerMissingException.class); ids.put(94, org.elasticsearch.client.transport.NoNodeAvailableException.class); ids.put(95, null); ids.put(96, org.elasticsearch.snapshots.InvalidSnapshotNameException.class); diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexIT.java b/core/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexIT.java index e878a3df45c..74416742d12 100644 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexIT.java +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/get/GetIndexIT.java @@ -26,7 +26,6 @@ import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexNotFoundException; -import org.elasticsearch.search.warmer.IndexWarmersMetaData.Entry; import org.elasticsearch.test.ESIntegTestCase; import java.util.ArrayList; @@ -52,7 +51,6 @@ public class GetIndexIT extends ESIntegTestCase { assertAcked(prepareCreate("idx").addAlias(new Alias("alias_idx")).addMapping("type1", "{\"type1\":{}}") .setSettings(Settings.builder().put("number_of_shards", 1)).get()); ensureSearchable("idx"); - assertAcked(client().admin().indices().preparePutWarmer("warmer1").setSearchRequest(client().prepareSearch("idx")).get()); createIndex("empty_idx"); ensureSearchable("idx", "empty_idx"); } @@ -66,7 +64,6 @@ public class GetIndexIT extends ESIntegTestCase { assertAliases(response, "idx"); assertMappings(response, "idx"); assertSettings(response, "idx"); - assertWarmers(response, "idx"); } public void testSimpleUnknownIndex() { @@ -87,7 +84,6 @@ public class GetIndexIT extends ESIntegTestCase { assertEmptyAliases(response); assertEmptyOrOnlyDefaultMappings(response, "empty_idx"); assertNonEmptySettings(response, "empty_idx"); - assertEmptyWarmers(response); } public void testSimpleMapping() { @@ -100,7 +96,6 @@ public class GetIndexIT extends ESIntegTestCase { assertMappings(response, "idx"); assertEmptyAliases(response); assertEmptySettings(response); - assertEmptyWarmers(response); } public void testSimpleAlias() { @@ -113,7 +108,6 @@ public class GetIndexIT extends ESIntegTestCase { assertAliases(response, "idx"); assertEmptyMappings(response); assertEmptySettings(response); - assertEmptyWarmers(response); } public void testSimpleSettings() { @@ -126,20 +120,6 @@ public class GetIndexIT extends ESIntegTestCase { assertSettings(response, "idx"); assertEmptyAliases(response); assertEmptyMappings(response); - assertEmptyWarmers(response); - } - - public void testSimpleWarmer() { - GetIndexResponse response = runWithRandomFeatureMethod(client().admin().indices().prepareGetIndex().addIndices("idx"), - Feature.WARMERS); - String[] indices = response.indices(); - assertThat(indices, notNullValue()); - assertThat(indices.length, equalTo(1)); - assertThat(indices[0], equalTo("idx")); - assertWarmers(response, "idx"); - assertEmptyAliases(response); - assertEmptyMappings(response); - assertEmptySettings(response); } public void testSimpleMixedFeatures() { @@ -169,11 +149,6 @@ public class GetIndexIT extends ESIntegTestCase { } else { assertEmptySettings(response); } - if (features.contains(Feature.WARMERS)) { - assertWarmers(response, "idx"); - } else { - assertEmptyWarmers(response); - } } public void testEmptyMixedFeatures() { @@ -199,7 +174,6 @@ public class GetIndexIT extends ESIntegTestCase { } else { assertEmptySettings(response); } - assertEmptyWarmers(response); } public void testGetIndexWithBlocks() { @@ -235,18 +209,6 @@ public class GetIndexIT extends ESIntegTestCase { } } - private void assertWarmers(GetIndexResponse response, String indexName) { - ImmutableOpenMap> warmers = response.warmers(); - assertThat(warmers, notNullValue()); - assertThat(warmers.size(), equalTo(1)); - List indexWarmers = warmers.get(indexName); - assertThat(indexWarmers, notNullValue()); - assertThat(indexWarmers.size(), equalTo(1)); - Entry warmer = indexWarmers.get(0); - assertThat(warmer, notNullValue()); - assertThat(warmer.name(), equalTo("warmer1")); - } - private void assertSettings(GetIndexResponse response, String indexName) { ImmutableOpenMap settings = response.settings(); assertThat(settings, notNullValue()); @@ -305,11 +267,6 @@ public class GetIndexIT extends ESIntegTestCase { assertThat(alias.alias(), equalTo("alias_idx")); } - private void assertEmptyWarmers(GetIndexResponse response) { - assertThat(response.warmers(), notNullValue()); - assertThat(response.warmers().isEmpty(), equalTo(true)); - } - private void assertEmptySettings(GetIndexResponse response) { assertThat(response.settings(), notNullValue()); assertThat(response.settings().isEmpty(), equalTo(true)); diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestTests.java deleted file mode 100644 index f20564e1712..00000000000 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/warmer/put/PutWarmerRequestTests.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.action.admin.indices.warmer.put; - -import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.test.ESTestCase; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.Matchers.hasSize; - -public class PutWarmerRequestTests extends ESTestCase { - // issue 4196 - public void testThatValidationWithoutSpecifyingSearchRequestFails() { - PutWarmerRequest putWarmerRequest = new PutWarmerRequest("foo"); - ActionRequestValidationException validationException = putWarmerRequest.validate(); - assertThat(validationException.validationErrors(), hasSize(1)); - assertThat(validationException.getMessage(), containsString("search request is missing")); - } -} diff --git a/core/src/test/java/org/elasticsearch/bwcompat/GetIndexBackwardsCompatibilityIT.java b/core/src/test/java/org/elasticsearch/bwcompat/GetIndexBackwardsCompatibilityIT.java index 9a87c888747..9abe6bfbf44 100644 --- a/core/src/test/java/org/elasticsearch/bwcompat/GetIndexBackwardsCompatibilityIT.java +++ b/core/src/test/java/org/elasticsearch/bwcompat/GetIndexBackwardsCompatibilityIT.java @@ -28,7 +28,6 @@ import org.elasticsearch.cluster.metadata.AliasMetaData; import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.search.warmer.IndexWarmersMetaData.Entry; import org.elasticsearch.test.ESBackcompatTestCase; import java.util.List; @@ -88,21 +87,4 @@ public class GetIndexBackwardsCompatibilityIT extends ESBackcompatTestCase { assertThat(settings.get("index.number_of_shards"), equalTo("1")); } - public void testGetWarmers() throws Exception { - createIndex("test"); - ensureSearchable("test"); - assertAcked(client().admin().indices().preparePutWarmer("warmer1").setSearchRequest(client().prepareSearch("test")).get()); - ensureSearchable("test"); - GetIndexResponse getIndexResponse = client().admin().indices().prepareGetIndex().addIndices("test").addFeatures(Feature.WARMERS) - .execute().actionGet(); - ImmutableOpenMap> warmersMap = getIndexResponse.warmers(); - assertThat(warmersMap, notNullValue()); - assertThat(warmersMap.size(), equalTo(1)); - List warmersList = warmersMap.get("test"); - assertThat(warmersList, notNullValue()); - assertThat(warmersList.size(), equalTo(1)); - Entry warmer = warmersList.get(0); - assertThat(warmer, notNullValue()); - assertThat(warmer.name(), equalTo("warmer1")); - } } diff --git a/core/src/test/java/org/elasticsearch/bwcompat/OldIndexBackwardsCompatibilityIT.java b/core/src/test/java/org/elasticsearch/bwcompat/OldIndexBackwardsCompatibilityIT.java index 7011b4092e4..667716937da 100644 --- a/core/src/test/java/org/elasticsearch/bwcompat/OldIndexBackwardsCompatibilityIT.java +++ b/core/src/test/java/org/elasticsearch/bwcompat/OldIndexBackwardsCompatibilityIT.java @@ -32,20 +32,25 @@ import org.elasticsearch.action.admin.indices.upgrade.UpgradeIT; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.cluster.metadata.MetaData; import org.elasticsearch.cluster.routing.allocation.decider.ThrottlingAllocationDecider; import org.elasticsearch.common.io.FileSystemUtils; import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.util.MultiDataPathUpgrader; +import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentHelper; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.env.NodeEnvironment; +import org.elasticsearch.gateway.MetaDataStateFormat; import org.elasticsearch.index.engine.EngineConfig; import org.elasticsearch.index.engine.Segment; import org.elasticsearch.index.mapper.string.StringFieldMapperPositionIncrementGapTests; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.shard.MergePolicyConfig; -import org.elasticsearch.indices.recovery.RecoverySettings; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; @@ -423,4 +428,62 @@ public class OldIndexBackwardsCompatibilityIT extends ESIntegTestCase { UpgradeIT.assertUpgraded(client(), indexName); } + private Path getNodeDir(String indexFile) throws IOException { + Path unzipDir = createTempDir(); + Path unzipDataDir = unzipDir.resolve("data"); + + // decompress the index + Path backwardsIndex = getBwcIndicesPath().resolve(indexFile); + try (InputStream stream = Files.newInputStream(backwardsIndex)) { + TestUtil.unzip(stream, unzipDir); + } + + // check it is unique + assertTrue(Files.exists(unzipDataDir)); + Path[] list = FileSystemUtils.files(unzipDataDir); + if (list.length != 1) { + throw new IllegalStateException("Backwards index must contain exactly one cluster"); + } + + // the bwc scripts packs the indices under this path + return list[0].resolve("nodes/0/"); + } + + public void testOldClusterStates() throws Exception { + // dangling indices do not load the global state, only the per-index states + // so we make sure we can read them separately + MetaDataStateFormat globalFormat = new MetaDataStateFormat(XContentType.JSON, "global-") { + + @Override + public void toXContent(XContentBuilder builder, MetaData state) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public MetaData fromXContent(XContentParser parser) throws IOException { + return MetaData.Builder.fromXContent(parser); + } + }; + MetaDataStateFormat indexFormat = new MetaDataStateFormat(XContentType.JSON, "state-") { + + @Override + public void toXContent(XContentBuilder builder, IndexMetaData state) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public IndexMetaData fromXContent(XContentParser parser) throws IOException { + return IndexMetaData.Builder.fromXContent(parser); + } + }; + Collections.shuffle(indexes, random()); + for (String indexFile : indexes) { + String indexName = indexFile.replace(".zip", "").toLowerCase(Locale.ROOT).replace("unsupported-", "index-"); + Path nodeDir = getNodeDir(indexFile); + logger.info("Parsing cluster state files from index [" + indexName + "]"); + assertNotNull(globalFormat.loadLatestState(logger, nodeDir)); // no exception + Path indexDir = nodeDir.resolve("indices").resolve(indexName); + assertNotNull(indexFormat.loadLatestState(logger, indexDir)); // no exception + } + } } diff --git a/core/src/test/java/org/elasticsearch/cluster/ClusterStateDiffIT.java b/core/src/test/java/org/elasticsearch/cluster/ClusterStateDiffIT.java index faa0f15d8f2..8b79b78397b 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ClusterStateDiffIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ClusterStateDiffIT.java @@ -39,7 +39,6 @@ import org.elasticsearch.cluster.routing.ShardRoutingState; import org.elasticsearch.cluster.routing.TestShardRouting; import org.elasticsearch.cluster.routing.UnassignedInfo; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; @@ -49,7 +48,6 @@ import org.elasticsearch.discovery.DiscoverySettings; import org.elasticsearch.gateway.GatewayService; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.shard.ShardId; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import org.elasticsearch.test.ESIntegTestCase; import java.util.Collections; @@ -492,9 +490,6 @@ public class ClusterStateDiffIT extends ESIntegTestCase { builder.settings(settingsBuilder); builder.numberOfShards(randomIntBetween(1, 10)).numberOfReplicas(randomInt(10)); int aliasCount = randomInt(10); - if (randomBoolean()) { - builder.putCustom(IndexWarmersMetaData.TYPE, randomWarmers()); - } for (int i = 0; i < aliasCount; i++) { builder.putAlias(randomAlias()); } @@ -504,7 +499,7 @@ public class ClusterStateDiffIT extends ESIntegTestCase { @Override public IndexMetaData randomChange(IndexMetaData part) { IndexMetaData.Builder builder = IndexMetaData.builder(part); - switch (randomIntBetween(0, 3)) { + switch (randomIntBetween(0, 2)) { case 0: builder.settings(Settings.builder().put(part.getSettings()).put(randomSettings(Settings.EMPTY))); break; @@ -518,9 +513,6 @@ public class ClusterStateDiffIT extends ESIntegTestCase { case 2: builder.settings(Settings.builder().put(part.getSettings()).put(IndexMetaData.SETTING_INDEX_UUID, Strings.randomBase64UUID())); break; - case 3: - builder.putCustom(IndexWarmersMetaData.TYPE, randomWarmers()); - break; default: throw new IllegalArgumentException("Shouldn't be here"); } @@ -529,23 +521,6 @@ public class ClusterStateDiffIT extends ESIntegTestCase { }); } - /** - * Generates a random warmer - */ - private IndexWarmersMetaData randomWarmers() { - if (randomBoolean()) { - return new IndexWarmersMetaData( - new IndexWarmersMetaData.Entry( - randomName("warm"), - new String[]{randomName("type")}, - randomBoolean(), - new IndexWarmersMetaData.SearchSource(new BytesArray(randomAsciiOfLength(1000)))) - ); - } else { - return new IndexWarmersMetaData(); - } - } - /** * Randomly adds, deletes or updates index templates in the metadata */ @@ -576,9 +551,6 @@ public class ClusterStateDiffIT extends ESIntegTestCase { for (int i = 0; i < aliasCount; i++) { builder.putAlias(randomAlias()); } - if (randomBoolean()) { - builder.putCustom(IndexWarmersMetaData.TYPE, randomWarmers()); - } return builder.build(); } diff --git a/core/src/test/java/org/elasticsearch/cluster/ack/AckIT.java b/core/src/test/java/org/elasticsearch/cluster/ack/AckIT.java index 13a5cae6ca3..9f646d0df58 100644 --- a/core/src/test/java/org/elasticsearch/cluster/ack/AckIT.java +++ b/core/src/test/java/org/elasticsearch/cluster/ack/AckIT.java @@ -19,7 +19,6 @@ package org.elasticsearch.cluster.ack; -import com.carrotsearch.hppc.cursors.ObjectObjectCursor; import org.elasticsearch.action.admin.cluster.reroute.ClusterRerouteResponse; import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse; @@ -27,9 +26,6 @@ import org.elasticsearch.action.admin.indices.close.CloseIndexResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsResponse; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerResponse; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersResponse; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerResponse; import org.elasticsearch.client.Client; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.AliasMetaData; @@ -42,12 +38,9 @@ import org.elasticsearch.cluster.routing.ShardRoutingState; import org.elasticsearch.cluster.routing.allocation.command.MoveAllocationCommand; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.discovery.DiscoverySettings; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.ESIntegTestCase.ClusterScope; -import java.util.List; import java.util.concurrent.TimeUnit; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; @@ -88,83 +81,6 @@ public class AckIT extends ESIntegTestCase { assertThat(updateSettingsResponse.isAcknowledged(), equalTo(false)); } - public void testPutWarmerAcknowledgement() { - createIndex("test"); - // make sure one shard is started so the search during put warmer will not fail - index("test", "type", "1", "f", 1); - - assertAcked(client().admin().indices().preparePutWarmer("custom_warmer") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery()))); - - for (Client client : clients()) { - GetWarmersResponse getWarmersResponse = client.admin().indices().prepareGetWarmers().setLocal(true).get(); - assertThat(getWarmersResponse.warmers().size(), equalTo(1)); - ObjectObjectCursor> entry = getWarmersResponse.warmers().iterator().next(); - assertThat(entry.key, equalTo("test")); - assertThat(entry.value.size(), equalTo(1)); - assertThat(entry.value.get(0).name(), equalTo("custom_warmer")); - } - } - - public void testPutWarmerNoAcknowledgement() throws InterruptedException { - createIndex("test"); - // make sure one shard is started so the search during put warmer will not fail - index("test", "type", "1", "f", 1); - - PutWarmerResponse putWarmerResponse = client().admin().indices().preparePutWarmer("custom_warmer").setTimeout("0s") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery())) - .get(); - assertThat(putWarmerResponse.isAcknowledged(), equalTo(false)); - /* Since we don't wait for the ack here we have to wait until the search request has been executed from the master - * otherwise the test infra might have already deleted the index and the search request fails on all shards causing - * the test to fail too. We simply wait until the the warmer has been installed and also clean it up afterwards.*/ - assertTrue(awaitBusy(() -> { - for (Client client : clients()) { - GetWarmersResponse getWarmersResponse = client.admin().indices().prepareGetWarmers().setLocal(true).get(); - if (getWarmersResponse.warmers().size() != 1) { - return false; - } - } - return true; - })); - assertAcked(client().admin().indices().prepareDeleteWarmer().setIndices("test").setNames("custom_warmer")); - } - - public void testDeleteWarmerAcknowledgement() { - createIndex("test"); - index("test", "type", "1", "f", 1); - - assertAcked(client().admin().indices().preparePutWarmer("custom_warmer") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery()))); - - assertAcked(client().admin().indices().prepareDeleteWarmer().setIndices("test").setNames("custom_warmer")); - - for (Client client : clients()) { - GetWarmersResponse getWarmersResponse = client.admin().indices().prepareGetWarmers().setLocal(true).get(); - assertThat(getWarmersResponse.warmers().size(), equalTo(0)); - } - } - - public void testDeleteWarmerNoAcknowledgement() throws InterruptedException { - createIndex("test"); - index("test", "type", "1", "f", 1); - - assertAcked(client().admin().indices().preparePutWarmer("custom_warmer") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery()))); - - DeleteWarmerResponse deleteWarmerResponse = client().admin().indices().prepareDeleteWarmer().setIndices("test").setNames("custom_warmer").setTimeout("0s").get(); - assertFalse(deleteWarmerResponse.isAcknowledged()); - assertTrue(awaitBusy(() -> { - for (Client client : clients()) { - GetWarmersResponse getWarmersResponse = client.admin().indices().prepareGetWarmers().setLocal(true).get(); - if (getWarmersResponse.warmers().size() > 0) { - return false; - } - } - return true; - })); - } - public void testClusterRerouteAcknowledgement() throws InterruptedException { assertAcked(prepareCreate("test").setSettings(Settings.builder() .put(indexSettings()) diff --git a/core/src/test/java/org/elasticsearch/indices/IndicesOptionsIntegrationIT.java b/core/src/test/java/org/elasticsearch/indices/IndicesOptionsIntegrationIT.java index 2723f49a77a..aeb4ac55410 100644 --- a/core/src/test/java/org/elasticsearch/indices/IndicesOptionsIntegrationIT.java +++ b/core/src/test/java/org/elasticsearch/indices/IndicesOptionsIntegrationIT.java @@ -36,7 +36,6 @@ import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequestBui import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse; import org.elasticsearch.action.admin.indices.stats.IndicesStatsRequestBuilder; import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryRequestBuilder; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersRequestBuilder; import org.elasticsearch.action.percolate.MultiPercolateRequestBuilder; import org.elasticsearch.action.percolate.PercolateRequestBuilder; import org.elasticsearch.action.percolate.PercolateSourceBuilder; @@ -49,10 +48,7 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexNotFoundException; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.suggest.SuggestBuilders; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; import org.elasticsearch.test.ESIntegTestCase; import static org.elasticsearch.action.percolate.PercolateSourceBuilder.docBuilder; @@ -86,7 +82,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1", "test2"), true); verify(getFieldMapping("test1", "test2"), true); verify(getMapping("test1", "test2"), true); - verify(getWarmer("test1", "test2"), true); verify(getSettings("test1", "test2"), true); IndicesOptions options = IndicesOptions.strictExpandOpen(); @@ -107,7 +102,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1", "test2").setIndicesOptions(options), true); verify(getFieldMapping("test1", "test2").setIndicesOptions(options), true); verify(getMapping("test1", "test2").setIndicesOptions(options), true); - verify(getWarmer("test1", "test2").setIndicesOptions(options), true); verify(getSettings("test1", "test2").setIndicesOptions(options), true); options = IndicesOptions.lenientExpandOpen(); @@ -128,7 +122,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1", "test2").setIndicesOptions(options), false); verify(getFieldMapping("test1", "test2").setIndicesOptions(options), false); verify(getMapping("test1", "test2").setIndicesOptions(options), false); - verify(getWarmer("test1", "test2").setIndicesOptions(options), false); verify(getSettings("test1", "test2").setIndicesOptions(options), false); options = IndicesOptions.strictExpandOpen(); @@ -151,7 +144,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1", "test2").setIndicesOptions(options), false); verify(getFieldMapping("test1", "test2").setIndicesOptions(options), false); verify(getMapping("test1", "test2").setIndicesOptions(options), false); - verify(getWarmer("test1", "test2").setIndicesOptions(options), false); verify(getSettings("test1", "test2").setIndicesOptions(options), false); } @@ -182,7 +174,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1").setIndicesOptions(options), true); verify(getFieldMapping("test1").setIndicesOptions(options), true); verify(getMapping("test1").setIndicesOptions(options), true); - verify(getWarmer("test1").setIndicesOptions(options), true); verify(getSettings("test1").setIndicesOptions(options), true); options = IndicesOptions.fromOptions(true, options.allowNoIndices(), options.expandWildcardsOpen(), options.expandWildcardsClosed(), options); @@ -203,7 +194,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1").setIndicesOptions(options), false); verify(getFieldMapping("test1").setIndicesOptions(options), false); verify(getMapping("test1").setIndicesOptions(options), false); - verify(getWarmer("test1").setIndicesOptions(options), false); verify(getSettings("test1").setIndicesOptions(options), false); assertAcked(client().admin().indices().prepareOpen("test1")); @@ -227,7 +217,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1").setIndicesOptions(options), false); verify(getFieldMapping("test1").setIndicesOptions(options), false); verify(getMapping("test1").setIndicesOptions(options), false); - verify(getWarmer("test1").setIndicesOptions(options), false); verify(getSettings("test1").setIndicesOptions(options), false); } @@ -249,7 +238,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1").setIndicesOptions(options), true); verify(getFieldMapping("test1").setIndicesOptions(options), true); verify(getMapping("test1").setIndicesOptions(options), true); - verify(getWarmer("test1").setIndicesOptions(options), true); verify(getSettings("test1").setIndicesOptions(options), true); options = IndicesOptions.fromOptions(true, options.allowNoIndices(), options.expandWildcardsOpen(), options.expandWildcardsClosed(), options); @@ -269,7 +257,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1").setIndicesOptions(options), false); verify(getFieldMapping("test1").setIndicesOptions(options), false); verify(getMapping("test1").setIndicesOptions(options), false); - verify(getWarmer("test1").setIndicesOptions(options), false); verify(getSettings("test1").setIndicesOptions(options), false); assertAcked(prepareCreate("test1")); @@ -292,7 +279,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases("test1").setIndicesOptions(options), false); verify(getFieldMapping("test1").setIndicesOptions(options), false); verify(getMapping("test1").setIndicesOptions(options), false); - verify(getWarmer("test1").setIndicesOptions(options), false); verify(getSettings("test1").setIndicesOptions(options), false); } @@ -346,7 +332,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases(indices), false); verify(getFieldMapping(indices), false); verify(getMapping(indices), false); - verify(getWarmer(indices), false); verify(getSettings(indices), false); // Now force allow_no_indices=true @@ -368,7 +353,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases(indices).setIndicesOptions(options), false); verify(getFieldMapping(indices).setIndicesOptions(options), false); verify(getMapping(indices).setIndicesOptions(options), false); - verify(getWarmer(indices).setIndicesOptions(options), false); verify(getSettings(indices).setIndicesOptions(options), false); assertAcked(prepareCreate("foobar")); @@ -393,7 +377,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases(indices), false); verify(getFieldMapping(indices), false); verify(getMapping(indices), false); - verify(getWarmer(indices), false); verify(getSettings(indices).setIndicesOptions(options), false); // Verify defaults for wildcards, with two wildcard expression and one existing index @@ -415,7 +398,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases(indices), false); verify(getFieldMapping(indices), false); verify(getMapping(indices), false); - verify(getWarmer(indices), false); verify(getSettings(indices).setIndicesOptions(options), false); // Now force allow_no_indices=true @@ -437,7 +419,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { verify(getAliases(indices).setIndicesOptions(options), false); verify(getFieldMapping(indices).setIndicesOptions(options), false); verify(getMapping(indices).setIndicesOptions(options), false); - verify(getWarmer(indices).setIndicesOptions(options), false); verify(getSettings(indices).setIndicesOptions(options), false); } @@ -581,34 +562,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { assertThat(client().admin().indices().prepareExists("barbaz").get().isExists(), equalTo(false)); } - public void testPutWarmer() throws Exception { - createIndex("foobar"); - ensureYellow(); - verify(client().admin().indices().preparePutWarmer("warmer1").setSearchRequest(client().prepareSearch().setIndices("foobar").setQuery(QueryBuilders.matchAllQuery())), false); - assertThat(client().admin().indices().prepareGetWarmers("foobar").setWarmers("warmer1").get().getWarmers().size(), equalTo(1)); - - } - - public void testPutWarmerWildcard() throws Exception { - createIndex("foo", "foobar", "bar", "barbaz"); - ensureYellow(); - - verify(client().admin().indices().preparePutWarmer("warmer1").setSearchRequest(client().prepareSearch().setIndices("foo*").setQuery(QueryBuilders.matchAllQuery())), false); - - assertThat(client().admin().indices().prepareGetWarmers("foo").setWarmers("warmer1").get().getWarmers().size(), equalTo(1)); - assertThat(client().admin().indices().prepareGetWarmers("foobar").setWarmers("warmer1").get().getWarmers().size(), equalTo(1)); - assertThat(client().admin().indices().prepareGetWarmers("bar").setWarmers("warmer1").get().getWarmers().size(), equalTo(0)); - assertThat(client().admin().indices().prepareGetWarmers("barbaz").setWarmers("warmer1").get().getWarmers().size(), equalTo(0)); - - verify(client().admin().indices().preparePutWarmer("warmer2").setSearchRequest(client().prepareSearch().setIndices().setQuery(QueryBuilders.matchAllQuery())), false); - - assertThat(client().admin().indices().prepareGetWarmers("foo").setWarmers("warmer2").get().getWarmers().size(), equalTo(1)); - assertThat(client().admin().indices().prepareGetWarmers("foobar").setWarmers("warmer2").get().getWarmers().size(), equalTo(1)); - assertThat(client().admin().indices().prepareGetWarmers("bar").setWarmers("warmer2").get().getWarmers().size(), equalTo(1)); - assertThat(client().admin().indices().prepareGetWarmers("barbaz").setWarmers("warmer2").get().getWarmers().size(), equalTo(1)); - - } - public void testPutAlias() throws Exception { createIndex("foobar"); ensureYellow(); @@ -635,46 +588,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { } - public void testDeleteWarmer() throws Exception { - SearchSourceBuilder source = new SearchSourceBuilder(); - source.query(QueryBuilders.matchAllQuery()); - IndexWarmersMetaData.Entry entry = new IndexWarmersMetaData.Entry("test1", new String[] { "typ1" }, false, new IndexWarmersMetaData.SearchSource(source)); - assertAcked(prepareCreate("foobar").addCustom(new IndexWarmersMetaData(entry))); - ensureYellow(); - - verify(client().admin().indices().prepareDeleteWarmer().setIndices("foo").setNames("test1"), true); - assertThat(client().admin().indices().prepareGetWarmers("foobar").setWarmers("test1").get().getWarmers().size(), equalTo(1)); - verify(client().admin().indices().prepareDeleteWarmer().setIndices("foobar").setNames("test1"), false); - assertThat(client().admin().indices().prepareGetWarmers("foobar").setWarmers("test1").get().getWarmers().size(), equalTo(0)); - } - - public void testDeleteWarmerWildcard() throws Exception { - verify(client().admin().indices().prepareDeleteWarmer().setIndices("_all").setNames("test1"), true); - - SearchSourceBuilder source = new SearchSourceBuilder(); - source.query(QueryBuilders.matchAllQuery()); - IndexWarmersMetaData.Entry entry = new IndexWarmersMetaData.Entry("test1", new String[] { "type1" }, false, new IndexWarmersMetaData.SearchSource(source)); - assertAcked(prepareCreate("foo").addCustom(new IndexWarmersMetaData(entry))); - assertAcked(prepareCreate("foobar").addCustom(new IndexWarmersMetaData(entry))); - assertAcked(prepareCreate("bar").addCustom(new IndexWarmersMetaData(entry))); - assertAcked(prepareCreate("barbaz").addCustom(new IndexWarmersMetaData(entry))); - ensureYellow(); - - verify(client().admin().indices().prepareDeleteWarmer().setIndices("foo*").setNames("test1"), false); - assertThat(client().admin().indices().prepareGetWarmers("foo").setWarmers("test1").get().getWarmers().size(), equalTo(0)); - assertThat(client().admin().indices().prepareGetWarmers("foobar").setWarmers("test1").get().getWarmers().size(), equalTo(0)); - assertThat(client().admin().indices().prepareGetWarmers("bar").setWarmers("test1").get().getWarmers().size(), equalTo(1)); - assertThat(client().admin().indices().prepareGetWarmers("barbaz").setWarmers("test1").get().getWarmers().size(), equalTo(1)); - - assertAcked(client().admin().indices().prepareDelete("foo*")); - - verify(client().admin().indices().prepareDeleteWarmer().setIndices("foo*").setNames("test1"), true); - - verify(client().admin().indices().prepareDeleteWarmer().setIndices("_all").setNames("test1"), false); - assertThat(client().admin().indices().prepareGetWarmers("bar").setWarmers("test1").get().getWarmers().size(), equalTo(0)); - assertThat(client().admin().indices().prepareGetWarmers("barbaz").setWarmers("test1").get().getWarmers().size(), equalTo(0)); - } - public void testPutMapping() throws Exception { verify(client().admin().indices().preparePutMapping("foo").setType("type1").setSource("field", "type=string"), true); verify(client().admin().indices().preparePutMapping("_all").setType("type1").setSource("field", "type=string"), true); @@ -816,10 +729,6 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase { return client().admin().indices().prepareGetMappings(indices); } - private static GetWarmersRequestBuilder getWarmer(String... indices) { - return client().admin().indices().prepareGetWarmers(indices); - } - private static GetSettingsRequestBuilder getSettings(String... indices) { return client().admin().indices().prepareGetSettings(indices); } diff --git a/core/src/test/java/org/elasticsearch/indices/warmer/GatewayIndicesWarmerIT.java b/core/src/test/java/org/elasticsearch/indices/warmer/GatewayIndicesWarmerIT.java deleted file mode 100644 index 7c5a154ebcb..00000000000 --- a/core/src/test/java/org/elasticsearch/indices/warmer/GatewayIndicesWarmerIT.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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.indices.warmer; - -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerResponse; -import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.common.logging.ESLogger; -import org.elasticsearch.common.logging.Loggers; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; -import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.ESIntegTestCase.ClusterScope; -import org.elasticsearch.test.ESIntegTestCase.Scope; -import org.elasticsearch.test.InternalTestCluster.RestartCallback; -import org.hamcrest.Matchers; - -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; -import static org.hamcrest.Matchers.equalTo; - -/** - */ -@ClusterScope(numDataNodes =0, scope= Scope.TEST) -public class GatewayIndicesWarmerIT extends ESIntegTestCase { - private final ESLogger logger = Loggers.getLogger(GatewayIndicesWarmerIT.class); - - public void testStatePersistence() throws Exception { - logger.info("--> starting 1 nodes"); - internalCluster().startNode(); - - logger.info("--> putting two templates"); - createIndex("test"); - - ensureYellow(); - - assertAcked(client().admin().indices().preparePutWarmer("warmer_1") - .setSearchRequest(client().prepareSearch("test").setQuery(QueryBuilders.termQuery("field", "value1")))); - assertAcked(client().admin().indices().preparePutWarmer("warmer_2") - .setSearchRequest(client().prepareSearch("test").setQuery(QueryBuilders.termQuery("field", "value2")))); - - logger.info("--> put template with warmer"); - client().admin().indices().preparePutTemplate("template_1") - .setSource("{\n" + - " \"template\" : \"xxx\",\n" + - " \"warmers\" : {\n" + - " \"warmer_1\" : {\n" + - " \"types\" : [],\n" + - " \"source\" : {\n" + - " \"query\" : {\n" + - " \"match_all\" : {}\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}") - .execute().actionGet(); - - - logger.info("--> verify warmers are registered in cluster state"); - ClusterState clusterState = client().admin().cluster().prepareState().execute().actionGet().getState(); - IndexWarmersMetaData warmersMetaData = clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE); - assertThat(warmersMetaData, Matchers.notNullValue()); - assertThat(warmersMetaData.entries().size(), equalTo(2)); - - IndexWarmersMetaData templateWarmers = clusterState.metaData().templates().get("template_1").custom(IndexWarmersMetaData.TYPE); - assertThat(templateWarmers, Matchers.notNullValue()); - assertThat(templateWarmers.entries().size(), equalTo(1)); - - logger.info("--> restarting the node"); - internalCluster().fullRestart(new RestartCallback() { - @Override - public Settings onNodeStopped(String nodeName) throws Exception { - return Settings.EMPTY; - } - }); - - ensureYellow(); - - logger.info("--> verify warmers are recovered"); - clusterState = client().admin().cluster().prepareState().execute().actionGet().getState(); - IndexWarmersMetaData recoveredWarmersMetaData = clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE); - assertThat(recoveredWarmersMetaData.entries().size(), equalTo(warmersMetaData.entries().size())); - for (int i = 0; i < warmersMetaData.entries().size(); i++) { - assertThat(recoveredWarmersMetaData.entries().get(i).name(), equalTo(warmersMetaData.entries().get(i).name())); - assertThat(recoveredWarmersMetaData.entries().get(i).source(), equalTo(warmersMetaData.entries().get(i).source())); - } - - logger.info("--> verify warmers in template are recovered"); - IndexWarmersMetaData recoveredTemplateWarmers = clusterState.metaData().templates().get("template_1").custom(IndexWarmersMetaData.TYPE); - assertThat(recoveredTemplateWarmers.entries().size(), equalTo(templateWarmers.entries().size())); - for (int i = 0; i < templateWarmers.entries().size(); i++) { - assertThat(recoveredTemplateWarmers.entries().get(i).name(), equalTo(templateWarmers.entries().get(i).name())); - assertThat(recoveredTemplateWarmers.entries().get(i).source(), equalTo(templateWarmers.entries().get(i).source())); - } - - - logger.info("--> delete warmer warmer_1"); - DeleteWarmerResponse deleteWarmerResponse = client().admin().indices().prepareDeleteWarmer().setIndices("test").setNames("warmer_1").execute().actionGet(); - assertThat(deleteWarmerResponse.isAcknowledged(), equalTo(true)); - - logger.info("--> verify warmers (delete) are registered in cluster state"); - clusterState = client().admin().cluster().prepareState().execute().actionGet().getState(); - warmersMetaData = clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE); - assertThat(warmersMetaData, Matchers.notNullValue()); - assertThat(warmersMetaData.entries().size(), equalTo(1)); - - logger.info("--> restarting the node"); - internalCluster().fullRestart(new RestartCallback() { - @Override - public Settings onNodeStopped(String nodeName) throws Exception { - return Settings.EMPTY; - } - }); - - ensureYellow(); - - logger.info("--> verify warmers are recovered"); - clusterState = client().admin().cluster().prepareState().execute().actionGet().getState(); - recoveredWarmersMetaData = clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE); - assertThat(recoveredWarmersMetaData.entries().size(), equalTo(warmersMetaData.entries().size())); - for (int i = 0; i < warmersMetaData.entries().size(); i++) { - assertThat(recoveredWarmersMetaData.entries().get(i).name(), equalTo(warmersMetaData.entries().get(i).name())); - assertThat(recoveredWarmersMetaData.entries().get(i).source(), equalTo(warmersMetaData.entries().get(i).source())); - } - } -} diff --git a/core/src/test/java/org/elasticsearch/indices/warmer/IndicesWarmerBlocksIT.java b/core/src/test/java/org/elasticsearch/indices/warmer/IndicesWarmerBlocksIT.java deleted file mode 100644 index 5ca4a99ac1a..00000000000 --- a/core/src/test/java/org/elasticsearch/indices/warmer/IndicesWarmerBlocksIT.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * 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.indices.warmer; - - -import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersResponse; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; -import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.ESIntegTestCase.ClusterScope; - -import java.util.Arrays; -import java.util.List; - -import static org.elasticsearch.cluster.metadata.IndexMetaData.INDEX_METADATA_BLOCK; -import static org.elasticsearch.cluster.metadata.IndexMetaData.INDEX_READ_BLOCK; -import static org.elasticsearch.cluster.metadata.IndexMetaData.INDEX_READ_ONLY_BLOCK; -import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_BLOCKS_METADATA; -import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_BLOCKS_READ; -import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_BLOCKS_WRITE; -import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_READ_ONLY; -import static org.elasticsearch.cluster.metadata.MetaData.CLUSTER_READ_ONLY_BLOCK; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertBlocked; -import static org.hamcrest.Matchers.equalTo; - -@ClusterScope(scope = ESIntegTestCase.Scope.TEST) -public class IndicesWarmerBlocksIT extends ESIntegTestCase { - public void testPutWarmerWithBlocks() { - createIndex("test-blocks"); - ensureGreen("test-blocks"); - - // Index reads are blocked, the warmer can't be registered - try { - enableIndexBlock("test-blocks", SETTING_BLOCKS_READ); - assertBlocked(client().admin().indices().preparePutWarmer("warmer_blocked") - .setSearchRequest(client().prepareSearch("test-*").setTypes("a1").setQuery(QueryBuilders.matchAllQuery())), INDEX_READ_BLOCK); - } finally { - disableIndexBlock("test-blocks", SETTING_BLOCKS_READ); - } - - // Index writes are blocked, the warmer can be registered - try { - enableIndexBlock("test-blocks", SETTING_BLOCKS_WRITE); - assertAcked(client().admin().indices().preparePutWarmer("warmer_acked") - .setSearchRequest(client().prepareSearch("test-blocks").setTypes("a1").setQuery(QueryBuilders.matchAllQuery()))); - } finally { - disableIndexBlock("test-blocks", SETTING_BLOCKS_WRITE); - } - - // Index metadata changes are blocked, the warmer can't be registered - try { - enableIndexBlock("test-blocks", SETTING_BLOCKS_METADATA); - assertBlocked(client().admin().indices().preparePutWarmer("warmer_blocked") - .setSearchRequest(client().prepareSearch("test-*").setTypes("a1").setQuery(QueryBuilders.matchAllQuery())), INDEX_METADATA_BLOCK); - } finally { - disableIndexBlock("test-blocks", SETTING_BLOCKS_METADATA); - } - - // Index metadata changes are blocked, the warmer can't be registered - try { - enableIndexBlock("test-blocks", SETTING_READ_ONLY); - assertBlocked(client().admin().indices().preparePutWarmer("warmer_blocked") - .setSearchRequest(client().prepareSearch("test-*").setTypes("a1").setQuery(QueryBuilders.matchAllQuery())), INDEX_READ_ONLY_BLOCK); - } finally { - disableIndexBlock("test-blocks", SETTING_READ_ONLY); - } - - // Adding a new warmer is not possible when the cluster is read-only - try { - setClusterReadOnly(true); - assertBlocked(client().admin().indices().preparePutWarmer("warmer_blocked") - .setSearchRequest(client().prepareSearch("test-blocks").setTypes("a1").setQuery(QueryBuilders.matchAllQuery())), CLUSTER_READ_ONLY_BLOCK); - } finally { - setClusterReadOnly(false); - } - } - - public void testGetWarmerWithBlocks() { - createIndex("test-blocks"); - ensureGreen("test-blocks"); - - assertAcked(client().admin().indices().preparePutWarmer("warmer_block") - .setSearchRequest(client().prepareSearch("test-blocks").setTypes("a1").setQuery(QueryBuilders.matchAllQuery()))); - - // Request is not blocked - for (String blockSetting : Arrays.asList(SETTING_BLOCKS_READ, SETTING_BLOCKS_WRITE, SETTING_READ_ONLY)) { - try { - enableIndexBlock("test-blocks", blockSetting); - GetWarmersResponse response = client().admin().indices().prepareGetWarmers("test-blocks").get(); - assertThat(response.warmers().size(), equalTo(1)); - - ObjectObjectCursor> entry = response.warmers().iterator().next(); - assertThat(entry.key, equalTo("test-blocks")); - assertThat(entry.value.size(), equalTo(1)); - assertThat(entry.value.iterator().next().name(), equalTo("warmer_block")); - } finally { - disableIndexBlock("test-blocks", blockSetting); - } - } - - // Request is blocked - try { - enableIndexBlock("test-blocks", SETTING_BLOCKS_METADATA); - assertBlocked(client().admin().indices().prepareGetWarmers("test-blocks"), INDEX_METADATA_BLOCK); - } finally { - disableIndexBlock("test-blocks", SETTING_BLOCKS_METADATA); - } - } - - public void testDeleteWarmerWithBlocks() { - createIndex("test-blocks"); - ensureGreen("test-blocks"); - - // Request is not blocked - for (String blockSetting : Arrays.asList(SETTING_BLOCKS_READ, SETTING_BLOCKS_WRITE)) { - try { - assertAcked(client().admin().indices().preparePutWarmer("warmer_block") - .setSearchRequest(client().prepareSearch("test-blocks").setTypes("a1").setQuery(QueryBuilders.matchAllQuery()))); - - enableIndexBlock("test-blocks", blockSetting); - assertAcked(client().admin().indices().prepareDeleteWarmer().setIndices("test-blocks").setNames("warmer_block")); - } finally { - disableIndexBlock("test-blocks", blockSetting); - } - } - - // Request is blocked - for (String blockSetting : Arrays.asList(SETTING_READ_ONLY, SETTING_BLOCKS_METADATA)) { - try { - assertAcked(client().admin().indices().preparePutWarmer("warmer_block") - .setSearchRequest(client().prepareSearch("test-blocks").setTypes("a1").setQuery(QueryBuilders.matchAllQuery()))); - - enableIndexBlock("test-blocks", blockSetting); - assertBlocked(client().admin().indices().prepareDeleteWarmer().setIndices("test-blocks").setNames("warmer_block")); - } finally { - disableIndexBlock("test-blocks", blockSetting); - } - } - } -} diff --git a/core/src/test/java/org/elasticsearch/indices/warmer/SimpleIndicesWarmerIT.java b/core/src/test/java/org/elasticsearch/indices/warmer/SimpleIndicesWarmerIT.java deleted file mode 100644 index dbbf3bf7247..00000000000 --- a/core/src/test/java/org/elasticsearch/indices/warmer/SimpleIndicesWarmerIT.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * 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.indices.warmer; - -import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse; -import org.elasticsearch.action.admin.indices.warmer.delete.DeleteWarmerResponse; -import org.elasticsearch.action.admin.indices.warmer.get.GetWarmersResponse; -import org.elasticsearch.action.admin.indices.warmer.put.PutWarmerResponse; -import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.indices.cache.request.IndicesRequestCache; -import org.elasticsearch.search.warmer.IndexWarmerMissingException; -import org.elasticsearch.search.warmer.IndexWarmersMetaData; -import org.elasticsearch.test.ESIntegTestCase; -import org.hamcrest.Matchers; - -import java.util.List; - -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.is; - -public class SimpleIndicesWarmerIT extends ESIntegTestCase { - public void testSimpleWarmers() { - createIndex("test"); - ensureGreen(); - - PutWarmerResponse putWarmerResponse = client().admin().indices().preparePutWarmer("warmer_1") - .setSearchRequest(client().prepareSearch("test").setTypes("a1").setQuery(QueryBuilders.termQuery("field", "value1"))) - .execute().actionGet(); - assertThat(putWarmerResponse.isAcknowledged(), equalTo(true)); - putWarmerResponse = client().admin().indices().preparePutWarmer("warmer_2") - .setSearchRequest(client().prepareSearch("test").setTypes("a2").setQuery(QueryBuilders.termQuery("field", "value2"))) - .execute().actionGet(); - assertThat(putWarmerResponse.isAcknowledged(), equalTo(true)); - - client().prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); - client().prepareIndex("test", "type1", "2").setSource("field", "value2").setRefresh(true).execute().actionGet(); - - GetWarmersResponse getWarmersResponse = client().admin().indices().prepareGetWarmers("tes*") - .execute().actionGet(); - assertThat(getWarmersResponse.getWarmers().size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").size(), equalTo(2)); - assertThat(getWarmersResponse.getWarmers().get("test").get(0).name(), equalTo("warmer_1")); - assertThat(getWarmersResponse.getWarmers().get("test").get(1).name(), equalTo("warmer_2")); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("test").addWarmers("warmer_*") - .execute().actionGet(); - assertThat(getWarmersResponse.getWarmers().size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").size(), equalTo(2)); - assertThat(getWarmersResponse.getWarmers().get("test").get(0).name(), equalTo("warmer_1")); - assertThat(getWarmersResponse.getWarmers().get("test").get(1).name(), equalTo("warmer_2")); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("test").addWarmers("warmer_1") - .execute().actionGet(); - assertThat(getWarmersResponse.getWarmers().size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").get(0).name(), equalTo("warmer_1")); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("test").addWarmers("warmer_2") - .execute().actionGet(); - assertThat(getWarmersResponse.getWarmers().size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").get(0).name(), equalTo("warmer_2")); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("test").addTypes("a*").addWarmers("warmer_2") - .execute().actionGet(); - assertThat(getWarmersResponse.getWarmers().size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").size(), equalTo(1)); - assertThat(getWarmersResponse.getWarmers().get("test").get(0).name(), equalTo("warmer_2")); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("test").addTypes("a1").addWarmers("warmer_2") - .execute().actionGet(); - assertThat(getWarmersResponse.getWarmers().size(), equalTo(0)); - } - - public void testTtemplateWarmer() { - client().admin().indices().preparePutTemplate("template_1") - .setSource("{\n" + - " \"template\" : \"*\",\n" + - " \"warmers\" : {\n" + - " \"warmer_1\" : {\n" + - " \"types\" : [],\n" + - " \"source\" : {\n" + - " \"query\" : {\n" + - " \"match_all\" : {}\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}") - .execute().actionGet(); - - createIndex("test"); - ensureGreen(); - - ClusterState clusterState = client().admin().cluster().prepareState().execute().actionGet().getState(); - IndexWarmersMetaData warmersMetaData = clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE); - assertThat(warmersMetaData, Matchers.notNullValue()); - assertThat(warmersMetaData.entries().size(), equalTo(1)); - - client().prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); - client().prepareIndex("test", "type1", "2").setSource("field", "value2").setRefresh(true).execute().actionGet(); - } - - public void testCreateIndexWarmer() { - assertAcked(prepareCreate("test") - .setSource("{\n" + - " \"warmers\" : {\n" + - " \"warmer_1\" : {\n" + - " \"types\" : [],\n" + - " \"source\" : {\n" + - " \"query\" : {\n" + - " \"match_all\" : {}\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}")); - - ClusterState clusterState = client().admin().cluster().prepareState().execute().actionGet().getState(); - IndexWarmersMetaData warmersMetaData = clusterState.metaData().index("test").custom(IndexWarmersMetaData.TYPE); - assertThat(warmersMetaData, Matchers.notNullValue()); - assertThat(warmersMetaData.entries().size(), equalTo(1)); - - client().prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); - client().prepareIndex("test", "type1", "2").setSource("field", "value2").setRefresh(true).execute().actionGet(); - } - - public void testDeleteNonExistentIndexWarmer() { - createIndex("test"); - try { - client().admin().indices().prepareDeleteWarmer().setIndices("test").setNames("foo").execute().actionGet(); - fail("warmer foo should not exist"); - } catch (IndexWarmerMissingException ex) { - assertThat(ex.names()[0], equalTo("foo")); - } - } - - // issue 8991 - public void testDeleteAllIndexWarmerDoesNotThrowWhenNoWarmers() { - createIndex("test"); - DeleteWarmerResponse deleteWarmerResponse = client().admin().indices().prepareDeleteWarmer() - .setIndices("test").setNames("_all").execute().actionGet(); - assertThat(deleteWarmerResponse.isAcknowledged(), equalTo(true)); - - deleteWarmerResponse = client().admin().indices().prepareDeleteWarmer() - .setIndices("test").setNames("foo", "_all", "bar").execute().actionGet(); - assertThat(deleteWarmerResponse.isAcknowledged(), equalTo(true)); - } - - public void testDeleteIndexWarmerTest() { - createIndex("test"); - ensureGreen(); - - PutWarmerResponse putWarmerResponse = client().admin().indices().preparePutWarmer("custom_warmer") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery())) - .get(); - assertThat(putWarmerResponse.isAcknowledged(), equalTo(true)); - - GetWarmersResponse getWarmersResponse = client().admin().indices().prepareGetWarmers("test").get(); - assertThat(getWarmersResponse.warmers().size(), equalTo(1)); - ObjectObjectCursor> entry = getWarmersResponse.warmers().iterator().next(); - assertThat(entry.key, equalTo("test")); - assertThat(entry.value.size(), equalTo(1)); - assertThat(entry.value.iterator().next().name(), equalTo("custom_warmer")); - - DeleteWarmerResponse deleteWarmerResponse = client().admin().indices().prepareDeleteWarmer().setIndices("test").setNames("custom_warmer").get(); - assertThat(deleteWarmerResponse.isAcknowledged(), equalTo(true)); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("test").get(); - assertThat(getWarmersResponse.warmers().size(), equalTo(0)); - } - - // issue 3246 - public void testEnsureThatIndexWarmersCanBeChangedOnRuntime() throws Exception { - createIndex("test"); - ensureGreen(); - - PutWarmerResponse putWarmerResponse = client().admin().indices().preparePutWarmer("custom_warmer") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery())) - .execute().actionGet(); - assertThat(putWarmerResponse.isAcknowledged(), equalTo(true)); - - client().prepareIndex("test", "test", "1").setSource("foo", "bar").setRefresh(true).execute().actionGet(); - - logger.info("--> Disabling warmers execution"); - client().admin().indices().prepareUpdateSettings("test").setSettings(Settings.builder().put("index.warmer.enabled", false)).execute().actionGet(); - - long warmerRunsAfterDisabling = getWarmerRuns(); - assertThat(warmerRunsAfterDisabling, greaterThanOrEqualTo(1L)); - - client().prepareIndex("test", "test", "2").setSource("foo2", "bar2").setRefresh(true).execute().actionGet(); - - assertThat(getWarmerRuns(), equalTo(warmerRunsAfterDisabling)); - } - - public void testGettingAllWarmersUsingAllAndWildcardsShouldWork() throws Exception { - createIndex("test"); - ensureGreen(); - - PutWarmerResponse putWarmerResponse = client().admin().indices().preparePutWarmer("custom_warmer") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery())) - .execute().actionGet(); - assertThat(putWarmerResponse.isAcknowledged(), equalTo(true)); - - PutWarmerResponse anotherPutWarmerResponse = client().admin().indices().preparePutWarmer("second_custom_warmer") - .setSearchRequest(client().prepareSearch("test").setTypes("test").setQuery(QueryBuilders.matchAllQuery())) - .execute().actionGet(); - assertThat(anotherPutWarmerResponse.isAcknowledged(), equalTo(true)); - - GetWarmersResponse getWarmersResponse = client().admin().indices().prepareGetWarmers("*").addWarmers("*").get(); - assertThat(getWarmersResponse.warmers().size(), is(1)); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("_all").addWarmers("_all").get(); - assertThat(getWarmersResponse.warmers().size(), is(1)); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("t*").addWarmers("c*").get(); - assertThat(getWarmersResponse.warmers().size(), is(1)); - - getWarmersResponse = client().admin().indices().prepareGetWarmers("test").addWarmers("custom_warmer", "second_custom_warmer").get(); - assertThat(getWarmersResponse.warmers().size(), is(1)); - } - - private long getWarmerRuns() { - IndicesStatsResponse indicesStatsResponse = client().admin().indices().prepareStats("test").clear().setWarmer(true).execute().actionGet(); - return indicesStatsResponse.getIndex("test").getPrimaries().warmer.total(); - } - - public void testQueryCacheOnWarmer() { - createIndex("test"); - ensureGreen(); - - assertAcked(client().admin().indices().prepareUpdateSettings("test").setSettings(Settings.builder().put(IndicesRequestCache.INDEX_CACHE_REQUEST_ENABLED, false))); - logger.info("register warmer with no query cache, validate no cache is used"); - assertAcked(client().admin().indices().preparePutWarmer("warmer_1") - .setSearchRequest(client().prepareSearch("test").setTypes("a1").setQuery(QueryBuilders.matchAllQuery())) - .get()); - - client().prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); - assertThat(client().admin().indices().prepareStats("test").setRequestCache(true).get().getTotal().getRequestCache().getMemorySizeInBytes(), equalTo(0l)); - - logger.info("register warmer with query cache, validate caching happened"); - assertAcked(client().admin().indices().preparePutWarmer("warmer_1") - .setSearchRequest(client().prepareSearch("test").setTypes("a1").setQuery(QueryBuilders.matchAllQuery()).setRequestCache(true)) - .get()); - - // index again, to make sure it gets refreshed - client().prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); - assertThat(client().admin().indices().prepareStats("test").setRequestCache(true).get().getTotal().getRequestCache().getMemorySizeInBytes(), greaterThan(0l)); - - client().admin().indices().prepareClearCache().setRequestCache(true).get(); // clean the cache - assertThat(client().admin().indices().prepareStats("test").setRequestCache(true).get().getTotal().getRequestCache().getMemorySizeInBytes(), equalTo(0l)); - - logger.info("enable default query caching on the index level, and test that no flag on warmer still caches"); - assertAcked(client().admin().indices().prepareUpdateSettings("test").setSettings(Settings.builder().put(IndicesRequestCache.INDEX_CACHE_REQUEST_ENABLED, true))); - - assertAcked(client().admin().indices().preparePutWarmer("warmer_1") - .setSearchRequest(client().prepareSearch("test").setTypes("a1").setQuery(QueryBuilders.matchAllQuery())) - .get()); - - // index again, to make sure it gets refreshed - client().prepareIndex("test", "type1", "1").setSource("field", "value1").setRefresh(true).execute().actionGet(); - assertThat(client().admin().indices().prepareStats("test").setRequestCache(true).get().getTotal().getRequestCache().getMemorySizeInBytes(), greaterThan(0l)); - } -} diff --git a/core/src/test/java/org/elasticsearch/rest/HeadersAndContextCopyClientTests.java b/core/src/test/java/org/elasticsearch/rest/HeadersAndContextCopyClientTests.java index 2a8299226c0..238e16d4b44 100644 --- a/core/src/test/java/org/elasticsearch/rest/HeadersAndContextCopyClientTests.java +++ b/core/src/test/java/org/elasticsearch/rest/HeadersAndContextCopyClientTests.java @@ -327,7 +327,6 @@ public class HeadersAndContextCopyClientTests extends ESTestCase { client.admin().indices().prepareCreate("test"), client.admin().indices().prepareAliases(), client.admin().indices().prepareAnalyze("text"), - client.admin().indices().prepareDeleteWarmer(), client.admin().indices().prepareTypesExists("type"), client.admin().indices().prepareClose() }; diff --git a/core/src/test/resources/indices/bwc/index-2.0.0.zip b/core/src/test/resources/indices/bwc/index-2.0.0.zip index 7110fb424a8bc4ab8d2ddef2ebf4f64428058d3f..b16a37fffcdcab5bf1e674a1946588116dca9b3c 100644 GIT binary patch literal 91254 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 diff --git a/core/src/test/resources/indices/bwc/index-2.0.1.zip b/core/src/test/resources/indices/bwc/index-2.0.1.zip index dccb7774fa63c9ff4620e305848b17ed6b72a138..3b1f32195e776ae99ac2ea850d9a5d8278aef43b 100644 GIT binary patch literal 88838 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 Lz{){Af`R=H)pFs| literal 83074 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
c z{wN9v4tHT|I6dkS>BYhk;T5iUSl<4FYU_c_#XNso5o*IN3-Mwng7+y&(+!mh%l&@ zsH0WZ&Ey)weJS_|&Dl-8i4F(N-)d0oaH7gd3=v0ep^sFD8r`5A2J)j?yNu7pu-XC; zxLkUCDWPb3(E)=62@q+DF11=Qi3;UI>ANzNfs<@d#){6>R*+n-hRN=fe*$ER{%nem zSX1h~g#ccnPKHC9~wp=-7hZ!M&fqUs104oK5`D>O`w;mt>cex5L_9f;OrA=mUGyaP0 zSGO9JlT=t{7h<4gld z9cHvU5jk4WbQOh}(^+)d&m8gbx&phq!A@oJGWTXw6B?O4N4s7DzN^nU>?%v9gzrplUO=NTaMk zwq9w)KXu#?7{!GB5!ylvR7Lw2Fwx9DVzqGSey7H+wq!y#j;0rJb|UPR*Dbr>=zf>y zrw%SN%#jG!O=UouD=a^G#Uk&bxU{#2?X3E+P57f4!#F17`$TQ5Ag}S4m?B=YxI_M7 z(r@1~!`L+Cq)NyqYnXDn-=$;DJ__aDX9OiWH#&v!Cf=-ZLf;6;&xT#L63ucP_tOnM zBgsaY%-t-`*Zj0s1W{>+(f%gH{jEkj1%!@7r!yPF?R-tQl1XDlwl4^7rs`q(kb8o> zahVYAy#Po0Xy(;u6k48)3F4Jo%f$BDi)wwf%P(%wM{cRlhq4#dGErxKYrw^PxKwp( z&#U$8<@d6S?w2~)mVLMl+ICCa_B%CRd)I8h%2|o=+g*w09E3)RUl|-J(J8heP?Syw19;b^qsR>3$xuU?iK4O z9Szp>*BU;QJO77Z^Lo0eT4>!Al*A}bwbF?7;u@ROBz}m={p!rvsBcxiF z05K^G{Mveuy{xiH{V36!*$;%DUNsoNEQ zABOzJUN1dg17SgReA8<3+Kx?*6q#S+rEid-__%uSUdaO~qa; z8UyN{W4glF*=k_7L*iz^34P)%|Fi1r@`fnaWJ8|c`HM;#lHSxo+$KG#%?!;$9 ztiA|-ePN5S0_TpzpQ_ojNrLGtxBc?BF0S_S@7H9uLG+r{DrfZuodJVg=ux%=TRC~G zpd#tlcwEjOaAUhnuB-EvlLbt4*pPnp*BVDJ;lECcx2x>dDM5TOs1WbKX0%$x$NeBb z%#gD!--b1Cn4G7v&xYi)a9*=~$W?yOF#GPX6y(+AYU4{y_hWVTuuF+?khM7G`wmdX z1_?>r0>8gviGzmuP@;W9Y>FJt14*@0TE=*> z{Dvc~N}RTOl|(POk(YFZoj_ZI&zHM`QB?6FT(D;I3Q6f0I}$ub zo85mXxcDIsE6V?{rcui}{|2#w_FMpx2}Y`M1#P>DV;M7CtLOkoqD| zZMv(X5R+!xjMN}3SMu2wC+ORkL^n{Jqb2Z5GEa7nHdc1-qP0v?G%lyjyI;ih^oeh9 zBCLSx#v(<7v5Ek!-b&UI$}inA{gQ{;?rs8WzAU zh$8toJl1HUjFti1rSBMZ0I-8atckt4NnB%P1O)&_ov6^bZtd%819SI$=(Sg55~1@1 z1lZPqg#Aq~f^Nw*Z7AQM)Ne5P<}j~U-e3Z&M`1{t5TTR_0U?It05}p7CQ9E7j+32L z_D>>wA5W%y%qO%kg?41Wv*mG+-)M#@IqT5kKBig#mh>vy6cGtaQk7BD2}+MxfHTW% zC-LFNNPL?ij>oLs&1xsK4M`5&3j=ouJ?PW7L6<3EL(cQB&0gJeq{J>}@)vgx*NPQwtI+VJKL6nBN z`-m16pEacJZ>JHEmX?9#+}u$+!^@zFb zbAy;X%(&Y$={ z-ZO{&^i;-ox4alsdxW90lXM?5fuE#@$u66{AG@d{*-?gAT6de(7?VGLvc{h8mCGI% z;QS-Nh>N?Ko%58QIu4`V@oc<-Q?JRN^F8Y@Xz$>#Q>UPNk1+U5l{ISOKHaeI?xTVr zYqKzZ42t>r-gXxMQ1CxAM33Oktw#MpCO^YYTda`p<1W2b?xf1Ep#%GzkJWt~^6eYq zD>j$QEX!{JWUsUUvBFUXe2lDa9_)k6bsl#8@(Y~gR_Y0Mu+c8F35{pA{mr_#L)V-Y zW~;oP$+>$6=;avhmj@f-z#55CxAuZsKiJ^+GX}GEHPq=h>tu?GeTTunFm9F&P!3U8 zX=bgvO6N|!k+p(SB}u|5q*DK&79{sEFJ7(5(Cr${uM#b&WC98B|8~dEwr{w!lYgHf zy-n}eWXa)9Sf~&VkHLJq&Eb3YgfQD69riZ;>LkYPnm9EOHM>>^r)`q^Jq%Uftk+M{ zgKU(sM<-Fbgp>pogy?M$?}O4E=*;T%t0N8mq(KevTk4EflkR`u3ozND8Ow-p7Ft*h%}RrG@?BkApqz3+fH6sQ=V2VK$} z;^%1s?2S9(jK2(USFl_A<=U0J#ak6-{Kx8HzCd@IX!v#(eP#;3TesuxVxpbY#_t+I z^d%;?(7Am-8>_Ob>a@b)2L>d#&hG1$xW{3V4qy!aN^fPtaIKm+bV!)zQbe)J@`a+i zjn~YRC^EQ0Zn;JNtXlu)=6`Fp+<=R4sPFZ;GHHI=W`3I2^;yv$O57qp7%|d}%`^qJ zI*|KdqYGY+CVi+{}V@5#lJbK$_lxSR|)+;8b$x)sA+Ky zyeZY0U?KW~HSJGNdkUw(o9a3R>@ZiM-Kge*k7!r>HhpkWeh7#d$7M5U?}1Cz@w`LC zLt26o^oAjmMhf5-<;PHHh}J!#eA|K&pF5hAPQxjApI|)Xn4b>q6854RWS4_1AdVVM z*skq_yzxo3Ug>VbnrPiYk-Vh-Z+m`f5iio9*jJKUZ6zpU5r%(tBDD3(>UarmoXDz; ziaRZ#1$#JwZ^SwG=|XyovP^Ra4aq7`YBKyl9x$1EO{uT{3>BGXkY`|z47X0!DZ?dg z6tNC+4D>UNRv6T`Cea>7v~L1c)=zD@vqDIY@Fq0sSe{3kOSQ(EOd&(#TurW?ooxl# zV;Y3)M%qFDe!ZQSs}znYSvau6i&Sgp)hejVRmv95_D~Q%H-c&}wA#_MnthW(1^iW2 z>;@rJ{LPfV=V!5rs5lygk^UT7=jVpI%nH*hA$6i>GUHb!mOyY{w;S76;Y2kV%K#$E|jhz>LoUUUxd&dDHSK_p+R!dN~CAWLWo?wjL}mZ%_#uYL8y>K@G-Rv&{t`t9!-el%Jsu zf&r+o0J!vrn6$z=g>`Sl@6p5T9?ExFuhggTAeq9$GKLrcy3(rQ@+Fl4Z%@+of$~AN z1FmU0{3+Y|eFN>*Q%4mZcD=-|$vsd2YXznwCb$=WoxBX%APk}Hql!vtz3zTJG;Riy zNJC+Hm(IbScjDDyTeQpQrW${x7xG;0q(Mth7iwWlP58L&mrp`hV6d##daS$jkKyW6 zMgqk@L=T2^{YndMBs{0bLA^&=05*s6cL$3*b$Zl$HMsyQIT^F)8{msqEn1GZM;%ty z5_PybPje43*eh~TgSD%LD=NI%K|<_pa{H|wG*$Gm9{zAsxWi&Few-RJ%4~j9P24oV z?SljzFVKS=+MEhlZ9MKA!+D<(!pIQzMzevV?R&lANC)pXaJ|z_UBXaSa{i=nE#QT~2 zfSTCP6!v=qAH#9hZ@2@7hyreX%iIYCYgLz)j5;^fTJgT78`C#DYLxS8k2mp@zX|@E zrhT%U&V%LWIo;DV`K<<%9w?pNV)!v2B)7flZt1*gQXb^r`$d?dO9!j9DmCETfgtT@ z?3nH%$L#AE?Wbb4QZnt`I159Q&Z3nHmk)YzccI%LY%3}SK7Yk#ok?=D|MyHP+FIvr zCf5*=Pxv(E(`WCZS-_*yAoVC({k4X;+EQ#7Bj;<{ARvn_1HL}n2ot>KV6~1WPXbCh z*Aue_xxI5Q-nKuaJ#yH={S=_HZwqA+|I1|B7J;6Ad5bRkh~=*95sO=5D4VI)@9GPZ zZCwEXv<40O`O^Z{MVMaF;Pjp8Yw9lfSm|>QV7~{LpR9pAdDWz(XOhBgqCYc%m? z8**ZkNtayLLy6B}MZ4d8iM1(#a3r0t*n7)msMgUVxJL$^H&=1g$uci%FS;(futBJJ z9BnB9bk5GVM>0*W^NOI=qXoT2vpPS~% z?=e#H)%pL74)(o1f9Z_P{6yiz`TxSNi@H(8^EYSM5BDFrd0Pqmq1>(2-DLVT-L1Jk z?7sRCcm1b*A+-44*oBvnx$$y~_tCugcXE72yKGUyPbPt^lKTp1(~`XVWks3dH9=s} zXlCn`-Sb49wVpERX@dv=NyFbMceIIB8)$B4rPf8ylqD_b}+=gh8 zA+0E^c2+63%59b}z=nQ79gj--3d{=H{Ym;2hRgNch+|mDr5Lo^6e=dSYoHByX3{3D z(Gs;?bY`mV2~e!vT|}lOGGly&+y(U|)uptbVX_Dxh0>w@u+qyZCb>>=F>qjS@@Y}F zP9}0Cayx$Mde^3v@;loAD+*Lq-SsWf^3oyKe{6V^>bzDpXl>b6I{7hRl5=*m;TO6& zp2b_~WNK3y!8ux0sk3#{rSJjX1gK$|?Xt6%vTf9{%`o1ZNNW>m1A>+cEL45O;*3hr z3?m>tL3#FIL%C+@2qTOzH-`Xyz`Ou9Z&*A*OV<^-7$KBfdqj_Gt+cS+RI?#I7U){D zyxC}{w3Zp#PdYog-`ou1?O;mKm-aMAgL+SG%AyKW`V>;SquS1@Gi46DbU`_L(UvXN z2=(P3fEF9qNk$BTby#il;D`$sYQfR&zP~)_ii6We-CH z-z((}<6ylFCJ(bmXvhEc%JisHY{jTdvE@kA?Q^y92;Iy-W1!zTTR_`u9pMD|3A$W| z$zZTWcxOJzV1o`NnR?X{6-7rl{2O)JpQf9<3i%ktSE%G7%(`OLi@r&h&a#4dl$@X3 z%M%*~`~7EZ{F%VNB?N;Z_#vOj!JnY2q9kgAOK3 zIm>c4nqGbsK@ITP^l?WtvtFv#_WQ^!wXqgRW5Fg3u3s!Ek zn4!u7`dYYfxEK9K8}F3o+U`zZzUNfe%N291Q_eSoEEqcH+4iHftC3+ZR>wNkTr)^NWzd=pwhMGnhn50h^wV1UwRLm?Ijkv`EnqQU zPFqGz?;S~(oAy5_d=1`7wK2kG{`tPa^e3D?Ld=%b{R$Q0u4x4THIDaIE zDYc*6MSch~X}CI@wghFrpn0URA;&LipOJne1aWirC8+UPj`-r$?=(7@>c-V1Dxq!}QX)oQKiPR_qm^U8@yvbmgaECQ}^yn_XJT-DRA zU_kN140cc`Pq+*=lYt4lxYvuXw4^8QgIZ(PK`#0|^jA0U9Cp?;7Er$COrNS!-!Kpq zw?JysV%vSpR<^3A@uDw&;|dn=u_*gfJs^AK+o51r^iD*yFxVb)DDuF5I)dK~li$1{=C`a$_^Q+Pw%`CiRWzG3kLhed)RG)c6Q7a9#_iaji0ZR`PJ zMM=D{_n+IIPVb+#*NWL!yuXP;e3X?%Uka+FM|M{s9=UoIdAM$xw|QF#nZGq{E|Jzg z(^fB=dBq13qiDa=uG@=FAsBl^#u+L7Ytb7UUthCg#>LM6p9o>~;Z&{v_ht_tC`tKm z#ENKv;5hkQy1SZAt2Td~x<$LoSJCG5`Q^$q+KsEM)Q_xFL~5*DYqOdWOQ)$Eb0899Pys1 zac6_lP7+EcnW;|1@k*kDdE^k;4TAI)RbjA03XL|x8O}D+2P8Ktlbh))>h4Ld&RRtw zKycIs$|k~%=(9xQIYql4zqPYyi1;Abp4^ zU8~Y2{S$d9*9~5(j-|Am1t3__Rx0@vyr%}mOd_H4OBZ^sc@J~_e(v-N#$7UMJPPY)KQ>w@Xce)| z-ml5kk+i#6oPtU=C|*gc1C<`10)E8%{c>?rJA#r7Xcib$}`E z(>41xR5`lAB*W5+EvZV`fP>a3U$R`oWbequ6853AM^;B0soqj(N%UM9`>nOB{EN^Y zlXYgu&78e-Z|I@w4xQf&X4spyW?!e^{#RH*wH@^1MpH&wer)&&MW$(uAjRWB6Mph# z@X2nLJ<;96bBK?{81VcNEsSB@I~fExOwLmn`!OX7BkVNTIuU`_eGG?=Y;f49BN?75g$3HP%_#@Uz`}_|-i!IsOH;$IrHz6r{BF zb)lRmuvq#GTE@XwDPcAXH+c!9zkiK?tS5vb<6is~%o$47Y4s`AJ&bY)YMAfYV_L(m zc}aJ%D{a0@*$3&*xm?to&}Viuvz-_9{-8L-5P$FQY38>We*TL-ev(eR(vZ(He%bPK zAj@)@Wg&J}4e9ytIqmPzp$$g*TYMHwY*e%dAAC`Yk3FTu!P1alne(E8DTCX0F5Htra0CCH!eWed7q ztSZ%7C~-4QZZfrjB3S^w-7WrRon1EAUCpsT_e)wmGLurH{C1fg&1qpX+k03}p+kmn zSIcyNXEV8Ng25`=FE474Qoh}hVxosm`J~|Y>QJu2Ih~O)NE12vi(J**EEA1XaZr6w z6OYg*&%a@j=63JkVfqsT_Tw>*AOBA+0Caiz(>CERd2Xm=y+ZrJx$Lt7GGs)0X^t>@ z*n1{vY})ErEbo!u(`{$Psf=Hy+Go0yqwAdK`5AGl zlS5D+Iz*7gYx9-*OM}8RX{EBuj>nL|qU+Z{il6q`FJ*e#mLD5GP3 zONV6HQR>H#;*-@+7p%k+ycGQOQH4spZ~OzHZsnsRCM zFZu*~ws$Ovex>toZXIT;ZEpWcZzca267x*Ox=Dy_$#VUzhEsYRe#xNN*%w~^-?}^w z%Hx{sipkOfi0Bj$jP7>x_$_(8 z%T`CO-kgio-C2I_GP(3{;fEYnAEK$~|DE{$zLx(x-wHL1$zj!k%o~l} z0yNt4b1X@Za`?$?wCHT?h5*yWwCqQd`C=<*`%CDFlp8_xMV%=U^K4F^;6B_5Drnrt zAd609V{rw|c{o(bobJ~r(|3R()eBaTOaLl~erbdMJQv1D@)?T#H)wCNu_QkP>gE#F zzD^O>n!58}Mk}nnWl&u~xGhK$2=4CgaB#Qa!QEXB7Tn!}ySuwyZj-pH)S$C-UljSxpQ%DZ4-$+z0mmWxHr`3+Y4+^nc*oC0}sO~DK>cR0Zp}VgM zon_T<) zyNY#C7NcwZt8pzJP(Lu9ohayk~|KNIL1sAorPghI+q zd`ZgmrKg!%c0Xn4PsH!e?>~O^(>5#EFwiPE&@SC|6oeMfO5zn=rW2W!y5ruGJ=lYi zT?A!{5xr@%KV_c(jU{fxAL(y+P9zxduNrNWt1If-to;5{%nudBROb`1FvtZlB&ZzP z*MMGT&iQYf_>&rqG z=hx^<9`v%2<1V1IPKVk4vAd+pgOwViyI7U~XM|AZx<}!N!sRS&9*$WkZkijU>1H|9 zkcl>ou^VB-6FeUcsa}C*V$>}vhED^Q>fsla)UrV3h6b-0P7NLFTO{KZe_?U&sdnrq z-9^**19KCA-)b}R=>cNbw=tLGV?iMN>Ko+^0dc7Cdm!F{=z20cSPWt}l<;^o`O0-- zN>Grb1$*f8Ox9#ZP`*yW0((K+QN`sD)n2rA`=Urbnm6&zuWj*MJ5I#>0na$EplF*L z#OHHDIG55{WBtDAz-8-j@d2$U^9>RM0s;aCf;!n<5}5*oWBK{^>ofg;Ab>D6ayDWz zb~7=sv^52~8?XYH0W3_mcBVilCT6D3I!lw!(toxw{@-o?SqpS$GB9xhn3=k(slq~h zX(y8+&rd0jDY%SsAHTRw%j&21yw^Dd`!B%4aE>x;yEq z3EF+Vy}ip_QTwCu3pVJ)S`~Mt0)GiXy%giqy`wNm4bP;5eJJS0=)mH9Hp|6&IZHLC zsw&7doJm1r-aM8ksBaia3>$SQ5dSm8kU6f@$Nzu``F{eUt<8T6aqs_uxb+|4K5?ZO zjQ_834G|e+8E7YE!6gA7kv}hBUsEPSl}E`&*^^SO_|KEoX?=MbqD=QV9l55>|WYz;bfsDd=ip#lW zN6L}R_;nnlP^Z-?7 zuf6rb+@Buj`#;gCY+X(NTaO?8509rBB+2a9+n3Yx}M4Zp0%% zvs3jL`Ue)a7z{)F7mIoR4PQ%tTC4qk#^V3JkDUBZ7H4WFr2T(c&43__fTB3?#a#Ur z`s@2QyhMW^P&lrwsq#?&1w*y z{#X4R7Q@64%9tvS;@da#M?XNxt1;5%pefXcVKB@^)nJ2ISHpZ~(kmJ1N5SA;mMYZY zYeC>^!C=DpD?d@0vl7cE)l->yzB!7WS#RpMW_+qis|xcXbDFG7?WCNOOwDbL40sn6 zmc$xTFW-87VEtOo$0VT4!)L3j&$^zEL>^MGO_>=lQAp%)>pbv zwm=SM17?7!oyq@SJkPrvG!xA;1lu28d<{fkNWEc62T@F5ScY*-!qSWf*^P@(RicuV z#iVJKrD=L(~4Ws0yRUG!Jmq^F}tk@yWBDV@w9&Ci!OvCE_^jYOD?ZG zF{iva)PEX#1U|ByvQKpn+b3OONYE0PHXpjDoP-{ngkbpoZn>#q`X&tA1ZE*lRY1e`2ODBf!&Q<;oz8OG_tSUs}H z^waaCRjH-$Y#IRKxmIZ=vTPF^P9QXa2)JzBm8m=QWuy-EYK`a}iusDNDIAR3%BjBi zv4;V4+^@)-&Z7H*@PgyIgo@nq+fI)NInL@SU8yeQd(o=k+B#wP+F3uYGz@?cjVXOY z_P5pnc-}Ns?&!u*Htlnl16P7WpXq~xqwJS@;<;t07AcM}5lgg|X(*6p^_hQXebs!? zQHX)jgo}*;v>(WKl>CHNwPM)g7BeiF)Gg$PVPs0RE8_g zJ$!n84d&Vkgl;gk198i7db@m7cwtq!D>QoKso4<$)f51WCpN6ml-O}kuc|50 zLk9EyYYm&e|70inzOcDHQ<7HUAFUCDuZ%0=1@1Wdr!)u5!K3&T;>4L)!_!k>KttlF ztJ@aZ>ETGQQkqlbWJ6@@=*1Ri5>{gKHQg8@M!5KUFN!Qb-VL`4YR}4LT^hfnAzz>^ z=kOblyv`lrcNJ^VFLgq34_|rK#K@)y(Ji*B%tJGcgr$-Crh+=;lHb;G*%IpWYeQ!z zEIE3d{)t(+{t9bM@VdnV-wo%j5dUsbs#Di;5(hNm#}}3Q5yAFd%W82+p0?Rcg#6Kx9twn^9RJSq0Md`!640zyl4`J+POu##5GR8 z3O9IiCWbekk#~r{M3h@W0rn=4&|0kQugp*3U#-Y4=Vy@eyWD0LmuslB6Y8=Bv&M{f zzr@?#AytQI9Y+8`1eBPblF%Ii08bHOz9^!_7{Ch9_lMw6f#OapBvL|p8`DMpqiBndzf=GH#u3v-15BXv2YDOwIV-l{^ z2Urk9wC1S3BhMnuV;_g{?cM4HCTtbgc1PhJ#j;g;^XZyg9b88Y&{)|wRaEbjXB2oD_2IInR`dJ z9u~{JpI>ijRzRJ5y^S=DxJ8Tn#?HAfaJmBwYiq6e$>+-f4AnkjajL_bTONEXf=cU@ zNm&OMI{id#1#K5!Qw>C;-GY2#q#chBM}>Z8gppNUQuMU%VS3mw-oJirlGOV}Uw$0& zz`E*Sd8c(qa$#0;US>rk`eaM6J2DLlM7M_Pc$DV}ennknWU{@<4O~EW6ukeLf-!+ z?V=#cqH>2d_eV{q7!fbYKeobxW0ITkU>=Q`PHb}fiiLx*Q5K?o8y*Z&bC}lQTV~pE zXy&M1J(>)+f+*I*8E(DuKKuAX!qjYYtq1$)7kEcx(p4zQU^@&*^5Y7IS|$GQ*DxpI zhAOskhd7WzpRQhs%iR_PhR63ymYQOl2AY7DP{eJFOo|vhQtD%w5E>G|b;!*a4foGK z3#@~lh9|;X7{y(J%Xsqn+RiB|-YM-aD|e#f9!P*Yo4>IlBl7C2Q2Vx;v5l331Jo(J!?$&fb)K!w96nB5{LfFg)EQ^v?1H@K4GM zV_t+LBNu{*c%i0{#^VZF2ivuXPffd7=H&}Tfa)29OHg`B(U&&N(30wSo<(e&S|0e;Fw+mK1z1a=oza8;~luticpIW4BNpn@!IyGkl;uf zKH=^42`@-A8g8++3Lul)r_d|J`yfu=y3HL|t0NSrZ2BvOlXJcy_MH4K0elcZ5s%S6 z<>Y1Amu90{9L!>I_e~M^*@9`MP=p#5Q&N6~UFjMjyQei(abYUv#!_2k*%L}^=iv23 zMB^vmAgFQ}7Qwh%6y!sELzPd^%OfvsB4Hmz{y_E$wk4a)?mWY~?mDE>Xx0xHxM+#^ zJ*u%r-o9p!+^8G~&801~K0-^;HDjsI78Z%(qy|{~0-5PEOy&6M9D=)^p16{o5(SNXrW3nWC(Jc{hPA1xeP=9X5hpdh zgl8la?6LjY^ascD`l&O%SgBgv_Hpxu=Ib^M@67ROu2Ea994&-9;whW5Se4aFIY5aH z2mfo-nm>Ge+n4?FRIYjY-htuGWO^~>*`d%5%Jwa6aGE?TTkH`!w?p&^^^X zm|w3pt_GFoYzvxYumtriP$z%sJ}!ZOB5HpUt>6&g$?u+$WVYrqPopN68fNTsqePRW zB4(6Bq`I1&3`aC$o(^{HP0U?$Oov=1fohu{bL(}F3M|xdmcHLGg*{c;GflO!j8_Y> z76gsU8>qyaR>UUQ-=mA(uj>ETY$QJ3b zsJeGiT%TmFcyPV_WHOW#Ed9YR&)pu>e@k)a9CUetp2SPzsao*^xd5>vmndyZT>4$`wkAcLuK~t-V~s3VluZN1Lxo z>d2W!!G|6)KhMFAWmXnWl8T!X3~-@k9|X@Vi;DIECtJe#*b78++)7eRmPwJ298dC5 z@GY&Zhee$(QJVdH2%Y%;$vuvT~kE5W~Ym`~#d?bYhgbM_C;mL)yxF5)cVyxGe{HIl&LjZ|1S`t)g&mpjD+WCNd+6=sFa-GbJ^ z_gVo-2cim5iv~>OU1m({jZUkesP&z71$O}|p*|nmT%OHi#}&dA{fiic0-DO|rtHbX zMzu4bw27X5)~LW1^RFkI7r$1zi2t5HRSUj8bWlmG&o=%m7=FMuzB@+OF$fyEvEAd7$mbom=IyY- zY`l&j$UMg>G^JjZ)p3%!Y&bo`I}V}U8D^>J1QqS7CZ~1o_xV_#T6Rm4+$iEP^_Or& zvx=su&$!36N((>N$BJl!Y0=w$1@>Cn5CLZaVP1J#t9AMY6>Cg5GQ4rM8i+qwwW|}H zi77+dv~&5S2kphU2TQb|o$k@a2@h2#iGcMP{WE3B8A+;ZbAhd3dfEu8yjBE|juj}T ztcam{Qn!44s?*iuPd74e>Cc8cx+pCl3W~*sb|W(M`fQrx62-1a6%Qe)>z&I;`XiCv zmTZn=we!L6=6TpojhMWw+ZdH;V*2*TKrO0ZZ?>Rc9d8)Jpm_8AXj$@;lYW>EhFlC! zdty1B6WpMd$fqxxL~yrWRgp;eD63RkNVIomZQfyrqoJ^e`&i{V+(UR1Z*|1}3L3)U zYc@_Qay_|`A;$1ix7WDa%soH3N4rFeJYr>b2f>LH+Cn4xDb)hOM1R>~r+}Kpo;#WA z1%Y9aCtqw*C?D`nfBXQhM3Wix772u*)FRLc{Elk{?@WW+*tjxGEUWI!&&Owe(-yRy5b67cf|mk)+xK8p1CZe4cG@eDz(&bK&|Ab}<)!Gu+i7GH zL$vCx**t+Oz@f!gWl6qTeDMi@DiMYd^&=J`X<_y^wS-Ci^oGcr*h7Z<#CCNesx12& z=gday$uD5?_w%r3_>J*qm#{2`4YARUaI^3m(LxHYv5AtdtNnR>@p@&J@Dj5gfxIJh zI6iyXlB-LgTQDqp2EU0#nG#VR+Pr62x=&Zx+&N@y3J?8)4~%2uI`a=>P<0JUmj6Ec zA3mw&KZSP`m8;`tF54-%&EEu5wee9f)lV%;nsM#osMZGxb}%Yeq}KM^7ZdxHRGapq z;Gb;Tyq<^>CZ$8&pk=e`WLbEsl|NZnn@VWQn)bnDzeV&4M<+np0mjJli&eWcG-&}^ z9$&MsVj?0kp2js!D?nsa$&Pp-KthyCJ7K=?f=b0z-NUWSkR@gA-W$>EK-Z*rpP`Mi zo3`YYcK;r6Ia?YhTJ3fi9TS?OD0hF{i6I+RgYXvj$lRnXCHy3vMyc2iEAo`OW9CfL zyWB>f&fkRC@KlBIratetKb2O%c*94;$KK6&yW5);~LZO=%Vgtm#(i6vMqGl6_gWZO%pm`8uSy6pGG{ykx?XoF{rOGHwt-c?1=Wt_qfenIFG{kvUz!uHD`*pGl9_Wa_ zFCy5JR|iNq7yY@lRW!^vfNiIl{7WMapR=#@NiFE8l629$mJl2Vfs$#y&{Ha#=7r;J z=sK9n6wE&s-Y84DVJ*Y@4WapD91CQ8q0ObLY;4ZZF(_TW&l!R7o+eFbsw?N7@Oazw zHUfH}`Ira}Rm#dDU0KfsR!}PN#eAsg1%_okPjJ$4 zLZ9!7sJJ+DftxT}3@`I#Ib#Y4v&wW8tn&2DIXJlazb%tScyJC-pr+j8+_K9T)U=*s z?Z*tCdov03%ip3xJ~)C{2ix}~je6kd!n)|Bs=+B`W(8uURp~`_Z0EllW-KWtwo(+G&0<|t?_Lcf54%V!9`&rQTlug6hO1Lq;xt=cLI8U(Kpx z&I_IAoCbESv-=DwAT(2_6X2tFt@TO5I(FqZS%7&MXBT%FxEBY#wxah$vcRR++SlTk z*ytM9))Wj)8*Y$S+wXHmWrYMo`8kb5;J3I2Rh}InVX=sl)7j-=SL_^oi&A#L4!^Bb zBoqT~a~yCU9tjM~jNXIIt4DYk`HEWFhbB@jy#m0UZOgaPR`Va;xEC*}q{G`6Rd zzu))g%JsS8<*8tIM+m)<|i-L8j_kZ2`A{7o$dj2}^JJnqk7GwPx*8Rh% z8s1KTgutxpA8oSd?^GpxuX33+#199W+Cl@xE3`rdqKLDd7n1TUCDAC?R&OTf8&Vuh z9vgwMR`VcvR}@CMb)sBt3x?29co<$Q>0&LY0+u-H{r<*#1jut!>D%jN5cUr}!QgCp%|~w3FOe^h16u3ss8IYJri{ zCUe&NOVJkn+v3fuVHxMqOmr{KYVes9WU>q5&SKUoX~`(!zPvC{D3p(ez(lZe72_Q8 ztokMRlTs;k2QR!hlKHam)id}UsDI3!SYv{{7KtRB!+5XKwG_j!3xhG7u?&A;t8h(} zc6!<*pUftv<|fvW$-_fQRcM5PAucLgJ|DcGCSj~!qo_ch)PwATm{ZtFZ5mBh5jH<{ zb;HtERl}=*c_d}pbbAD7-(Ql7e)62D=6Fb$jVc>E58(In<=gYhvr@CQQEXEvTsPwe zOXI1&v^BTq32QY*wqT`K<#$;VqkGk7Uz$+fX_!74VeVh$RVafm;_f1_^XXy_67UWt z{*H~#x{zpBpNCfG4Jzy9bwhhK2UbuIL5#a8?c#|BG!JXfBfH5jlbjn0pX#Ok?u)an zG|ni$2jBnjNNN$C!O1ZSz!^PX5j{h3@N2up`u7^5$U7@%m@CD>8ZaZ?=KG>rDWB|)&+ha17+FNI}WbiK;bUpE_g z#e+Sgm1YuVIfV;<))5i6?AG&5=^${;)->JY;yD*s_57-lR&mDMA>GO;FOr;HD>!b# z^mabr7bvb~rXp^e+&_a;Gi!4Qu8?;PQQONw3;pRrjMYKI&&2v`)Km%A4(<0zMMab< zBep@WWd#`-heWOPTKFi%zasnxa>XA_lEPx+e?e7+_U+@Tn(0jKcY+|jArwBSO#Y=U zp4gpJW3GaU5qn&TC)%=ouSe9hbLDeetSYd2_C6+;;T0rfmKc^>ie8q_n_5<&8=SDp zHq5+kHhr!LV!W?W9|=a6YN6Z~*4ofS=;yY|H#Q6Isx!m4GdgP%v8Op0Ys^OJDD1o` z)>-YN0?kMr!$d&8!|c<^R~pp%*>ND?Qk|JBWXz65mN1UrB%ZCpXW+O z#5}_+zcU-M`mZqN=2j~HeeN`oE#Y8NH^Wb_OcpGk)h0JIVeM3c*OKmsp)Sx7`{*_y zBcEjp7H0xD6RLrotmJEBoiyL8si>WR#dK5H>j5}r|U7|CkT}*DZh`fG_F92vx zYm~N&IHOT@P6DBHD(RgV*y_0u)ix|Hz9i2jicPGd9;nmFO1m(r0CC4R#%plQzZBmh ztwFz#&hP0U!91-zwWQzIR8>H0Ng7tzHetFC2P^q1Dk5)Fy>5?Xu}3)JG}}`+exar< zN9e0UvM-#iMOuCf$odv`;zCIsr&eUoM{koqmF_5OPniFfc2QW7YVVBY;OQc+QA@&W1?+ z9Z?pT947g3)ge)Xjtr`rN3X#l#VxBM_@=V8*Dg$~l5`VQK0`5=32nyH`Jq)jHIpO! zds{KdTH3Cw8gzurJ(+V*_;!I{nmdU3-}Y|RGRIdBXbcWdV88~8RKht~Y*#l5PC-Q1 zpTQrFA1IVVCKP7FT5mjPj5L5zHs^ZI0rj?~0|@x047sO-kz)EfJbu@vF$xfVYJEYT zX^i^5yY`!hRej#*MoFaD19=Nc5$mGsk6-go6N~B|a$Iy8%%_O%(q|X2t~l>XV7t4C zkrl|xULPWr*O4;kakglZRlZDv=ulGN24(w-JWs1L_Lv$%ojms%s`_~W+A&p`GMsvb zj$1xw>9^nu{zI)59F+~!=jEs$@m|5;+DwX(7Ezx}t@dLIs!U%rEe{*7`UO23+p$?& zMyCo#B=q1WHuB^IzIYkjR^$+0jEY+2V0`wph%D;k8B*{M!6nSERqka6xPtz@5;@VW z$-{c>deU%cpVp8~@%ModHD(4Pyk;7N?ki+fJ~`O^qm(r%YwL6J_BFEo3uVhEoSx=w z_09-wb%-0Ep557Vx6CO8YE${ep>ncujMO$5PSY4Fb6x67&WL=4T@`3DNNW-!yhfjI znD^zYBOm&VmIt!N0(ntNL zKC|2ns2iFpA#|?DXFa81EJ*@-3kLEV;6n@JyF$ZF;tquHF3HR)M!+r(p<-!7*Dvp| z%b@q7IPo)Md&J)9*&&(6XHt2U?4k+5fVhciti~Y>W2QSxe5)9gEHH8+)lCp(lT=PE zrIsbT^52^!xx$dG&#C4%o?}K0TzA&pdp5R*p+Mwjgzkb z*|&lPdYimW`mTNi^Qu*k$ad)vBgksL)G)#!8Ssl350)9&$3oLC#ekqv?eg0XaJg5k z;gB9bnn`g_KNF#aU6&bsyZo{hfFxW#dF|Yrkh#!@5sfXpZ&X+selbI?XvbwQrlfEptn?aiia zVb~(OIo46mm8K=Kn2z!J{M1#p^rKUYYq?a$ z#XADJez}SsnEUwx^_%OK1-y(s*Kh^Un)e>kR|84=H+(csv$SL(M)P>5aJPXGf><&D zrR=dZ>>{f+>k$&kFQ%UE8gcXh{l4%z3ywJkZje<+8BN>jQe=#MJBVY3_6 zzvZOZwlI6pM#a?o#w7TDv;Xko_xq!9>LXNe=VEN)d1*Ic-DdXG@I&K6V0q-X5C8w0 zy?%HQi`pdL|6nalvEMdqsUeV!lY$Hoe)Tjh9$cpEriV(Du4lQ}XqLB$j zKw%lr?|K2|*7Q{?_p)l5yR-kyy&qkNn|-!{Pw_UfKx;m}9JH8{&f{gQ>|7%Km+Y3D zx1%HzwHA^Y7iDMlYVpDaGtW^$qH3yagybrzsbnlEJX$u_*uRMY%N!)nBbrEclXzBV zEQNN7(`zfJ2EYcKnP!zX?TWF~VtjaF>SV4@0hf!6SqTMDleNh?(9ls4y_j)2oTGls zl0t!9kKBSCluo4A{zp|(Cx1eVL52}ixWUpfgo-WotR~-FfMQ6HU0n)HA!B}W3|%WR zYnqT5Y&Z^CFG*ozq_|45!v9BpLfA2XLE>-T06V94Bb65V8ic@a>jSA4(`mev1mGQl zAwfR_BvgDi8}7H%If2FpR?n>Ip}a7{;iJThQa(see|X*3=;tZ^yG_(rWXO-eEn-yf zY>#emU^at0df!JliNRYo7hCgNKigq_lv`oVLyYa{>sGv5t*Q0P(<7JQS{y-+P+aT% zhWA=%kMA`f@uH>B*N=LTH$oGUrKr%#&@%#~D*DUpqw(fwS+lcEyLq{|ws@>y z_V$A2AC@(%0?1zhQF0LTsLcF$ne&GA+KwPN-deQ==&tnR&y6TP9vm-cHH7UwyZ!1g0#e%}-{`Lcx?;pmj>*_L-_jahYn_Q{mOFz5w6Pw&BU%T_Y7lBB@*S6E$=;m>Y zjefMLP!2VjSVtXC=er)~j)ab5-exx$s{^szw~N(WAEwUt4VPP+cBsn>t(J3aHR69$ z3chpqT~jyB$uN8F)qm!VXJ*wIlZlLB!+-kwUrWjaN7tD&S;wW!3ir*M$^=u6i5&dV zbPlT5I;x(%YU!RkcjtK>m0Xi%UBaR;(EfKZGeL}8_2}T}9xN3ZvDenC8Vf~cHB zycKxu809(>f8Qhr47|yuP!%2bf53Y2?GR+v66m4j}aO7z<=KH>lHno63jXt+)*8>?QJ&Y^9#d71_B8CBR7qj_3w9f zPG)oS65n9ABVyxjah2PzzOzvS06&|w9Gj!^q2pU~3x23IZBxr)m->*A+2mv%C_@^I z6wZym;Crs${(4U;m#I68N%}OimRjS4WR| z5=+0L@Uk$21W`nYe`qh7sv-AgPtU_1;$60&Xx>ou)5e&unblGGE=b)YrI_CZ@T4X$ zP^v4kJfdsP@`L*k-zj4{2kmBOb2A%zr@vIcQp{q7en6<=FUYv3b8gcM_1-FUJ};9G zOUiFwS6q?_U)3C@H6nH=*Yu1~nX?x@lAjfzS1B`OiCGyB!RLF_J#59BRlckVXgSv+xZ3K<9lfvPL($rE|K1~=y9g+ug)K2U2-&Zn;b1&RdQKo_Y^mU;)bXx`%8nvdT- zc5ny&UcRc^HJKk}RhJ24SSnd6!pf5TYwL{}x1Z zfEg_}2o}tXl~M2t?Fz8JSs%&_B*&ne1K>Zs%k~!Q`6$+t03V4*N17 zVyECWSLDjsNyEYk%3pUieBm}}OCvJdWuEc+z(b!6)S4yRwL%5y)=VYEjwMk13W>&2-|lJOR&Pb!9le0HaGrcHP*-d zX?tfj5v3IMfn|{zZ~Zo8`$GePg@3X6=pl}t@iZ6Dr10_kYW@pu^D8{T9Wg28gUxGv z&zOkK*dcg~)pyd`%tUH0bkxT;Xz|u2Nz>O~&QExqbG|!LaTofh%6w`d$)miOFaEmaiFF9G<=5J7xS;=lby9(pSQxh*yzyZznE1H_^WYEf?2<-VuwUuL}zGTZlBiqe~vd#$c|kjHs?( zb^0CqzzLE|36BF|B9_c|XxAM=8bRQf386a7+dpf|CSzFvm%ICCxw~vps852tmu!QS zUBRNdjnQh!BNKk`wC0KhO8>|!9?et!vdgjTdQ()N;k&!f^-~@!(@MKDq0rEUhBa)jsHp{$Osnlzi=r5b-}ld?=>Tk&lWWMNOzLY;izO_z2kQeVSS_k zQf-$!KcdI(cZq~T49Fg)uE>>A7ru4%U(c)DDe#2MbUN3tsx2@-VB7Zu0As@1_9Wev z+edSAdf2^?!%WC{RC){1t%auv^O-lIpOA}RaV$@sEG6TaK@A75gpCBj4>mV4tDV#m z%)^frLg-^vE3gZj+oEWQ74zcHU1=SlCvWe3u7Bthw%WI9X}KQ|x%L~I78>u2ULuWZ z?oUtH3&orLZpUaLtqLeDcLLVd=AF(fqUD)>qX$(6B;ya+p&hy9`{_)3f_#UPnpf^M zw1R*&PK4%zL!4ow`zU{b#4w0WZV;cnxm7|ZEr-($Umy#;~hQrG)kn$5nCTsykQb@IhdcpQ^^=Q291 z{CV{wq2wcHdp|^B+a%d!s@F9-CF`NqNcP27_B5Wg%k$NK&`BF3dhS}5$E%Qa-n zy|?pawX%$ zoD4A5&K;R)O0PS$n8}lPEZ1kSTM%H0xa1w>hMP%m9o6|MWVt64QhCg0FZp)}JrcuO z{_W)v^RMVm1-(T%o1or{f-I)?+25127pf^de~08+8uw}=Q{wl*Yqij5U&^-b_!$sRfe9|8p14B<3}n`E#MprD%*;yIlWG7SYS`jxK$acy4(9g{{CX2F2Z0 zJ<^UbIOQ>0*bQ3JKuqfL#bqJP9vJ34`f1j?pzprxY z{yDpzbFx}T!z_W8nZ7he%vr_YgYIEGbI?l3MDHSFEY0r|x&DDlP=ZL@7cpX-;iV<3 z%jBHc9s^%)KyiK^lbL%BV`**6##_1%B#!1v9&{ru# z4k9%zBGG^t zWw2>*zj^fG$riytKcovQIc#LV2P;L%NIef-uxt+P6!Tzl=J<`GF5MDX~$9}S7khj(KW&eyHy3!sbRfLg>r;txPgtI!X%Z#!sffM zCS%!L0{d7>O#dGWL4Xv1Vq^@8W65?)x=KfkR$N*mOsZU9dNpBPfr^~P#IiF2q`YV8 zv|me;IEPuz%wObA$HQ01BU~%*G_F*xUWV2MZsSFalo74qrDhaQCy$iDzyc+OmuFOA z7GT)TW7_RlS}EmFX(kzqfWd7I^Wry%*p<$gkcTbaZLi|QEhk)vMsvjXSt8mIcT#TUx zMzdrq1bRB+55i}ydZQ;h7PmL9_nB{mhrkNTvCYE*yKt8KkshI7%Q&G_?H57zObuI~OfHMRfztOJ zf2v?qI~m7QX>)vJpVmt)BF8u6Dfj#g`w~~~I!qW{1ovmoB<)4Ge?O`xgDp2hipzm^ zFmsxMeghG$s#>!h)?>4w=z?Z=i)5=Wn%vgB)ldecneO#G>y ziA|%5wh)ip25`dDW&ZW$3YXz4(d=P)~qkct1y7P8ys@D%Vqtzxt>mtoyiR5BDARM@T&Nxsi^nBYAGF8Ny>au zw93XV%R*Oh_E~xH36N?4Zg;A@YW?QbB(n$J1UZ|Rz5^fGF5R?&_ua85n}a&nTqNWs zx7QCjQ!j^ZYPI2+m8e3UC)E!T>5y&s%dA~?Ys?wJnqB%~OPOx`wK>lED^05452rb= zNAiOTL6i!8O#LtdGZ}sF3pf6kHa}8Kp`p&miOqhF&Pg{D+rMl4Z#c&N!J%xfBA(W^tz`sGZm3W1fUvAg%MN2|v22F^yRo>aN)eNM_ z3aa+abd8ZLnJDX_;+I=GvM)~VsS}sIrEwVT2KiP@e#j4xi3%YPy)>M)nzQy_i3?Oa z+#_{6O!0YWoC$bJQC}q)Cj4eH7Gp8t1AqN%POP(tAw8%2*HORMG-iLg#6he5T*utu z3!)swKPVMQD)2bxyQ(@WQEd2gF0S0^aUtU;?C(RE$xGsky|N!(o1$DEl{yjdL{1TM z2o?Hy43wkxi|>q)xNc?6>Qn;uuv?g)i110tgo1Z6qodHXi$3!q;J}<=gFtTd z1EV%b?o|4{-#Ml~);{E|@XE)ur|xfBQk(x|wo=kl|E-LS{>W*Sk=AO-l?i>Ngb`}a z6UyXK3F8o>LvFZT-HUbFRUyI$y1w8PZ=M(ZB7=vLa$A2(|83eMl4gX3+(#6_=GG(f zsNfIiAP-ijGEw)FrpG9a9JMz6XE=`vbYd7Z<8ET-Y{REnm4Y(1pRx~OK-A7E|_#1yC`joXh&Ba31A94Cb^q`T=&>e;YKSIk& z*Mv_Ua&`@yIjDp=gz^Cz59}KB(d-sP11WX-ZcwChPjFI7>nmlt!aG!K^)l>b7V4zV zCQ!TfyUcsECE8oTiTEyc-Fr;1U(gT&Z7DZB>duDrl791%oo?;+-wiB{+9 zVi6lm22e^NXk2Fw6_b7e7fxT0>-cG25~%Qo*Xh8=Z`Yr+38l7&l_J}J-J+>Pwh}1R zPreY$VB=F-b{(tKnNkH{2;WUHj}DgGCyzU1R0@?`{=ZoJim14{VCxVdBm{RSxVwAs z;O_43?gV$YPUG&WNf;6LB&f0H+QYu!QBuCwl>?mb?6hlNy43RtrgFD7`To!`dTlB_hu zJ3i1hu;6)4d=W?kJ$|b2sVeSe{-H(>KV1 z2>va_j{Do02MYEQ@*c{1uf))3Do@VOCWaihZNh1bp+bsob%*ovrW4b+e+~pY4qLlwH;e-T5}s?KYor+Ti`bO5!CsF=nq2HP1fzMcha!eX#`+xh}67u%}T|Sl1@v41_^(=9p>6TXi-g3F zKQ$f4DAYd&fGdRxp~YBi&`Kv1GbKA)kGBl21Nyk}`+>H5pAdA)v2=xJh!cySX|)&6 z2jDbQQ69(|u;}6GwKH?QMiQ=GniH81$TB>(3?NWnnJRB9p9B!LlY@$BcuW8-z}L{% zB(o2;>F*;$G}Ng8+POL} z+d@6H99JB}Y~Hz%)f;gEKS<@l)f&q(fA-DJdRgo1phx1FmZiL!*0G1*5l%F?j{^`? z4Pz*&%0ncc1xDLx0%)@^}}}{b%M;J9)KoO*6Z`)VuK#opP=pwrcd%k)CBVXO4zO z35%t5$1K%QPVOIHhx6x2L2KW1pv9%H_lp7Z&~>kYyw@{BiFf>#G(!0tQ6npKI--?l?(na} zHhF_!zYmf`cKtkNM_<16n&tjtRKW9=r_okBLLJcH7E#5-n#yZ~;i7!tioQM5B@v^S zl+mzvEBxJ9Fk#F9NQD?~?o4k^gFpTzc9wZdj5^5}Ok0O0d(uy%^Zr<{|EQ{FJMv7 z({@TG+WA*;)8LbY+?5MAn6xj0ka=<7A2TqBic_z8TpO#JjToCT?=rKNZlS)^5wDq9 z+G$?5=?({D0eZD7>#pu8$*Cz_dEV}RvCjS=qw^GrSj0AC<-BFe3kzU+rpihXi)g-r z2t+tBGfYi>q6nKz?O6PZYEZ57BS z}Jj($b^t!~unatL`J+IQeGGKVoYBLa;1}EGQh&=QwankN8BmpM#$=~^TTRch( z*=|WMFg7OS>t;(EcBS9(n9OYg7roo)1Wz$i?(Ch5~nz-~4^pYr52 z5tSbKRc!fd8W@iRxZe7L!Y_`Yp%yTYI7nalv}~~1u+KNCv}_qw!)@IuRk6EbS9{+7 zJh%o{`VwlGJ&!ck7i9B3p5~ThU?S&sD>|Y`E~U=`pC0{ud0LOqTu!PTXOQXuayuP! zoO}^SNR0JBC$^WQP2N!pNk&4lcg?>zMRP;vQ#Tjzb-8Vl&0(5HG(kL4TAt8N%T~9W zfjIcT=ith$Y&wlmIz>iKcMEXU&qi+6Ei_Of#&WfIf9URQg|Y0{bW%!48jTh~Z|TXfs*f ziXV_70-58-vKjLYJv0xSkMdf$7KLd$y%BK?y!vJzABzphvQi->8o-9OJO6%0zdSNg zXELR4QA7nXpqh)>g1Nt1B~&fAy;;)yv#rO!I$>b}KHXbJvc;aL3j&HPB*@|upco7E zvGCEGN5RNj*(#1f`4g42UZWXVeooHs#D*ur73QnqhS%_GK+euOC8|t^_25HF&Z>^! zQsnA)UK<+r34OPb1z#6KmuS(%ZIbi0OM6 zNJxF&4XagZ&O*FSTRR2+rqL54PHt!ko1)l?W9GXvMOgfY4Xtq9mFa%%rQ3gW6|cNx z%8|8IZZuIZ-9AF%Y_|@JBl*Za;oQl_S#0{Vl=h#2=r6{4o9p^IdC(jBlmY5ff7DW8 zVsNRzr$q$qFVnH@{aR1IsP0*H;99-it$(G<5^?BJL3Ic%5b(Y1eM;EbM%CS((Mt<( zbw8Elfn7^S7dkgeYL(RL=jQ7pD<+`&v1Vw1bkQ;>9bRY9f{71d2_v{r<3zAYzNQ?I zgJ3Wwf0L0mhUQ+T;Voh2^Xuyj&rAsjzrP|{Z^(%sTxE~IH9|RvBxuyo1jDq@Edttu2Plnn$uAAI zvhAJXJIwhcmfVeS7Bgs*%vRnF`pC^gp!OE1N>A=>7oP^!(Xfz z9*oM$+nD@WLh`~14gFwboRl-O{w8Sf^7-U3a(ee@5&KX$g&5@31SRCZL_5KA4J=`V z_Vp{A={CmuR20cX#EL8Go9=@kzrXr~qF1JKwU_e^2uk2{|0W2U#&pkMy|iN|f{L#b zo_7D7+UlLzN~N`O${ozsul1H6W!*<{J968;(>67t<2Iw0@xAwn#kP~$z1KB^Rn#8m>Pv)s(R=sWrglcGW<_~VD0ON=?edA$^aUK;nD zUrogIuNN0v1YN(owURzV(vL`w=}rqRZx)8ymN&#ID_$|`xf!yID+~OJURaAt!Jmc3 zcs1qN^Q|*bB>UfwrG-ZQByM=z)BGT2Z*8j-RC{je`86C1I{qR{!d%Y~KP6NfoYrV! zi!l7tlqFWOkmBKb15U4;#K|U)ixAcWygFmQa7#vygK~Rj6BS3Qny(k8utSiRG03v6 zCsG`lEpiEcIO_^j1I-2e-eV69yDvoVl@w4+Q4)SIsBf$UQMl67xI;A^Dy3PV^h2IE z@Tm)*(j>0#3ej}ArNOd^^$!WhkDcgL+$b=_0{cL`O2Hnz0ch`4Jzj7Kk~A2q&t5LV zqB{acO|4#)ZjU6@K=XP%Fw>8PhK@Fpg}RQcoS#rvu1Z4I&z_E9uzZn>$Voi?P{qi% zwb3{hS(Qc6Fg->Itd`tVF{CGydKQ7mmund)CUX52rf`wjFUkCz2s@utltw$4>er(YXOB(l zC}*eug704#;ROmS-IHjV3)20j@x8I7!|IYf46!Sw)0e<}twwN^|3Wiloz(`t`LSiL zB@C2g^}V#=6n{>Z9-6g6E4rci!v_(z{2tBJ9NH(ltwirlkNv}R4OAqg@^eLQ|JBiQ z(}eD&STj zhyr;FFpDZ<)TYwU7CCE_J@SyG%}p2w)%Yx)3W7}-_fX%>j&Pt=*?dKmhCfPFY^x(% z_V8K76$A+zEI36v%N^Ua0rcbgi&@g)?DB2X!$EARwpmy;geI52^+Dli4-UMh2wW@t zU>DtQkx>U42iVc-=C6b6UuN|3)C1Jixk+2V1W%bkdM#Whi&;UM?%}ZBux@b{2o?kG z>~TZpmg@e~;0I1~zQ;d>Ci$c@@*wLbHir`>1hkgokx)$KSl3WABQqw?37k|DZ=XFu z-UlM>XOy5mVqLsxmQD@*M z)UT1>Bos77Vo(KmRwE?RQ2ME*Wf5qDV3Ro4IlNz? zzP*p@O#8;Sx>Nk3{>)s({}M{B8ATsre*4Yz&W4Jr`pd#A{RCqPFwaLYnO_}fp=FqL z`uQSHY0x)EBB@H859+{Z z9qDy?*Z%98Y9xRrYh0k+$;tIIc2u?^8Xj@qo2CsJUBz4PaD|Z|i0t*6-8Qlg z&5CYl36GW$dHslzry@Q(7^SZHr!N#yQ@LB)GW7#lMK^g4-~r4gSv=#1a8{;Q(B;S_ zPs2Xq0E@v~PIpTg6Vk>UnBzA47dYT{(g7)A_YgU-K5^T8YE6PJ(=9sc!bCFEoef^l zA1PjUjJrx`$hK_a8BJWx1KkiLaP%0Ai)=8cQCH6#LT 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 O0E7U5J)%Yc;Qs)Z%y*ms diff --git a/core/src/test/resources/indices/bwc/index-2.0.2.zip b/core/src/test/resources/indices/bwc/index-2.0.2.zip index 2f77405a8319782becdcd2426f70ce8c897949e4..447d37255d591a5b59986a8204d93f2b67c1ce6d 100644 GIT binary patch literal 86936 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/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 Lf%1VnfAJUfpVNE)xfx@9 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≀ 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

I^Bd`1w3q7^L^A&Okp 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�TmLHT#> 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

~fJM^7W)LYDtL9>+J8engeov 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 diff --git a/core/src/test/resources/indices/bwc/repo-2.0.0.zip b/core/src/test/resources/indices/bwc/repo-2.0.0.zip index 9605830a12c0962e61ca50c29aa0b42702a8cb87..60b01723f29dcca125f5426c1ced4fbafa9729bd 100644 GIT binary patch literal 89087 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

XM6gI=t9Krc3|`e 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 Q6cE1PWMDAo2Nt^w0K4@!XaE2J diff --git a/core/src/test/resources/indices/bwc/repo-2.0.1.zip b/core/src/test/resources/indices/bwc/repo-2.0.1.zip index 305820877bbaf14a2ad76daad4e26f3927686190..44701b8df5956ebb34805cbe461bbb438d213eff 100644 GIT binary patch literal 86724 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

YUXfZOzx^2Vnt{k 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 z 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

!8YQI43^9|8T1=p*1e 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 diff --git a/core/src/test/resources/indices/bwc/repo-2.0.2.zip b/core/src/test/resources/indices/bwc/repo-2.0.2.zip index 696ffd939d59093e61da55a96898e4431639daf0..eab763106f718e56885c058f436ca50fda0643e5 100644 GIT binary patch literal 84789 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 literal 81369 zcmd43byQrHs3F^;ZUqa%?e<=Uiz(Wy3xd5FUSv1t& zLc#i;xM=>l+`W*Ypy6(zp`hS!em|)EKR#}&8xw*5d-TtR^j{yhb}$Ee{VN;36s`^? zPOestZmtykdK7LzS2rUz3IqTDwhj4bZ>^SdYT`y&0f2#5=0Z3PYPzC%&ISnB$P^pDK` zw>#1N-%;j%C%ppZZ@9zuZ{0af2IXdvs3vC+Ch7k62b`9q3+e6c{h~ypV?`OW5Z_0n zR?x-K)ZgYO3sSpQRY2WFJq=z-Uk?!v8r8 zMm)*4Iu1lQu;ZHqA{~q$?XxGE8#xa85e-{+j{})ThP&5dAKKZ}emW>pj@V%wl(4B? zm@0~o44leA*uSl3AtZI`BZbb>SN3Q=S|=B0CV_IjI1?Oq zS;0j)Ry=SDZOVX#LV!I>3_E_eEzVcA!Q0gs5jhPUnGi2{AvUY56`R#v9 z6{jaP3z)x56|)#M6}{h61sm>fOcnNjHC5a}GP3=~P*T_m1IGmnAxH+1kvO>J;>~dj zCD+M{;DPWkLMIiR`gPwoU6Jn+av*V}kYc%ftnS?mIBXO@pBA`5Gbprm zi>sM&Z&zGA;$P1ratn2sR%n;uIiguF&~uA%n6YnHXg%Uy&lhlu_%W^YH0heI5YUr5 z%<6H+;BV+ z_+!og=h5lY_R~y1sP(;2cemHW*3I)t{J}ZP`L@gR7f+9;=Wjbb=K+D~9M-l8NlnS<$2_jz7K;NAe>H5sRk47=8QWXho;u zj5U7k7{%_R9Tsz$+&74rD0@4`Pxp!0x6$M}kFcrwJB8<{W}@#K-km{K$j=R4HrBF{1XSylx~|G`g*>qVuXg3`9ef~1Y~&f;S$ktJrP z+>IhfI_$2$<w~cQS`OZj~Gr-~s<=wJI%s3hrEp1t81UDt#ZXlL< zxDtzqs?G7dl&4=E+@x%Bvfbt>({N0B_M35T>SWp5XRiB_X%M@nQ`cv}k?kTIt zEahbI-&Tmu#r9jgEdr{>w7>nTPLintrimz4IF|P;twnuwT;dvo!i_uN%70hy4x|$L>sbj7^oSpTdqVh6>yfr zNUD^RVe-R@z9}S)UE%kAkyG14{&7mUd#UOezT-p=+1V-$I@=$Ct>#5Vt*c>mV4$Z>SrF1uqX0IrOWRyFdWK>gM6>ffLvR6J- zJ|P{{FA5v#y*($=aOoY@Rz8r$IShQmNz-E-6k^cfXA1p4_oflbN43^JvHT4w{w)yZ z{yH0l;c!TBrX&k_pAbAe1xG;#} z+Bn3M3`dSz+V^c(|1nxhXWx5tSFz4uLs=apiF5@*hWF7FMhQkJDJ(&w9}A8mbVog~ z#5j=hhSSW&ZtK5?jaCL_p*JV*u*@sls*7KP$osPJlpl_)K8Z2!38LqN+t94!1E4j= zE?Bs(>HjjdJQ?oWAn;I7E9ieC96bLj91~gwk$RFiIbZ=92M=tX$GIPYJQl^)pKc3{@jmq#Cfo|OHk-JqzDx^d z7PAns$a{c%r@sKf^H!};mN%EnY=dlKy;HR+&wJF5vYHR-EjAi9)5Wy;g~kg?spE<_ zp3-u$gL#Fzl{jOiK_pQ_l(iANAt~=QO-GW0E#A2n9}^R*B=gPJ647O-q7>QOUm)3V zV35w_p9dj~mlaHrbH&jfD6i%sqSAcM58h>)#}@wd=>``EU#85JRaH;aSM3NFN5d?_ zX%$I~^0Fy7+W=`P{S0ia7jU_e@S;;TpBlGj6Tvvc`N-IB3=+;b++xp43 ztQ&%eoQ}|%xLbF59Q~WVQh6edwAd=7y|aJj>ClKlCoVA@$+Wv7*+`((^WBS$G7&F` zK_RplNTohyhi5pjDU9Jx9B`TVq;V1xGeAvTxa?Ce;vrI(<-c5|9;2xfV$U6Rj@d}~ zxuN-{WQWkFQMwS$H_XZ>*XMgJ!s?l$9_n-4;ho^HO$$HYi01qw8RN0LOEJ2P00vx} zs>}v7B>0qK$6~B)&SIelR%Kt2t5S=?sA?=7Rc?bZv5mbX!W5k%u4sqTAeAqP_ttp@ za^#>G!I!;z16S%j3gInIZ*L$x$Gu9Fo+Mxy*ieWzH~;PxrX=I!lRmc$j37NY9~vUz zKUdE0jSV|QDCaPBufHEJ!KpFq;O;+N;Zte2VgabjyF$WNP1^NY)28wG)_^M93K=+^kQnnXE88nXDm}nXF>(GTCZ)Ol}Mu`tWV4@(BibF5cWDy^y}rptuj& z7an@9FD{)zEZo)AZ0q$1HSx{fT(CKhp?uCpW(A*}0QO3NS-!_TmX?aktv`NIj^SK4 zKl0YURLi01ebtofC}G(d0vKb(gS;}nx)UybG?P$?EZBjQDdQ~f^<|e#BGljts!&u# zlCh>r86;c?lG8Df<}#MGtI45i7mA+wg)U0uyOuj1HDnS`$}0kA0!NLGQ-RW-h_zk+ z==by8s*=qeYa;g`H(9o$i2!4?%hz&|Q=5F}##PU{$Cod@dza>CX_D8%ED5`5d7}gD zZDFfZTT%mzK{O(|P}#6tG$Q&?l0jjy-nK@~&ru@n1;e48!v~i;^qnGfDVl5x-Ko0$ zUY*$jNc~+qp3Yyx?>?PxKi6D7iUaI;wLcG7rNcVL!Y*(228M;=v6bv$LMNek4Z&)A z3|A>gr-|c45IYYyiGLRJBE*WW`xx>8t#OFSm)J7?A)w5g#MX`qjxiU4DemEZti^j_ zZ)A1%9{(qUsho>RF0$vB3x{{49$PZ+gtq#;`3B?8+-qQMg3zkBdIHk3}(HDj!V`<{fr@&Xw@M#}MG|q<|@7@&pm7D#gpEvl`qzj@Z9q zE;|SQ7&30pgw`1xcU_Jj-nGNn;PI)=$P3d)fsSa)YR%P04+oxl@ILwpR`0sx_FHK$ zY}BLgqCp(&HB_yIfVl$A&-Z5nb9eVfaGpX$?zOLyTM;9yw_g4YJ;huYer3$_8#Bwz zww|6!jz+J&n>pmUZ=5?`jc~?k$)k*;c;CMm*~KLO$PPF}&++UrGU&Q_2>hS>6u-*f*cf>K)y6QN`6hv6F(s$xM|UHDA+Njj_nnWB@Ba4_cN;H=%HMFivYVCtj+VdY;$O|3 zKeaEQXP>{koOuR5IyBr=&(@AsB5^qOEWY%|Z#}o0lP*-PFwYf??dBjs!$GRL~G$RY9lY6G288w|Deh0j?QjBbn;G~t*Vb2(o z)bZxjifo9ss=)!K%;-~(R;;Ab=+Z57QpTuWJupB|q$F_f&ghO524}4*r=^B9mGWa=Dia1l8xNF0i&z_0(xv z%cy)y8>NWG)^!_}D3_Knry7-@prFLWj*5(x(5Iqc$9kJ6y+(3= zizO+h!-SuYn@EKT)bA{+d1PZ6NA>pMiWLaIF*_P4SK99soSI*6pK_xjpHO9RF@mPY@milpBO*nXmrh!?n-Yqt$yi|DxKV|2kIxYuTRYVDWRSN9^cqAL|B1 z!594)Gz~+BQA+mFF$r%8DR24YkLJlkl7CdOKPv4%)HXUL11<7DPciZ4l8#fc&S|mb_HkPntqqro@|@QtuBE(3G~J&{BySr*%rOmE6GR88T(*YEb}Fr! zlGZy}=9S#2-6|WbJesOJWp)}obj;RSYPgKUHVb*Y9i5UY)eSW8COR@PA({i>%{$D2 zO!PJL1>)+d(W8;EqwFdKi7EuxDVPK)&VN)e#vfJYkE#P;pk!xYlmJRd0gKDzx74FX zBexk8KHF%NmqjaAj!I~R>EdE*VA^Qtt4o$?yj8)?*QA#GJ*WYwpqQ^f`qS5lu0U+A zkX4t&X;nTRMv7glSB&0oxmu8z-O!y~)QmbDPdtZZP_;;6RLE;_TTp%h*psO&q%jOM zsZn*g)UcctM16f4iM@v;ji%n7By&4x&bK%}^Pgq#j6JHZe)2xc;AE6gXg} zt_V=n0cC9x;oiEeaM>h3S^~qH$5wYEjI7gGP>TXmIg?L$Ms@MDQn(qc7V?13F~26R z$7CBi7`Ll)dtSRAzD1k`zCu>dj~)GQlzM!%I&UBEHtIKiMR*F|Uv&NK!R@j7{^Ea^ z{j=wF;PHI430(2F{yXb2wOAYc7-ir=6!EHoqi(3jg<`MqkF1Px5g&1dQ|znebd z48o?NRjA2aWA#qUq-m9>(UY%FH)fkLO_EfKF~sX)4v={t(~bAc^h*z=4&RDx*tBi{ zBW7ryhnqoGpPOO1(A+mETZWr@Io_Nx$v~Q$Y}q$C?8d=*b+*1(M=m!Nk9l2(u<^#+ zdPr8ay^hoPsB6}vct^G|MTn7Ev%Qk@+b1Kh>0GUz2gaOqL9U0TUGRu2NJ-u>y_54{ zewPDebUj)WD)})+5igs$UE8hs&|+r2AY#B5r5WFXZOt@nKsrVRuaJ3AJGL3$^7%{Q zjr39cEMYODta!2^oxL)D9;fh;@9b4F(vjQjZc&enEvSYDRlx_`#CBvn+nFp&A5iW~ z?_KUe?^frpdGDstSPHmp@F1fqduy}(0Kb!_~P|;PNqEIT9{*F zJAFVi#vX5#*+cuZiPy?`c)M=EG2Mo3!nAz=B?gSw$Yh~6UY~BuHnr`)ug6rUZB;*P zT0ejlQ;avpl&V*iuts0iqz$ZJF^wAl#H{1_GX2yguIIH`z`*TPd$vGZ$Ni~u+RAHO z|IIXez$XS3kBFID$FAjGphY{j6>Q8gW05prp1Hy8Z})5ErtyLK*&bmDrHR0tV`*P4 zW{SyB$F1(jY7vK^sT8DOnF-)Fuy0>>YdtcVn=471aE|%z+_zmcKp!)QXUR0Fo7Gs> z!t3Y^**w)hX7wN@|V%jxYzPOcbQJSAqK7B7p-?_Lg^X|u$3QY*0y1op1I`*{=Z zdCgsy_9G`uGpV`d>{FMST6IhsXKTnA61vFJUMCqc7r1ThzO9_rEn7E^S+q`&W_EGE zhWc|q+5?ud8p~Vw92+Msx+V}Z@AkZTfk-V(6J(LRv)@cEfu_wDywsQP3~SaR3e z@$>38wVAsv??+E)WCreLOt@zfar4+aEU&e+QQn%lPVIM32w(Q@=TA^(4sk2l<*fMG zU61d#HK~<;D%)H?<~g}C0-v%Dm{jz0Mo6N?kl^u;yQd$pY74o9lcR}~eBwj##NT3_ zHA(KbieN)C1B%kcy5gU+LQD$!{UYGe=144f$KBHR<`GGTTNXu4TKb72e9`Vm6nV4U zc=w!EwqpBrB0eJ>5R>u>y76v0O>ZUin?z8eeI)rTgGxv2S?0le?j-sxte-k!3{8u; zhF{WR-^ zj2-h_geA*|FkQx%X+^fMgKyzu*4FXnv^N$FvcEntn-ptY-Q? zdoM6=j4TZT5ZC|Ij^auH@OC07WSs>jkGp}-*oXE$j~S$$0R;3t+G`7m2N_OXmd_f7 zfVE>nY0rRGeTNQWCqB9pv8{wLlQc@eM}yC8`mSw1T>AHZzmU`6LP|5J`J(R*K5ys+ z=8sXN4FKfyQ%5sYwf7s=fZ=1ZX&Qh^gKuA|+;t8bx)DambEA-m^ts#ZT$WE827r}g z+-W-iT7AXQZ7tqCmzBNPF`YD5zyjdF0PscM?Ll5vJil;=GHnQ;q@UC7cX~Cx*EYtO zrnHtp5h0|C24FD|azEO1p4#gkgH4OL;`3&@JFJ`@DQx`sF206zU9jEv=Hl>ZW~{LF zqj0zoy8;5~^9KYklpFkAwk5O3A?0)TWbwdo6Vm<?NkiuG^rUJZO1$OMi0Q`fv^VRg%@T)Hz0`^{=##>PIX2T3w>~yXic=lkoejOxb{f^Vx^^n)l3kaHnbr7(YR(C)na+cWo0*{E6P~ZfUE2&Ma-n zA^roY?}uOaH@9uuY#+BOhPdKSNO=SueAceMoH-Be)Fj9I6(D8%x8J+nww+)0?&RM< z#}APz3FdUCx}=w0)DLmQAE@35b@}-``fXqK?Gz7{l3wEqfe<$5CQ3V$&~vp&N&NVK zxm|&e8bwS}r|fe1gw*^?9^~)9`I^;1iB1%WkE>TxcO!e}o5=)H~)LfqRr&f_;uP%djcwTos{0|CV2NpwcAZ zeq+C7=@cM$UC7t(=daW2<#X5GT6&lCBB$wt1f}LF?_6Y|cm99}{hvDfjcb+-eMq?} zLY01+k5!jCCykSqT~i3TaY@wS3PPFwE%$3zd`GUM2TfB1xs5^xPm3yOYPb%M#6S7A zUFQ$dr<`-Kg?RiNWI+jg%nE%68B^{$@X(>KpWytCufg--N)bUvS978wr9qR>1~Bai zZpeqE(=2&`y+J_)4bbp6XouL-Je!}V403&ERs2Zr1*=3|=uAucD07E|l>Bmj`JG;m zAGC2I=DrhR@wcGAK|CawW;8bL%?o;fMux#dU_#O+X4UhU3o3>lgGqf;g{VzX$6)N< zn-SD3s*u>P`cTfY>DK!*hy+>y)&u?&Z3(-M$2hk$Fx(7!2v!j;3k9E)mBQG(w=8G| z+HCg-XAmJ48UH;ixv^<)QP2pq8cYd-JhI_OzAEK(03)}tMK99>E9^epIBNPkCqSOA zkbF1?v?c7%H^hj%_)c`2PQ8gih0rIvg__#$>&T7GdP{;Pp!Hx{5bTh>aHq-5o9E@E zOA{u^4a6J}){wq1yJI@>Y#J)N?kdM~A>F}}4%?u6<6qEiI`@KtN}=Ds5d;l^jEcqE z!`;x22wa3V#d-&Vb(w9f-!{aOs2uQ(1}az*DOCtC?+2h z(+p!m)4^hAH1`29ezrHCr1{? z3%@}-!k*sVnSf1BE3O!xg~o^N!fg(E`hlU!9FEbzZl0pE??X7knwD4I zh4L1-&(+&0d>zRb=O@Fdn$>VXIP4WiULSdQ|CP*Wt#iWwJ+T&VzJ$=t>mi3x(U1Rx zw#$*A1~$g5RDY>0?4ul{MVuPOHRUhm7atr(lbv9qQPBer@ma&pi@m=LXO-T z>*%b#7dgtAa>T%)Zc#C=3a)1V2&@@3VpjrokHVycGsLLlRi3IX*Sd%RqefeGDjMX0 zZKFsjDGZhBnw3>5I+ZTU)tIR2LNkH=p4U)jhQSOv8hSyXQ26T1O z3PIJjYL}0DHKQL=9vR{_y8E$HY#A0c9Lml}4Wq0v`vD|35)-wnl7fNW$`OT)b5OJkW(X49_Auf(Elk=z5>B15%vgl5@l%AoDUxl;W zPRk%kTnFJD=VvS81>TaG&pU*)oQgJCv%J;LQajOu8gaISi(H$Z1{LC_I1Ob;5c!dE ztOOVCwRdz-u|$a<>Lqrn2KnM_;;sqbaRO}gXTLBtGbS+WO-oK|I2r8(4~oZqB#h@O zLAF3NKSCTtra`1ZqIvrZ837Ri3E?e5Oa=uE1OuWBVTCwB5FyeKI*1hnAEF&RDGyUNZzzH1;h%uxx#5Uw4geW94 zL@xvsq82g-6T=bG7~&dY1M!ByLnI-Z5N?P^@B|t}5dwfXKu95m5Ftna1R5e5+)oZM zfnY*ZAZ!q4$Xkd#gal%s;wq8QyO*<>xLMES0)d5yL-Zkn5I+b^@Q@gU0%8imf~Z2+ zAubRkh%AI5c*+Js2+@V`Lwq0z5Ge=^!~&8^NEs3Y%@6C2aD?)Wpprw;vS|`O`;x!Q zP0Z)yX6C4JPN}qKQVlW`Vi|G}q6F9MMeap^uYLjEOvwwK#K_L)?|1uj@;iYxb1J1E zMaygezkz%Ek=x=?{+ya+m?9pfyVMcWyiQT0wq?|$RCY1{m|NFw{u6iZ!|?@hDTk3| z@FZq-A^(uuOY{yut()R;)+}GOtJFc&Bwscozm|K&ml9WlgHMwR*|hu%{0HuUL;d-- zqD34`zo@Z>I(O1T!TGjgSG|MJlLpzo{CDmfn~9TV*%SPFZY{@lbIUc2;+Cb8fNYjV zJ!)$;4M|ZSC;(5LzS8dCnOaAChMifqb^9%4KV>TKB2`WE<8~45T0eCX^QvU!u z`yD@vyHJWM+o8?$L|(^f41!T{Da1IG9HAfe6Cn!6A#i#%FJ9Crw034HuLpt^T8uD; zl1fy?s%_2s-8lGnN|h%Ub*$=!jq4$Zp@|5EC{jeRZ1}dUlbesRJn6=)GsZ~}rqE>s zSCoCiaSmKH{iY5`4B;0FoCc+|04bdqNud&ngW&*?{ zloH`1YCtbr=neuciXveayS8QBhH)rFDpUdCHE{w#52c0Bj$_H8uHU#60tj74@HLdf ze4_nHc*^kw=mgm;fKZ2yA(Wy{;%9N)lOLc|piUC4v3@aiTFA?l2?RmYh|32^ID&*| z{1p%~P}m9VX4i`%WRyULG{XBW5R%XiggcZUM1rhdRu{vY^$-vtRR~f*pBlY?s3pP_ zs!(Ep@$5)Zqs+VCZzqI{Ge?j^(-3lH7g@c4(-8BX5krtaP2hww$b_a}K`K3#lK{xR zVjer94RYq%7v^|I-BF-Px8q(mZCEhR9Pt2=&_Uvw>~dr_8%YU_jwC zG4gnsodZ~)Vwy4e)XXYY9qWcs^X3skP}KejT}Uq5hZ4yc@FPQD~_oE2=%K4#uB zGNohNFlpX3f&hx6$&@DruW__FUiI$26XfIrx~%NRj_80~X%=V>6aeY^oZgvoG--Q0 z=%7lPMR|wJHMTZem)_mHWz%@wgWs>VcmN7HMGPvaJqg?1P=8q+VAO&qJM=tNwwDKX%p|LP{4{R%osQjP925= zQ;&_n8PXuKi&o1k3t*cALr&$DX|Z?BL)PS#d9Zh%+3r^kL<20Sg&S29bm)hxa4a;D zI2a|tDFx%QUB6{Y3n}EZYOQaLzwN=q(9m$bj*drwwx`a+Su?xN>6_9C4(=`w(V??g94*W0hZx&Mk-bEyv*iIAwcWHuSe3fH&iNek~t}_RA~&Qwrr3 z|0z52ivJXlyy8DahNhGXq?R;7{~%aOSLuu)2gXio##+}ddd$UZjzmq^|TV; z(KRMKR+(v#Y$RN3sNxV{cox$B5Dq^u;C_XS9CK~+>egbyHE}x4*(g3Yj;6rjIl}~+ z`=OsAhL`UNmS_I(VmM7A^Q(IDa2seu+M_v>D@Nz4VN3Br=dzY9p0lCoZFO ze4uu`fy(@>DAyw=P)kl&R66xe&C|YUgmadd;HZ%32%F%D8KqFuN46Bd_=rB++K=Uf ze}L%m*H7T?NqHm7l3I?rMexzd_>H^8FMbYpgJ)s;yhItC_ja$e3QeDzqI!;LuV$;M zS=LRjW(}xV*5R&Z(K6CfeR4E1av0|37H8*L=jQHa=i+DQre^1A=jP65)sDUQmye!L zZvs4ggax{Cvp1#`&n-*u8s{GW_u<=}SS)V`A0@4#(wlEJX*sH%%2%aNoRs6q7a8mK z&$+DMLZ;x`zDMG`TP>H^D;hzX+s#qgk~A;?t?Pk0Y#JYTt-y!N@}N5*CBX*0 z4p5M(pHRNR{!mnAjlIyDWIp>+w2gQ zqzbI%)zs$L6w+l|6yI^X+ca>=D716jTH9FZ7R%(yfik$QS4w1zqAfVj7Tu&l-R#-3 zZklub84batb8d>*4TioyC_2RbXnQ^=w4z>Y&E19_JI@&Oo8gvfE6% z5SBbz4NSaov{Lx8nSQ*GhDYph^Hx_5eLA%1vy^r0w>e&gX)1-ScR!?7Br>g$?ThW3 zvOT61ZDu*o3f4KreXUr|3ZFUkCQ%5h78$x0evKaYieRCjQFF}cmBe$=dgQXrp&OCg zt8}`_7|nTP^&Z0T{PH>q|6nE2kTJ$aDl*Lyw}B{q402B$&G zQd))1&3d1kuOQlY-iS+FsjunF3KD?Br^0X=jvAHHgO-hl@91Gumk&z&`US*nHiaI# z5+qLU@0d#*M%9Al8#cWn^shDpM1|m~#J403H`|@fQ$J{BbQ9owIrmB*GU`?wpi3<7 zt)=QD98Ie1EWnl&#V{*MpioVylcr`6AI4GDB)4GMtrDLOkZy-70EAbG>n=^-gx?Sk zvB1TIhETfYT#P$>L~_5y@*XI|cOku8lERQ2O%rtMvMUNyh!l8BG#HGiKBG~7=m8@K zr%2@&qc^MRXjr0d5<=CWua^2gh80Oxb|j%P1${k0Y#N$hI^vL(B)`xt_Ve6Zewoq& zR+j5vRs#TW{#CQI)7B@!^D7s>JrV|fNghp@w@PIV>qcmWtaSZbCX42;6K&3k&m6e> z15VL`jC{5_7U3Mi41 z*}6oOApx7j`X^izT?erCFgm0GR$$Ap`|CLb)_jNj2bc)+6hj0>;Axy4oeA{}6WX@< zjMyGe*LxrR&2!bbk{U~Z?Dy)bh_^~!jyS$ibl%VPO^n?wESIx+6lPw9kt~DLQB{#? zoxK%s(U0L+E2>618t&*h6h!gttA5&*w@G#V{i~l+DQue?GITsjxTa3Ez-L$iGspac z^Y2}6=2vu+`&y!n;*v>LKB(eF8=lhZWl$&Hcd1w{s0ZS#=pL}wB9vEE;^d2vlY6Z9gZ@y_R_VD zXO_z!g`XGMzM2mm4LIuCj#b~MtiS4fWE65vbF!>dx}JXYXL-7~BUr5wyt+5~pEQz8 zkLJt2O}FIxS2U7;aBKfQ-STsArZ8!V;D!iGF;m(f&gBgc&O_2TOeAX|Qmnb`CQP46b(jqj^xISs_$e{?y8^!V$5<_Z zGC#6mZ{?k32XXkqAeuc<_+6_TQBe z%r)g5u)mq7tbd1nYVvQxar&R^Q;e*PoXiZZKV06a|Aoq17-Wi4B{B||1UC~)EdMY- z+#NN7^a4S`T+@jHM)?5Cz3Cq$#a<+%M)=B+CLbh!BakR+@PoIY@=<{)Swz3`l-Ly6 z#&{6R8#^BPtOfNc>8XSdJ=!ewbbO)JeSJ(D<6+gjJxz3cDO}8@O}wGVbZ<1q9jx*! zt;#Hib&|lDy821!dcC$*rZ&cQ4p!C{#^x5o(3<{# z722Ku--XuBYVuELi~rw+Hss+_py)4@>4jcH!KUBT^ElMMK?O7WSCO62Qm`ZX!x1J~ z?Pv+T-bq3@7^1@6E7d+p|GE)L=OC>riP5ft?Sfe0eCBRjfB9*h3&|$2fC9G}7t2Oe zT9TpS%igCjA6pG)1m_|c!hB*3ELC(o>9RD|#*Rh<+6|gC>1^}6E-=se#BcF!%(<65 z``n|!LeB-1@Dtb5SvYRK`c40Znf>uImA|Lo?A71tHD-@zs_Tk0oviV3=~S(xgmDjC zQIHx3E-;z=Habc;6Vfq{K~-oRE4azybv|$s2wlp&&c~vfNix2_n$c}~4>;GT&RPAH zRPpl{#JTEJs<9gla}yfLU*Lh@o))@v3O#3r)7^-l>_?!YeP4S3` zPGzo23gE)=KpH@u1l>Ph+1w~0m_CUbur`_2JUd;Nj=ME4=(Rq7!tUkHNf~O^hDqR7 z3S>>_hA$|u;zY+<_I6UIsQs~}NA?Y>&i@`7kw-)<8KNwe6fBPlGzR5%w>@6Fw=a{n zEYnxtD5_L54rZC+jS0OVH7>)m1(`tQ*_ZNZQpb`2eoViO$Z*=hr8B!88b2e#8_RNuUW z)X*U#@kw{n&h8LY3{GU}lFhLO5w}KVHG3e6Y5Bp4^?$_ZKBA1gx0c}XgCjxrhr48^ z86I7Txv;(e@bva>+N5i+!KcJHG$||0q@jv4+sOy&DYT=0U1~FZyW_(xD zC$eux1WzUza^Ys*H*1hzC;KM*k)m#iuzp3}l5RQ!Yx{n*)Own3T#xY0k-PbMiw=dj z)lJ%D){E@A1Gy^Fz|1@^EVmh18*)#!>f#&wO1i2S@j)&t9ZQ8jZkCUesUSA&hzFT) zBCjgUm69IwprMGRI5GKyd_wD!fQwHSteX)Wv*j~vWz15ho62J8G`~hw)++8=MT-Nl z$tIoWl{5|Ipbj~mYm0M-H<;2$9iuQtIo(~j1|MWG&T7V<4hMylR&_29_az9*aua5o ztQ(Gxw+@w3#)B3{YndDPkj zdjSjD_{^dy3OCn$Ao$BXWF=&<#s_-n!&6v<@X=P9K`$BuvPdLAYK@@FMlxYz^Xu4$ z$*p1OUAPOTZF?h#4$ns9L7^2WMvARL5tNJz=SJ-Yw+ih^@sWF$Y$lXb^F|bZ9R>7K z69i-xi$hGDE`u|(qFni$DQ3z?k0FLGkOA-PON4JfFv5)i4*=R@w(lr>nJ;|rqVS%_ zA^i4{ZA&KOQ9^zyRF?Gj+q+f5kGaZr=JvIAVTj8;{&wGa2zoFdFR2}SevZ^ez5Zn_ z{E5U(((=1}MBwifE}Q?WweSy~nN<0Yja&6k0Z#j0s+F<9@^b{eL3^CAusdR8q1k*w z^eLDM2D}kU)-E=N73GjXI;f+Ec!XXA=;qRV+jue=U;g%=(n(F0dA9KsGQKqJKk-w{)l!)*XjB)%EF? zlv(CmVmMm#ropxl(M;M@SQc3h=NMI`X(wkvG)+wK94-1Zvy60;vqm#g)pWBU@X4VJ z7CfBO9GvqUyG$eF3d{hRapp}fPBt!9Zk{Gi4pw$Hphb+5>>}f&`5ToH>vHAxbQRJc zTS-p^^Ej>J^I6HJtxpAOU$MH@o|4r8w2PYw_nS~!T4}I^AR|^02!z^V{hPJV2?v9r7AM10N34Zti zO}Q}hng4o^@J5y*cP-W=9nET1%qJ87S9SUPQCN9h@m6<(u6{NIHstbz+x)Lo#?|8F zl;rh4CAG)Q%ah~?f&oD}s9K>-KSNkNdbveVCwJ3PFHZeN8*`G|!kO}+Qq5H}-0i0v z(vs6<`=ZO+GIG#pbfvK&vZfQNx`;4gP`clQEM?6|tMfeG{5UPhK~<^MYwXlR=u7{G zeS@d8C7SnqC@g7an9-4vtL1W;sH|g?vrRXiaID`%_Hc}RS5^0NCpzL5%P)jn<`TB6 z4GW;FB)(afo9a5ei#OyZ6^gYZ>ERX*{L3mZc`7RKw@)>e|0+5E4^K6p{&}jQ76$)5 z)sW#7qD1@2SOC=5ki{CAO@5ziLXjGJLTx^aapBNRZ9y+|LQPD=MDiXWmvth=80wO$ zWAmVgS&Secl_ZPsKJ6)|RFgrF5I=6B&;P>UJW(U-3xQUCfJ?|U2_ec0`9_z4bQP0- zRr~ui{~LOXuMhPqx6=Nu7yF-wJoocmXX)PsWYU;_10Y)ct8j3o%AEE`>I^grIB!!; zZu35NpMS=t_0Xi9{IMjH#XD(XNl+eAfjEO%P==_kIf27w2jo;v5swie#>Z=xR>p1q z5UVVJ`=*5CYb0z03`2oPu^9E&SE%zRncNM5&hIB(cP8<^563$x@tvx*u>rgFJ^uF# zS^;)$kB17k1uO`ppIhB`?*eZ!djfR*=vYEt1L?IkjunNT2lZZ`Gcp5kB5U>7QTo|SHe-Ku&XD{G&(BZPEh0(WoUzs&Y1A-|uiGkR&e zTK)cT^7_(p@USxEQClvU`mHo@%QIllQuyJ={&}F)#gE*kjVHz3`^npum#a6zm*Kfu z-4}C#m&>(VwH5)#U7p><_uCP#x0%xiFF!*)U&*cFx^m54cCgLv&su9%;9p9OZ;S#i z23c&?Y6Ib)I!{7hpZH(bm+piQ{Ll2x{SJ{G9bb}I{eMnq18;`DKh9$&24wl{P#Qfv z4Sl$IWPW;n^}fsY6o&PGM%V0l_cDHd+!c7+wdK2X9=Poouw$v1eW=xQ3446b{evao zxb^e4uYann;DwM&%m*)?MpCCqDOCIBUHr>fqhZBYRD z&@h@tdJ6z$woijB^MTD90_2eHmi1TtnUeO7<`+av>q>r zau4h53Erec&?&oM?^!_Cfq92Wm}04pH&Yadn$3UQ0AB{a(zT4BS~lvJaqsHKsLEPn z+3{ae!Y09qgV@kW)(8Xym@(fqt|$Tdkf_bN2Iyj+9$@^Zk)f>jmSIv%;tn&+*rz4o zg6)Kd6JmDwfer_AGi+Pib_c-=89MaAsQ8B1NzH&aYEyU#!QdGW4Q;J7b+sH_idE`RcFnQ0n|@VPs&un203sI%r#KBdg?KHQr1k}y=4W{E z^Kdz>AV?Hau#awvC;)WOC6&Rowz+*hW*t1M>$CPG9Q2BGWX48tyZ-TQO`ex8S<@VP z)|Uqfby>g9uu_=fi|va^KhgznxPBFU1P@@41^8^v@I$HvvAE^9S94cV= zX^3fw{KZ%N1*!O$kWeY#Mynp2e%UDJG<}!W;gfOXZQYf=`yk_O3-JTV(|g;&5G6Vfex9q=h;-wHVx`i=o4Tw7{I&Ub=oLWWVG-mBLCh z%iY8P_)1h)isEh7&yYcm;pgxs#$RiJLQ(=|$>LU?#>CSIxWw~WNx6Wu=9%j?C>pMM zsv|$Bx24I@wBj0g_QPjr$5XM*40KLn+OI3|`^R32Xg@6Nbw~{pVaz|K<~mKv|B6bl z^N4w#Eyt60h+Zq_spM`y-P5+0&$M-bio>$Fjq41#Dsfr)u~3KNwH~7oM`ha0G{5G! z^;E*jL^tQ;ISw3@nBdKBMX}uZff9l~LSI9i!n{K6p|}=2CGt9b!;}j<2)+(LQLmZk zlgAXd$jtZimeRL8^D~x24L!Pz+kX#zECy1UD^ZQJgu>auOywrzCTc70_VU)i>8o6|E96ESla zf83c(##x+IE;7#>Z{~AM%v~p?Fy@EgD?`W|UTMDQ2dppgXf z;W^SadU9`7G_1NdSYI*>9aYPY*}A|WLlQiK0lGfL9^NrHQ1XqAg?{LJq#HCeB$w-;ku){$URpIO7z$}`F=N}oSn z^Rz_mB$$h%F5}0J3W7N)IJ@QrayBOGEBc&Wt6ah>i)DZM0;%#5Y>m?RAR=EY`!L4j4{rU$H>BSBX9CL#tCkkOG0KaB%E3F6za#}q|ihWWlY^Wh%iefz~g|&z&6)4 zE%eR{EQBa_?;EmMo%zK55uNA3YdK!1?SQLhs~)d*tpN8R=FnGQL+X&C$~Vxsrt5vP zVCP53=r`T;z~^3da@9UZ9bhp~kPBgIH9MR0Ksgn4^%a&ZQO`m&j=q43qaD^p}Fi&B9LV3xQdqaRYQaa^VoDWTA|%A zAznoI5fQ#xDMwRkk1mUiub3?4))`s;5?1war*rm4bAA`xC!X!9eCUJk?1e6Q|Is$scp~ zDPEu@-eht=1N#DGKnJgDm))dmQ65(NECPAE_sP7g&~`C5gE)#>Qr)0&(NVV0;?LQH zxkn>xM|9y2Q^jy`)}PXvCJ=P1<_)-~i9O{+8nEgTV%r)b-80)cM6$0SWx5%j@Tw_V za~Gp(Ve(FF)M8^KerL=bB0dm9d-FGO%=*KTqD!b#*k~$L05yNf4UAUhXA;^fFyyTB zDG%?E8|CcTBFGhp`8?)zjx{XSvNXyh>amyI@Hg(pPCDuOAVDa$DYoIv;$AbJMM3H) zMKC*H!oUX;-|}_id0SIfZ2Ndr<>8dlGEC;|%-ck$o{Gs^P6Vt}opp<&RECb_0^31# zx)!UMUo78!`*6v=;9_;ea)wY({D}!CH8Y}QX!uwaS6?V7JtrH|rbfpsf`^vqcr4Y( zaUVe_j4r682^ifZ@+&RoWTE*4nhZ__tne@txcVjszU@fN33oqb?8&Qj0q!j%7F`Z+ zLC;h8I|OY>=`UeUCT`o7M3u{8mwh>9!(sipd5Jn5B8`>SAQJud3l?Yw1#SXHj=meYtL0m^iWOf4{@e3 z&nH#Ll-{cn)iqh=L$+;)(a))Ffm=89(hZbkR@I&uJ-`fW0R8&a0jfhT|##V&p1ed!DsYu zHc#ziEpp<`MK(Z_$xlJ&lnH3RCT> zVneM&NcEk&Dgl{dihCvUwv9GGwmbGz%pJS#?KO1^rDr&pMlvkI8guuOXTN-&%lue} zlbVQD`Cr$R6LoCL`aYx9XRgJ~U2rTHh^th0Qcm!n%Y5cy#ANS~XeT4f<>fw>77JIG9>{?$53C-8o z3Yi%f(t3_o$nFz>#S!Nf zqhupv0jd7Xky9ZYfbXG?DQUMIwCW~zZ%i-SURal#0{^ObM?4gnqNhdg)0SIPKPc17 z>Y+=zvbyT45`>exd3&!2!^(|?j0y?*KS&#x{%8=MlQ4tcuUO2tC+_ZHbBX?Wha~b+fBi(jUhI? z6=vNgTWn>vKI8IrAjSqFGiR`wWz+-7A|0kEoXX1&npic0-%;D!hu?rPK$QJ>`pcj{1rT2y;qo6mF|-UY*f+Nn%X4u$o4qf_l?|M(&>kY z7-1V!pQl2Aj6ZEYK8WCWHX*d|@%`o|u0hKAMYC@Jk2o2dNF(n=AMtNyzVdpLlL5uF z4mHtzWp}?yok(kgACWCWw$eCn0J|mD6>cWXhR|rAd1G_XOY>2k@qhdG&NWVFq8$QV z6vszDirTM#WWZq?^0 zwq}MmR|(^AuN2yJ0g;;Mn=*Vyx4KuRaB?39^$_4EYR%V7X|Yhxb~|WRP87HhcZoGQ zGms@(vg4YM;zG|&D;|?Eb)P$In?Q;Fi2>?Sabn2y+vY-W{*AW%E#p!nhQDLi9P1}!Z z3EI_X^R!5)M&xD!FXDh3X>6Mue`iGNWQ3^#3=+)Bbd*7)v{E$sj*6W3#T%_zm6N|{ zFGRn>vIyeZ*T)f%EU557t6N)TlbfKZWGg0P6|`vXLG^?2V^1S-1DImEX1=A;_1>G$ zz8_|nA*Q~;{%?Iw)V7a7`_I6Uf&FjjbBq6^&nHzkt#DOPd!8q8@{W9>UnFt&0v7N zE6+esiIA2Nn$PZObv;jQIIwrjKakC2PE4hH@gHSvXL(I&y!BzPKTB3xvQL72CUtci zv}8014OSAiuc0h1s2SgGO9}Woeod^;+ZB*e`-qFv$6#v`n|nLO=@AO3Fs4E}Px3TV+U}O+ut&m#%be z*Epu%t1f#(Hd(giQc0u|fJILj-}1sC2gkMTD>C5TNP+A!=Q&5SE19yZaM#I7Td!Eg z$yBE}R4oMe(pRVJvEsG`+Dfuc%)A)nqZzKRdjhmio-=H;Kx=8G6New(9r#x0x^?&# zXgfUq`brNc<{ERnTe(_IGPf0uC0>;6dBQJB5n3R?3l7#V@G)l5E@QQ9005cQ%@C!u znwHfc-49?iY$!snS!O(@F_j&Ik>_A0fQ}Pu8-w4Vf_s)<*AAT@zM**46Nc@&b=vnK z&g2uu?WviCIKETS1%8SRZ_%lOC3*JS7xqc4LZL;gA(w-mQ!4h}0w@q2q{2%5MP z4?A30LRR6snapJ?;eM+(QQM~CD$!srzdALY+_(TUEuvs#D|fH{GYHwA;JoaHScnJP zh6j|d8Dz2@W^CkCS_{Gyz4L`Nve#nNWyL1gnZ8|q@#>5LQO6f$;`Xw$jc&5K)?#k7EVx zPJAR=8B(`KI`+25RJ$Cu<$Z)uv>aMZuC{)EAB=wFb$D5^})bep<9E{PVzbIrLZa_^AOD(MFadA=vw3ohtpsi^XU2 z(pYg$N`UACD_eAs=$^K{L+1$#2Zd)KKtm0`RJ%_hO4wwqD> ze#>9yZ~uiSa=Kx3R000uhdc6rqXt?2#~P%rXN@X?nVY`ZakWX;H777PClr^WSoE;c zwZ7g#l7U~0Dj08L9{DkQfAX*6pCotC^ySUPBjPU*?gY(3R`I{&kxP2dLKt~7E8xel zk^eyvf|LU#y@mQPbv@>$!?h{EJaS~|`Rq=&>v=uOwCi5Y(Q_IwwS0KiM4c(t0(taK4atkTYmB#(28}BH-*D zcg^|gyWO6OAsR=OT?Fvi^&j*p{x*w%EBgMIvA2lNT(V($6L%$gX>Ii zM&OXzCb(O(^sqNek`A(4~%*UlqZLV+`v75e?>7fmLIoH$csMKcCX)${szem>c}~W3cj6 zBvli$?&xXAT3Hmg8nS2ZE6txaef(?nW1ue!ZWEeJk6yqvoXDmL(WtX0Y*r zpssQV>VdE?>dlM206u9X?WF!;@%+|rNT*>Df3Mi-J>@Qc9MDe5Uc6trG){fZY7Ej!h{H0v}@zzMH*|@26P*uf?+?tPbmONFons9TL;i_K!?z17i zcHeCF9t^Y*V6A? z{@SA2=`!)N$B0_xpu`4q)ftCd*<+pn2U_!5hw`7$^wFv`SybY@7huD=)2c%AhQXF0b=_MO6BToD;2D#*;ASX2P^95F3; zp<(u&qhYcg(=eXdsp_+81A0%&iWc9-vyfUu<#rMNH6-ZnDL5CsMunTPat3wq;o~g< z%j5d>AT<3u=REIn?!;HIl+oH^3H^?pZ4vc3! z6yu#`Fv087m+?eeR_JRsTzt{_`?Q3I10d(QUH)ptb;UC)>ZY+iBwx;GP=nBv%!e)R z00J3%y^!D0^w10eY8K&|#;dMZrv(;CCJAmNyQV7gI%!kWL9x$kLxC9rGY4l{}t= z)?m#CDf9F?7`k~c`x_nUitmBRXlHagMiO+zO1FIaw~VPj&d^Pw(}rw-%ocek=O05K zKeMAP8jId=RoUju{o$Er3``zyub6+bkx%dIXEqkC&)5~F3=Eg?Yb4R8=udXl5xkk2 z5aC8Ou>orXhpnAsFTT;UOqE%;6Na8UrM?fyyn>+1>ZjQu`&h=3vNDCY2ST@CYs zMvi>BOMj?)9y~7G&yo4Bm{FIgIgkH2I`H2jPg?z_4*36Q8bHUu_soaT0K3$NSk_vOU;V)0S`nxX)88U1Ui`pYzgrNquA|VEh8WRjTIAatY0#S*gr zH3?Z^VsEo{gY{oLL&`u=b>rVZek9oZH{Ju*|0x@nU4Gh0$Jy-d%g??!9+;s9-lqQo z?yv!7m;>(c&tW8}y>OD)@LgvryyYUyUTqXDu>OP2wK*|5oc_RDzW$9eV$hf^$^0a*D89O7c}hI|sw z4%y_0jo=GM^aelBPDMT{ftVq<%whfpIZ0s~JG8UJpk}~(GF@#+i#pyzmXcM+7rfQ%z7$?wx z)m1fn?0nhAeoFuC=U*{W7jz>?IDq~P@0}%g2k^rUju?pggiGd69wz~qj!Lf zzG2~(fir4Z);r_)Gwz7Y^SLP1WTH(aOj?r67jofR=D1yXH8eP10(o*VdebiK0@qUq zs}M>*=M&+5HD_dHZBCypH*K?F)?+WP5Zj=%#e}$5Cgpkw{o*nKxKb05l8w!<409>M z@2cB}{A^1AST#F)8K$Y|BBxXhZ@=SO*$3hFH(I^ATwa~v7&FEK8qZ=i5ARd8X-vrC zf;P}rU8c{ecJy(Gi5%|t-75&$yZsM*tt_?qlgjca0T#}eYh28F6 z{P;Umo+y&mvAg*U>v{W==is;txGOP^ySv9F^8KIfKTIj-;O2=o4xsMhcChbXqT9(` z;Zk_g^v|4~{vHMPugY{$Za}QlTc-EIS&IE#)O3avohM|DW!9PHN>c&gkwFl>xh4X( z!PZIjhH&dSA!foJkb{m$C1F_7*9$5b&I5XgJF@Bf|850z0qiv$u-fJq%C>+Rn>xx1 zJGIWl9aPVV^nxxyNn@G~gL%#A%xitl$>dEU8zNjK3%;N{vvDA#kxTt!MnbPD|5E5a ze=hGB{v=8%S8s8F_Gh0j>yLpg4yjILpW;DFSyHM&!+T{{hH#oFWoas(zfJHOWtxHo zMog>}rqCLuP=G6SZXl;9OY5&?#8pF01ftDNIYHzLtC^F zYvh@ebB54AEW(^i|KZrZ$Fy)Y%~-n78(vWq@MM=xpOdDHLV-v2-JP+@v-q=&Po74MFI7hSf&$XRD>TUZRVtgEUl(|^3giP|Zxja+F_EOFr3 zkQzs*7KGm}#gju|7cG35(=dDzJT57l4FC5fp+FgHh(Ug{J7%f5avJ)ypdMogaTm=2 zlch3|u5?Q!i+t)$u|d3Ly)MGxV_2GAki@CxPIF}ia}$t&~g zToo4qefb+XKCobKnJd#YBR=UFPdhe<>mlq36^^{m_Bn7YlY%SHJD$d0^mFcWc#7ru zwuoKv6o2b8y@%RA@K3s0c2D->d7~V|w&jycZncF=WK(IP3%{Mje1egU5R$A>xyC9yPZNZY32)&%+Q|P< zb-X~M|J@9GmsLWOjFrw_o*R1$nL~Wb2>9vL$_RJWFcbc6V2&HGx-M2uV(#ol{Hgh3 zpK4HH#T!lJs!gjh8408<%L*x6qlF7uU(PNVa|-WT8FyQZH|#-pMAF_bV}ifdfi^Mr zoUiUrSqjzZ7s)3cFI=5o+Zk(qHVA~jr*qZs8F|pvL5RSv8{&`l_LbwSfs5-*rH?m_ zmP2#RQ5-U0zzj|(Zli6NP2d%acf|$i$EWU&#D1g#)$#~if8Gms4}Q~7U|1j~VD8Y! zi(lm))$z%YcsA#dWO;A_4`XS<0~z5DJNjT=9lEGb-tNXom2gr%p@``Ymiu_e1$n13 z31=2fH_r@trp0n1KLwQ$o*%qc)=J#3zYK8c5GhZo-%Q4@%O1{qMXj&bVgjV?h-{7< z9HAb%6%d-!b(EbPI@LFd0JF}1=hPJ7PzB-cZzxi{i1SX0DVtvTG=@KACe2Th$IpX% zc_goOh+Q0yaE(I?o0#pij=wBi?SVpx=Qp?J%ad zkQcNw;C?b+plj)R^B0`arY+w;lFOpIyoqxL6z23ueCrZ9MhG|2!LbPZ+ENuTy4OTg z=7Io>X_{_G)enaAa9hs8oZ%!%e_b#{fbyj$SNlI5GpOTs${0lgeESY0ctR^OWbe@0 zh37O*p8j?vo1lo{`8eS)L`pA0W?kaCi2co+kK8MzYMNk~1R*h}Y>A83xo(!eyhEMU zPljKlM7sXajWfV0vFpwiV6jVybAUn9Kw2q!Sbq~r63b@JxXv{tWq_IPU3iNASyQqa%tnm)ER7~PR2c@VN@uS45Xxv+GW z$cr%fPIPo9F-WmQd)TxOy19dcoj=#GAo6aJ(5B@PDl2ab^x!ADCaJvpA&tI|l@_Ld zvzAPrTn=*fbM8_|_A1^z7rq`jxkzr5XXJUwTBgNhK?T>4BY&52k~~=9f`V(=HO{U6 zHFBpFM2#SjpUVugeEl=uIlGkL_P|MX%fA{>Ex#GFA(>f^^HpNFE`qCXDY5^gS_W5v zk6+|Eb^4?T!Rg`fq>u0@nTY%3TGvS<9}?|qM$a=~mFF3X#c)T9%{s<3#q{cbt1LQ0 zU#q~0AY5IGnvOFUU64O}#aP)eq^=6lQ`OcQ26X3$t;KS#Q{AOqk>U633b85st0>S+tg^J)gMXOcn!vi6UN|5*K(-{>r=zDE!$0w2j#NGK0tX9kFlJZ^EM_e zc*|D71&TXJVp;<4j>~D!Iq100f>s<)sA}%Kwh0ruWLJ@gx1Aiu>78uJG3;4-u$Okz+1el#SxZ*^AmI;*4zc0*bMePl6u zo8WQA?}~HU?WRLwMFv7X=hURaKu3(j7(%1KIMX)MK+Yy67=eec2Om z7y?(r%K&rVYX^>YsqLL>8O|h$b9^Hv;Sn+2o$i)tq$R^p)3F zK0B|_ITOyYD#11Skb@~#Zj5J`;1E;<&sNT>Hq%Ytp`>J0#T(|e#L7N}ZA#un)iVE+ z5bQ0u6Dc7!s!gTCL1*N7ZJp|!Q5$&ku*XXcA244ZstbArG*Br)FMb2??_1PQ-_5&{ z2rH>&mILgDpXP86A)6cz@Ism%aPf+?Aa8EZ+kYH#*0apn5>2||n0a{U`WMZ)bLRot ze+FH{Iz1_z7Ri@X;D=6IaG1vm?h4cxu}@7o*+sBa_5Fivvg@O0Ounh^6qHnAS!7c1 z-k?m$iF5IZgD(%>F`V1Xf+CWB;+Du2vlu0<;0Py+I5I>h8U{^m45cMmVQWZbuQ6m<(R;*>9atom+ zbfip$;xwTdR%r-C*1((fvU^e+I%<%Oal72|hv1u%adCC-tTDER| zy7v&Vqt(BOX|iEqA!}NZ0B-!+dUfK7h5r=0S_z|rSeM9&hS>?)1K=#`_uEgm3{v;_ z#uvKWk;CM6XphA?(5>gUN@CK~m?LQk)!p%WLz)Fb*iQ+H3Z(;SGa#34m~N`0f6-V& z7EkHjX_+063tkGCmE+jD%ef46ZVLsB&tQ!unaHpu3mcn2j8ZvdtQXN^5vwTZjK8+-P0`KAd@As#5Xato zHL{pkY{{_q;dn)F?#ei)SUy3Uuwa^0jHS@)t~>{83;Qb7YTDI#xi|l!h#yu7H3?LU z99iVqEk@FgrdsS6$y>3;ej*jb5l_QW`le0P zVLb8R?mP+SI!)D$Dpn_2H=tw69`#AvljWrCQ_0yIwdoNsU-DBKc2)y+hAv^+zAInB zF`GH0vol&!iKCtm1IgMzDTyA>EapAFfnew&=%fhS>FfbW zqo@UK8D?k>LhHPA;vSa4(VjjAP1_LEi=g&CV~OoP&y|n|#p(rrOl$+>mNdmnxJyRG zx&?F!Zh4~vW)rzvuTFbhJ+N4dC1{Okmi?!T?=9ry3@hFrgE2^k0$cj|DP|N5CXy^m zDyb-7i~*N;Q!+``6u2oX}AZMI86V6Luv`KqSeSPG+ zcQ|#Wb!mJ*={o9iAjWCuPO}n;UkZn{s@H}gsp6*$i9wbw zqsV8$hm3gsIh%z}SztIt*88;0atX?VEXY}QwL;*5`!Gb8!& zfCAR0YkC44)k2jjC5y&^NV^-N8E~^r&_~Cg>;tn;vG$?!*I9z5uBk^$Xl{rs5@8y1?eZMeIfV%PsY^Js;Vp4LjVa3&&nm8($u@R}IuHw5Rg+{2`v!IuKuFD(K z+?ig;4Ju_SEU)h~Hg_-u8_1f=5+0$N1hA^V&g@M{Z0H)y5d>>+N5rdHq9`VLm}#hD z*C32do)_`U5|FR_obrfsO5pD!6UY^R2Wy%C%MbP!#8)BG1v^%&^MR%Lp5`+tb1i5O zR}4ywT_IOv#3N-YymG*)_pFwz2F%GC^%TO_ZabyZ|4yHAmUxSPiIS zwrelLI@s)I<6&AR61OD}jSkXAUzv(;C!`am;Nm$2rJkyLMi_!A~5Bu8`_TZV>u7Sl|fk3#R$U9(XuRgL0Mpin4E8+F` zFgIA4bBw9FJT4ZxA+5;r$az&JmWt6w_KF^pg-t^zp4qCNJO9b_A#u#2ajEj5{ph$Y+LHT?hIvRc7WQry9 zgxSg*{l0}DWMhdyb9$k-K>G=$orp|1(>0ca6^x>rVt}E+jExC`CBl8N`0qS`4K6p&Y;6)G(67Q*yvxIQVj)zu*ay+2R zWtI~8#z)+d&PuX zq+p6%oJraERM?+t%bv_mgOCVhiOD14xn>u7r!0NNB`7pv)GpN#(r~v;Q?fa(+sxvp z6Q8d=e>Z0k8v=8>iuTe}jsyw_1UmoVm2Q=q926kp2w2D`W zcL7}+EiT9PSZF6lq946HBG^{rh}36{s~0&dS^lhx zVE^{u8B=;DeEi{HF!_E>%&-+@Abx@z`Z7_gN@GKj-;Drchp81ATl_Mqmd+)z@ZO=1 zOD>i&m1OCxig_2c=!Ix`oFD>F&^ZiuNE;8Z!X;{jHAOI&oLEkq7t?pLiq>7ED&roo zEh(>4)iJa!3^fWJt5DSyjSQMrlQOvBoh~ID=17xn}OCeX&k-k44igjPVGxz)_r#Z$nd<3|2IvK5C3$#B%}N zX8L~WQK^*jh{yzKTT7jmutrrwoKnSj8@?d`vran)=8Ki$OHs;M_GGkCo|RUAfW-kH zf8h1=m1)wt9CQ7gL3@FT6V5(r5%8xU&bodaHQMnc{)GL=DQUo6cEKx~9$mckDsheg zQT77$qO4hRKo~3pI3o;;Z_+-9q(4s4y7Z>ZR@qa&zmDv|7Kb%(g_Y-E2;Os2SZpqI z!YEcpO``xosd@U81NgOLI0G&W@*mQY3_N}V5xMr2WE5OIjBfc~lqF{`x8V>?3#VvbqG~ApRP$wDtzi#8&En8ZUP79+QerdJ)H>zgZ?jwhW?tm! zcLHJ4siv%p)r~md1$9m(Cj}&BmKmq!7#yk$v!LSIfw&@}uX*@FCH%s)3uwxhCL9hw zk`YGaX?36woV&+2cyNtm3YF~%tYLC{#*k{GW%+s6<8?*{iR6$Exf|x`RQ5C&V|o%< zN{C))$V_R?88`Q=P_eAK$O~_OSsPuj?my7m!{&fArlRTPFQoWRHM;iMHKKR0EDqrp zwOW>#b1-YRdRvjnSW2iUh{%KpqQKTluWBZsqy-GlhhnKxXCL~^51l)~Ql*0c)Xw^` zh^j0S^mqmz$5@?1KxQyYcWPb`;{F?DzuirZ{k zZ2u7RXczP$Z6~zJR9+4_ZP0R1ohGAsjojAtNzGyR;kpMc$}Fx4e(kB#ZMeBZ%gX7N zax#l-jfyX&N!b^Wzxp)ra~)i>O+ab5IeqrsP&iMIo4P;w87{r?NAP|3$4KI%r!wk6 zAS+Z{3hf^qe~qm7xk~FB5*lH@vQ=Lc7C~R^zVFGWZ~>93Z*d6_mnqjx9D~~uJ23`j<>FyNs1i7fpSUK@43D;9;IYV2cp$m9ogxdx zRV8(JHYy~GcUk*!r+v|t`pIO?SS+Ka<#iPxGXEHiU@@|at06)cc|^sCRE^ZQm>o(f zUP2ik6&t$|>*XfnOu&D$X$xQ%9S#g=s>t&TuiEe?v5C#5ZHJs`DeF{PRb%Q`ETl*z zO_nP2kIm9aHx#&n#@z{~HN}m8bV`af&kDd4DyNOt&88(@!{Q4?EP20?)-w zHoBug4615qo#N-%y1}z$jK(B8{{2I#>>h8^BUhY$Ji5Fh^HeE~E4aw2v<~b?M(Fl_ zpRVEOf1&vh_BXRw`c~FXj;&$NClz&`u*5ZR`$Z!cs_BA=(#iUi~YAyZd z+~9L;^wi|>BzLz_N946}eaRzB@nj?YM%s89G&PXzp?9qWEwMDgyUC(iY28HMGUiwS zXgEU#JQ-_H4Byn4RME#%th+EhVb-Y9SRMKU7T1syn>2G}F$(9C>s)y5IDF=MjE7@I z)-nzSHqu@`jl2g3@Vq#@y(+azT`V(OqA625zk|JIl3EKnUxMz1{27SH9k{ImRWc11 z??SBWaot6i);o2x)o3WJx;|QH*IzB6yg@!je`Z^65^A}8lxyNieLM(z^*`>s$B}(8 z+ikkBgS(;Hynh@^Xv|-50NQ9`n;cTk^DAp1_j(>DFBp>FZ!LsG7;7G_5Bz z-Q5|lV(-9=M=W7h2|kNPE@dK)97K&o8HeGDL#m_nk88g2bO!}9bBPYGxm~H(?^{i! z^$lbTcc;x{ZeK~`(Qe(04s8T?t-I!IwBEP!?OrFiy4t?0Qr_|mUIobR+5N&4?2Aea zi0GO7h#%YxcqZ8OiTY*t_nG?FH~cjZs(W^4pxV*7SJim`xF?GTHF8(ITBR0^m%#0r zbr&ya`W<&i7UI2WV2a%Y`c^i_sy^GOW*1=DG6Yno{$kOhYRezjNGreT3~&yJ8;@uX zPQ#>`&d`IWmAoBush^}jws4`T+EpG3205?2n;8E9Z@#JEMb+)n)h&QSb+6*qn66nx zcJ~GBUJjDq_uja8Bsg~>T5o~cbS2x#Fw``i2a9m~{H{y{V%3kXalBR$NHq_sCxUoz z*8rL{tGK@?x7!vo05S8Ssqou>Ds?Iss}l(ly+WGmnEedN%X2~Ni(13MAbf>U|5HON;W+w%M;y=2d6I-?J zyodsrx98WObpmCEqXg|_%A~|)Q;Z1qA2X*xkgiVbU0*wH2)?3dC=1#cJkCP}7{gJ& zoUiV0oWS-LdqH(^iHVPLMvks-4|5s+1WTD+QD=H3P4eBagSAu52nKxr&ddGvyz7(r zi$*|nf@fhbrrh@lMN+9dhwI#X*b%v_>w{?fT7<|Mzw zZ>aQzp( zV5qgRYG^W!jKQnfJ)ZrBk7{xBDj^we+6Uo#qN#3|^gAUOi#B_xxwPbOIixW}mz~hk zkkpvJm+k_rG|}R`;?=RZhoqHHwuk2}(%4hq0b0XW-gdutD4q1JTJVq*hZA&{ zI)~w1jdLuguJl)Ix(f>YpNX9!%iVH-px%(KB|g2#PIl4v=H2EAb0fttNf zudcJVKkFb>(QvcTD0Q}J_9v2|R#`b|$gY^7G|GlAh%#q-Ipgt+%90!U?Lj4Q57ez~ zqY(2~&%5In98Xg%$pS_;ghE2sG36c_ZN}1m>yt)o5n7w%?s00 zf19mCf2YZ|(Z3zNJ=t4kJGk%n!vT}U_HTdQfF1Ido0E?}^NcBx3OJrO8<51Mx6W_v zaMwFx4^AuHb;b?-W!^UL1!9V0qUMM&+vH7soi?wL97xw|P{S;Cbs|u9z^r#2YhA9$ z>s~*Mb>?b9*|8RAw9BuC>9{u_E~SXAHNskIJ2>TO&s4+49o>a5mxxudU*R^>+T z2u9@2LXLUNhr?dj43`gl!G|j_n!8OK0Mgz5YDIAlzd#;V!ouxG=(59e3IP2aFFtO> zES8u|8a^*t&4)G<#87c!c8J7{w@2?II`>2!L@&&XhK{%R22w?;B+ZG6#j&(rqv@|N zrJaqPVXvNSBD~!f2=a8uR=Q!H<+VY<_@sv#(Bs6au!OIF2XcwqavzDNt79jwhj`>S ze$i}29n)@;-?BvS_~~n`QQWK^bufn~L0Orq1zv)A9ZtsBfwA#S_q%>SpTs zVzS$tW|DYfVjXZ_qAQ16rpS3hg(vP}GEC8C8EN!@&4k}^;{GFZ>nJSPos6uR|HV{- z)b!9&wp8`@i=|aWDO}e`=OEHo6U#&s^Hrz9gGiRaIiQ$VPat=U7-W|KvpZ_uoi)IQ z3;Ga3T|?DU%jOkpbGRiw579UHr}jX7eX-k(lDF_?iMnFD0eXboEK0*i;Eu$b+gET? z>FmV7wf>;2=2P@8>&*CODvmR1UH*fQ5tGMok*Y0FR`|H6fdLq08gBj&iH zmH^4<;mj#XU(-gT+)3o0;*(EjknHK}%L+$c$Y&d@}eyTq>{TcSerP(}3XD4cRUN;hr zqO#Rx&=mC_rnu1pNO`1k>?Ve)AnB=n`+6+a)Rx)rQY#INm5vYG&6vWR3WTiX zX4P(dguY~*|Ju;{j&@>%mhcOn6qBJGNpNnxQ}4T=XK}vt) zirtgA6jEsL=2%j#I3$s05jNM-M<37qa(mMn>G^Yk@u8&=oZom$%zPhqBU7e$w;e!c zi%>Q4orZo0oyl%yQ=8t*xXhsNDo!C_I!UK(H&R{*mkG~NnmMYxGHyY0!J)hLAVmYnv% z*&f_`U9}Ec?)>W;EcF1kVYNq$e%Y5WV<)cN&8TIzl95+W(Urj&EON@Gm-qV-%+nl8 zPVd3{H6;23j9`zD?!HD6>-R?Hj1Pj<(Khh=r3vVddCuvfZrEm{ar)%*U9od zCv#Ts{=IkLhCR~Aq0$X4SMdp$ha&(LjY2g-?8Gcy^#lH|LW~^6TCTUrtvB8yv0#fm zgz9Bc>YVbqid<6eV4Qm+Ne?<+u3>t=+)Xga4OS^^^5FT=caCnG41u8r1~T=-`g)m3 zX!{Psxp0Es^4=F2uMaQW*w_f!(gLP~!3jiv!;{_WA=rOd+Z38^MYCP13RSqhC|hiMOo`PI$`@Q zccAqhgzsgc`{?xo;VF(nFgFm!dP^kZ{r_|PCdt6Og)5vQ6(ysLM(!%{pbu;i5;5Lt zE}cg~W_L#~$^CI0Dy2%VSLbfkNmJN+8+}KE&1v^n^qIYYI0@&n{-3q9!#YPj)}TXWt#v`D;V_f&Z7iciTi{{JAL61 z622yMgSk?T)i4=7#r{eBe}s#Bu6M2QLzu!x%US9_;b-m*ySbcDAN)sU+bkq63|APB z{J}rnIiMf!6Yq*ze^E!nDs`E#4nHp6eDeYPqAfLQN%eO(Pl68gi>I;N|uy8#Vsag8KkS{JTlL= z>Ele0`poKS^Q`?+P+v`nG#Qoj6l#0$NlI~ABli~8`NY^$Z5wDc+zRapouWl!kr}}C zyB{9K`3h$Y*?&lJYRzD)^wFzh72J=Mr;kZq=n42@V#6oNjGIWk96FKT3R>sBK`S`2`eJ@EdkRO{yy zTXou~kX(tBSm`Y0Bk@0&d&lQW!?)40W2=z}PDdTvwr$(CZQHhOCp*bbI<_%= z-cvPG^M085&D8mD{()V!SJhK>U-xr8Ys~|1FvT=$(`si~sZp!LqfwVe!q$rZm?%-q zM4}tgQ&t=7bR`I1D7cT0DA!By)x_Nv9ym!f%M+IvAvk>(Vaq0!DK?R(TP`rqW(LR* zH?RDzj20C%7vE{{B84p0LsObJ0ACdT_xq7j&Z4|i6~f}l1{&e+%(W7J1l5>m)sf1@ z$<*Yk3DT)$3X`#Xr>c$a3e=Qj3K!b6qLX(Ch4kS$QwquB9ZG9PB`-hqgEweL8BwJJ ze%Je>Av#dtuC=^KlC4%0Dy}CqLAJQ*BslvR1tei$S4YSil`NyVxCWtO+8W^-klllz z#KEUk>3$?rZs$o#YgBLDIyV_;4-DB+7CHkoDDE#x;bgf;vtElps-p|MC| zmp6+89s0*oGMq!Kq_vDF&RtrZSPxX+% z!4DY*k<(OBwSt3g3Nbq4at_poMufj!{tY#K%3;la8u1i)$;E; z(GH`uQFzsQUPA>6!?eL=%S~EH)&oG;(%(U}BbD0lbk(gQ<>Iyq!t`lO7SvN#V+P?- zk!n>DP7#nMQHv2BNC|8G>5F8IqBPYGR)um!JGNoXG+9u;6UYQ{e@r+8(a5V*u#y3l zHD>vWyZ-dL!8KaYLkrp_Bw>koC7I+qgwKx(JD-XM(*!WA(9-CbFPM{!mz7W$lTrPY zMb(v?gdCRWiIbQmOCU3vTBMb#pRfG7`ZM#5=!3y@j0-hwRdU|z-^D91_sJ=rxZ-J! z-8R1e zpPc_TN0lywPg}(abs3|8a2F|n1uo8KT@?+$NJCVyRwTS`U+W%QTHx^6Uk2`~`nyE( ziQaJRA?ab+sy7yu9{;FTRCF(dSo5Fr4LyV`{t2ZR2RTfl={ImBgq;Cz zDWI;r>MITZ3saq_1~3)l?{Y0HohzyR=j{*o7v|nLL~9F&0ogXcb+xbNp=>oaDQ}|} z$VVBzY~yI{Hz8rBH3Qggut^?f&3m@XS)TFvJ?#6OKH%af9JI`Qcm37=teQE!gj50+ z6AK_OtZZ!05Y6@ggN&(A!VPMx9R#1Dyg$ovU?P9iK= zkzji!zTOiQtH@h+XT!qP{N^q&OZB1>_DA@jryD2?O%<%uRQMjuNYTH4jR9g=jo7MX zQR~*GsPm%c)_=k+14%oIN-)3rRetb2YB@8aryIPjrUK+Y!)~-+qXhaex}}&XLGgXb z^}f>q%~$(0+q3oW$yAOzMeihtIxQAQGQv|0V*vd{ae6Mv5L>}^&~oy~!dRUO;v4f? zifn-4Zmx+Q1UI&Q?SpPZXzj-5n0&?|vd+!#xBQgQRRkfiQMdlW$ytHaTcq>oN&iQw z2TtXs#w`l#ukOSg%?0UT$0#6hI_FBAp_!tVYe#UUS8vd=($I&==(K_((|3whwX==D zI`Cn9VIX&aqWCOF=Bgn1V<}=8rHl|kg##32Pm{XC40&O^H$HYx{Cnz+rP`h;vv;cQ zVKnSd$5`+-1${1@Es4Vwa&=!=1eov}d!O;`U6@Mef*T8Q2X^D_ze5!kZu5-r(0H*YQ z%ElRJN7H}skP2qvu|>FaiODumufBtAej<9ij}PGAdso!*!TgiBnjdryIfEcuL>NB9 zyfh!mGrPY2><-ShmAvvxWgMw@-)|LIHVHd`j%XepsLVep6t)0CCFkq8sHq zj!8?}ay|%|EnYIQBmz4R3>x@1Xdi)d%;N}8hDp{wfrEXWTH0UXEon!U_XX7a4^SI4 zpiu7q#heemNp_###QGd-6;4kX(Zv0>UJ?(KO8#>l=NE93Y`cNa8cJQ}=C8;UuLVTz zD)uO|p8hjjZP!zhM^0wGH?pw-6HF7-!Po~1{ z3x-Hg0<#$Et<+YtE(XqR6Zl{8DS(7H{q3H*O!nZ}=6r~|iFOkPSvyKEm;vZQ$MF?s z*=Nkt;eUhUYQoyhpN0{>*PDf(geU&_d#36&7na{X*kOhSwToV=n zrv4S?j6lyHwvJcsW#K+#OtF!B&_JR)!CX7n^=SKyT{XcyBl)pfwZ~BANVGj}OJKYt zO6MKRj>+J)Ly0q0QSHkSv)g|zKE2IEBSUh-oa3z$))9DjC=2VXr~E=LKTA!{>8c;h z{~=TqCD{0iD`eHnElBvx`2n^;WoR0=0Pp^B;ICvGuiAJ|Qlp9~IJL^_8;0pz zk;R$h69Y)hSfhKZb1-}@CE#clvdTb-oCez7NDjeGT;=yw)Zz|JEC%pMY)AJN+mdbA zdSo49`=BIPm#%lttrJP=Trx^%@j~4cf246q)XOhKJa~wp#CBK`e?Zce=TYxlQ&bV| zjcU;PM2)cUmAWtAz8{>eTKQtz-u)b}GU$$zlWJnHaU9d~FMPcY|Kqp)c@zCnYD-sgT)p>@#AIvKVy% zG2rOe1e_SWR4neTJo5=bt2!q#xqr@2*Ud@t9=0a~NeFs&UXzb9Zy|$Bc*z=q}fgPc8EWF-?C-eoemh28Qs6oB`n{SNyfxVhpFY z{Fi7d=y>~Du7;)e@dkE2w67n4-=-HJwXr&e9SpHQHzRxZ2?(sx!b`<-fEuLl*b=%M zXR>tzQZ5*U7>}dgznV>QH&m98SMHNlKjlfS5_Y*siA=fg18LOmTQlCW z^$jX~mvkZh*H6AioC2QBr}{7mzC6=-&wz~DKJJ(l6#~VjR3|!<7i}-qx=3ULDMXuD zq7u#<)(hihef*}x`{eRhnl0o`#Z=yRY&GMWrpTFwvjI3CCFN-_r8E?~aQv)%9=iL= zG{@h)BN|yE|GYlCtYQ4;-_Nqyu6z1No@3Bl zE(IbEs&c)}H@abNF;5nztPR#;I-RgHj|8z}`|N{IKGluawBO>~;*sEj`sezU-X%FRiZ?*{B3fTbhNfd9_25oN7m?%2oq^LPY|aPsbM`OuZ%k^+Xz_5{y=cc z2>n6P6wMX1OM5YO8-2@4u2xb}<%ZoUoUobtbJ|hIe~($VQ6Ia3fnATSiw6kx_Hauf z%@ta^PVZGU%|3#m-Wra4q|_dv;T%IIvD)>5vat7KwVsfpbBn)aO>;D>p|=u%lx2EQ zNbyV?S?B3r>bHGK-gh8IjvrivilpK{Z`J~sHhZCPowSv0h_#xdpj(R6i}d_Da-11= zReRM>(ZFsKUv(D`Vu&}TIqxTM`H|W9yN3q3Aezt+#w^O_X71AD%hd3|KI4wDCq&<^ zW)T+UUOY%T5<;ZB2mC<$HPY|~$|$#}(J9^Gr<^OqdUpg-ebqiimdjf-57T~QSsRq$ zHEJVaKy6~^AtQ?ONL5~wE_^2h3f#Ngu{u`>l;Ik}GhcwCOrPr-cX$U+;V$VgY^+s$ z_*HJ9On$dw+wiBssV98$^!EE*;uK&&(ctQ!!5~X$fJJFdW7u21QL)t&%*P2OZz z$N<|pL2G?zKYO>OKo(K+L>q`x8}rmo>MT5)$EhE0aT4iY+N^a_3|&w~K*DghwQ-0dSA zI_ol7`3X?$(zL~%i^VSIct{IxDftSWvc;b$3}dg0qb(Jk|DDVkc7QxdhXaE~SExPr zh8LoO!xUm6Hp?8Zk)0NFlNOjg_sSo-(u$*NQ9wvcoUJ#g^<&(ibqvwAE(zm#{uL&S z9CESw^=nH%#9zpqZLX0ao@tKk{DPrsk`p35-Hq&Ym<~i!2sP!o12t-+ddT;J7n=-t z+a{LdNM1+W9g*oWu-K3$2>4ORk=SVtun<-=Eceg|o54AtV!VlkCkMG)WBo-V-L*Hz zfO9HtD{(_DA4IyCTYu-6a6$|xOm^uoeS}#!ufKadAyX-5j-T18d+BX-6dBneAyv>E&V_a=pngy&TJS16;dEMgx zCR@{+tgghJjF>inz`E?ii@MB1-%SxBBe9`-6S}`smn)z@*ktr(uCf z)XJ-0^QeTe+_6hQmKBMSPOsTFZiCCC*7ksjNcc&{4Oy5pF`4z@OSyR#fp(Nd%$35r zN5>Z>qmD7EEGI(WdO9a1qJPRoPna2fP^N#i%Bd+7NFL)O^wt{(F(BI7y5F7h#YrAbWDbRUtFuJ zQCyvv!B|k0|A&5Nmbzz5$O-e*@EkEqzp*EZr&fSSoAf>58+sbs3GWQ~Pt)1eegF@w z__Blczje3Jby(9BBq~ft8_zd2m@j0_5wKw*CrEQfg@-%}(~KDTwF5>ztL5%L(|{r9p-roq%^F?U%~EVESyWRSb(pwr;_V1z zHH!fv=i`^9gOk3?NWw9JX*MO^hvEyZPLk+4rVr5Vn|}A?fPiD^AXBn`UGkRwGu>sO z)-D<0Ua_56+xM2(yRBc-j1BFhG?ON6+{cJqksEJL!u1G0)&~vNU@rZD(94MObEr96 zgjT%);a~zb7I+IWisEaH7pydz4S`t!yG6i(Jwc}i8xXC_j)`NAWoKRY3$(KD-xe&! z&k%GzI|fG;OYbovV^8Y2{)O_W@_210; z^y=)z|1nyd|5a!W|1Y#e|GS`N{x7skk}`B53*}ZM9o&ikUy2eX&gcjK&A72Kp`7|3 zqqY5Cg_ivPLTmEB30hWmgZ~lhSp5GP>zFVI3IA_sN6^7*+Wu3ui{1Y#+W)+Am*AiI zKU#G`|1$-_@5?t86z;zmo^@aX#Jm$EE%l>24js5>Z9{&H6N5KCG{yD)$>gcG$ zCoMu2R}0cg=4Exuy)yhG)bd}1w8EGVXsN6H{^vh8{Rx$<3bqcpJoJuiVTLhR!dFHT z36nG<+Drq$C7Y?otuW`wke2(%l9wAqnAd`TAeuEV`;^0Y33xXMW3B~P5_t3*ImDLZ z9LzT=fB0`SHd~Tq0{>}lnv?zm)s4gd6OH6m=JsH zp}`PvdG;Q}>^k=zJQ+saY<7Kk`qW%p@3Z)JJp%x)V`BnV`@d`Ig5edXFc)Rs7RhU` zS}b7R+btMBz3#{Q9VaH}R;vecr)vRi0Y06#{gVUaIa)qPS(r2uFkkua7ZotQnM7an zAi7B*pPLQh>*K=d+FDJPi|1I+-LyuNksD%bTo1eHCK2jsO&05UvDhva(@Dslv+~3q zk0p6AsSSPL&1jC@-Xl5{q5aY-^5?C+7@;R$MFR#V41x22YAknMYWFT?ks@yy_vN!8 z%Ew0kv%A7tdQ;vc_g>jYYYc*bCGy+5;2WX+mez{$d0&O&`lG!m;~5>O!6o3UPHfQZ z2flbhyOqQDS!17T&dO-$bplQWNXNB9zN|s7_g+ps%CboEC1ak`g4Q&tR>&yYK^$u-)H;R-kZQrpog#dKc466bPnQKIo1L1hsqkU^bW6unpg;(sj70 z!Os(l0wq6kBu4A1aA{0jo@m&Fy(7~!$DKI6P9pQ!pLx>T) zJAW!z#1;6^vE|>0g{R?_+ioU$<{~nqUxn$bfez&wX^83GX~5gb!Zg)Z?>&r?+bm4i zCUir_Zk=+M&+HbZ$RvgI6Y2@Rd}UrwNS`}(97XwlRf1AyIqH}J;PuBfix;zYEqry6 z%^Bde)9`mj=bn?TNAGn$z2mx&YM$IzB(}>e8S~a6F??6`G_K90X)ED4|7gJVI>Gex z;r%Wn_Gf1@kgQ+U?qJs3M+#HC!gC+FZF<>+%||WOmWA@T6SlebqY+2Jr2y7D5o z=F@?g(`IaMK+G2U|g^B23+AUqAfI{~B)Q)O3cJAVay+^TnV)%@3 zZeigd@S#oE4jZ{`j8&A*xILMu+U=%)xn@tIQSz(&Ak_93Bnnqrx7?M)uHO5dREu5d zp);RqHC=g`7ncbVtplMBi%<4?D4q7a6H@Z6ihe6_aPF`bj{nesSG%cUH68nEq+=kN z@{8!MF?h@6k?TCTi;h>eP*Qe&*zCKP93lP8;ysQKqO8);)@QK+-i+Lwd*FO@7MET6 zWST%D$TZfnAo*Ma{jB{)usMCZXzYq@m}k4?xbop#t2+HdBHmOJwbI(jq<35k(e2FS zXILwlB4(`R#+x#r6UsVL{%BZ?W+bxhv=&pd$Dkn5(S~oLS`#x}a4$fY&Y;DdsQP)G zr#r?m3K(o#Uvn>!3|QHmsx6;Lj_ZHN5qTF|)`Ht!Xt}wMwP)F7`CM8=jIA2O#MvWO zV!?=2JjGF%zNUlz3sb6$M%YPr#>NdP@Q#IjE9cMhj$2LVh!i7_MyM`m$vD?trjKL$ zFcl3ha8SP!;WexOIEAN~N4INu+ej%YGjd_MRP)ZREjUWQdPtr%9_n#Ji{iM$p2Q<{ zNfGQ7Sl>^7G?HmtkI8$g_YAvAwZBZX9~WSI5;%;aOg?wS$gyu#4BKTEBf7cWBp_!j zedKdv9lf5IRP&A*eNZ6h3pAd7*3f0!QcKpPt4h{}F2*BXRhDgS&U}gaK8OSn$zy=B z*fxKCH~Y9&Z3dMz*WGf%#*!q)tBLBqB0)5FVMrTt{^*zw576|B>6B*qq|A81Lnj

HTWbXo=#s{mri=-TUkmOWvz-QDKTN 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 diff --git a/core/src/test/resources/indices/bwc/repo-2.1.0.zip b/core/src/test/resources/indices/bwc/repo-2.1.0.zip index 2f287ea3481782bf1690ac0b36eb4a150e8bba62..1165341de36d41be7f36c0f2c240719765187a36 100644 GIT binary patch literal 97021 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�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 literal 81795 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

-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

Ew9RAL(&u6>@QCG$Pi9P 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

aF4(;!{=YZL=Lxnq~Gjx#Lb#8_8+Z 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 diff --git a/core/src/test/resources/indices/bwc/repo-2.1.1.zip b/core/src/test/resources/indices/bwc/repo-2.1.1.zip index 3253da62c3fdc29d811071ce11c696aba20745c4..2b5bce15bc7f3f3cc45fcaa2cfa32473a4b7212f 100644 GIT binary patch literal 70566 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Ɠ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 YHklPzpE58=0pSZy28I=!zzoO$0C3*rZ~y=R literal 70133 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 ape7R?Lae~rfq_9B2=@TXaAi(V^8x^j`zm1o diff --git a/dev-tools/create_bwc_index.py b/dev-tools/create_bwc_index.py index 83a35941577..af5945a418e 100644 --- a/dev-tools/create_bwc_index.py +++ b/dev-tools/create_bwc_index.py @@ -257,10 +257,19 @@ def generate_index(client, version, index_name): # Same as ES default (5 GB), but missing the units to make sure they are inserted on upgrade: settings['merge.policy.max_merged_segment'] = '5368709120' + warmers = {} + warmers['warmer1'] = { + 'source': { + 'query': { + 'match_all': {} + } + } + } client.indices.create(index=index_name, body={ 'settings': settings, - 'mappings': mappings + 'mappings': mappings, + 'warmers': warmers }) health = client.cluster.health(wait_for_status='green', wait_for_relocating_shards=0) assert health['timed_out'] == False, 'cluster health timed out %s' % health diff --git a/docs/reference/cat/thread_pool.asciidoc b/docs/reference/cat/thread_pool.asciidoc index f50dc369c3d..eb566f20fee 100644 --- a/docs/reference/cat/thread_pool.asciidoc +++ b/docs/reference/cat/thread_pool.asciidoc @@ -63,7 +63,7 @@ Currently available <>: |`search` |`s` |Thread pool used for <>/<> operations |`snapshot` |`sn` |Thread pool used for <> operations |`suggest` |`su` |Thread pool used for <> operations -|`warmer` |`w` |Thread pool used for <> operations +|`warmer` |`w` |Thread pool used for index warm-up operations |======================================================================= The thread pool name (or alias) must be combined with a thread pool field below diff --git a/docs/reference/indices.asciidoc b/docs/reference/indices.asciidoc index da41ac52df5..7543a3f0bbb 100644 --- a/docs/reference/indices.asciidoc +++ b/docs/reference/indices.asciidoc @@ -4,8 +4,7 @@ [partintro] -- The indices APIs are used to manage individual indices, -index settings, aliases, mappings, index templates -and warmers. +index settings, aliases, mappings, and index templates. [float] [[index-management]] @@ -38,7 +37,6 @@ and warmers. * <> * <> * <> -* <> [float] [[shadow-replicas]] @@ -92,8 +90,6 @@ include::indices/analyze.asciidoc[] include::indices/templates.asciidoc[] -include::indices/warmers.asciidoc[] - include::indices/shadow-replicas.asciidoc[] include::indices/stats.asciidoc[] diff --git a/docs/reference/indices/create-index.asciidoc b/docs/reference/indices/create-index.asciidoc index 52a867958ef..b5cd6c3aea1 100644 --- a/docs/reference/indices/create-index.asciidoc +++ b/docs/reference/indices/create-index.asciidoc @@ -86,27 +86,6 @@ curl -XPOST localhost:9200/test -d '{ }' -------------------------------------------------- -[float] -[[warmers]] -=== Warmers - -The create index API allows also to provide a set of <>: - -[source,js] --------------------------------------------------- -curl -XPUT localhost:9200/test -d '{ - "warmers" : { - "warmer_1" : { - "source" : { - "query" : { - ... - } - } - } - } -}' --------------------------------------------------- - [float] [[create-index-aliases]] === Aliases diff --git a/docs/reference/indices/get-index.asciidoc b/docs/reference/indices/get-index.asciidoc index 78cfa074550..b82bee05630 100644 --- a/docs/reference/indices/get-index.asciidoc +++ b/docs/reference/indices/get-index.asciidoc @@ -27,4 +27,4 @@ $ curl -XGET 'http://localhost:9200/twitter/_settings,_mappings' The above command will only return the settings and mappings for the index called `twitter`. -The available features are `_settings`, `_mappings`, `_warmers` and `_aliases`. \ No newline at end of file +The available features are `_settings`, `_mappings` and `_aliases`. diff --git a/docs/reference/indices/warmers.asciidoc b/docs/reference/indices/warmers.asciidoc deleted file mode 100644 index b8f670af73a..00000000000 --- a/docs/reference/indices/warmers.asciidoc +++ /dev/null @@ -1,194 +0,0 @@ -[[indices-warmers]] -== Warmers - -Index warming allows to run registered search requests to warm up the index -before it is available for search. With the near real time aspect of search, -cold data (segments) will be warmed up before they become available for search. -This includes things such as the filter cache, filesystem cache, and loading -field data for fields. - -Warmup searches typically include requests that require heavy loading of -data, such as aggregations or sorting on specific fields. The warmup APIs -allows to register warmup (search) under specific names, remove them, -and get them. - -Index warmup can be disabled by setting `index.warmer.enabled` to -`false`. It is supported as a realtime setting using update settings -API. This can be handy when doing initial bulk indexing: disable pre -registered warmers to make indexing faster and less expensive and then -enable it. - -[float] -[[creation]] -=== Index Creation / Templates - -Warmers can be registered when an index gets created, for example: - -[source,js] --------------------------------------------------- -curl -XPUT localhost:9200/test -d '{ - "warmers" : { - "warmer_1" : { - "types" : [], - "source" : { - "query" : { - ... - }, - "aggs" : { - ... - } - } - } - } -}' --------------------------------------------------- - -Or, in an index template: - -[source,js] --------------------------------------------------- -curl -XPUT localhost:9200/_template/template_1 -d ' -{ - "template" : "te*", - "warmers" : { - "warmer_1" : { - "types" : [], - "source" : { - "query" : { - ... - }, - "aggs" : { - ... - } - } - } - } -}' --------------------------------------------------- - -On the same level as `types` and `source`, the `request_cache` flag is supported -to enable request caching for the warmed search request. If not specified, it will -use the index level configuration of query caching. - -[float] -[[warmer-adding]] -=== Put Warmer - -Allows to put a warmup search request on a specific index (or indices), -with the body composing of a regular search request. Types can be -provided as part of the URI if the search request is designed to be run -only against the specific types. - -Here is an example that registers a warmup called `warmer_1` against -index `test` (can be alias or several indices), for a search request -that runs against all types: - -[source,js] --------------------------------------------------- -curl -XPUT localhost:9200/test/_warmer/warmer_1 -d '{ - "query" : { - "match_all" : {} - }, - "aggs" : { - "aggs_1" : { - "terms" : { - "field" : "field" - } - } - } -}' --------------------------------------------------- - -And an example that registers a warmup against specific types: - -[source,js] --------------------------------------------------- -curl -XPUT localhost:9200/test/type1/_warmer/warmer_1 -d '{ - "query" : { - "match_all" : {} - }, - "aggs" : { - "aggs_1" : { - "terms" : { - "field" : "field" - } - } - } -}' --------------------------------------------------- - -All options: - -[source,js] --------------------------------------------------- - -PUT _warmer/{warmer_name} - -PUT /{index}/_warmer/{warmer_name} - -PUT /{index}/{type}/_warmer/{warmer_name} - --------------------------------------------------- - - -where - -[horizontal] -`{index}`:: `* | _all | glob pattern | name1, name2, …` - -`{type}`:: `* | _all | glob pattern | name1, name2, …` - -Instead of `_warmer` you can also use the plural `_warmers`. - -The `request_cache` parameter can be used to enable request caching for -the search request. If not specified, it will use the index level configuration -of query caching. - - -[float] -[[removing]] -=== Delete Warmers - -Warmers can be deleted using the following endpoint: - - - -[source,js] --------------------------------------------------- - -[DELETE] /{index}/_warmer/{name} - --------------------------------------------------- - - -where - -[horizontal] -`{index}`:: `* | _all | glob pattern | name1, name2, …` - -`{name}`:: `* | _all | glob pattern | name1, name2, …` - -Instead of `_warmer` you can also use the plural `_warmers`. - -[float] -[[warmer-retrieving]] -=== GETting Warmer - -Getting a warmer for specific index (or alias, or several indices) based -on its name. The provided name can be a simple wildcard expression or -omitted to get all warmers. - -Some examples: - -[source,js] --------------------------------------------------- -# get warmer named warmer_1 on test index -curl -XGET localhost:9200/test/_warmer/warmer_1 - -# get all warmers that start with warm on test index -curl -XGET localhost:9200/test/_warmer/warm* - -# get all warmers for test index -curl -XGET localhost:9200/test/_warmer/ --------------------------------------------------- - diff --git a/docs/reference/mapping/dynamic-mapping.asciidoc b/docs/reference/mapping/dynamic-mapping.asciidoc index 0f445ac6152..beb7d4360d4 100644 --- a/docs/reference/mapping/dynamic-mapping.asciidoc +++ b/docs/reference/mapping/dynamic-mapping.asciidoc @@ -33,7 +33,7 @@ purposes with: Custom rules to configure the mapping for dynamically added fields. TIP: <> allow you to configure the default -mappings, settings, aliases, and warmers for new indices, whether created +mappings, settings and aliases for new indices, whether created automatically or explicitly. diff --git a/docs/reference/migration/migrate_1_0.asciidoc b/docs/reference/migration/migrate_1_0.asciidoc index c8750d11b82..f8cfad2f71c 100644 --- a/docs/reference/migration/migrate_1_0.asciidoc +++ b/docs/reference/migration/migrate_1_0.asciidoc @@ -144,7 +144,7 @@ In the future we will also provide plural versions to allow putting multiple map See <>, <>, <>, <>, <>, -<>, and <> for more details. +`warmers`, and <> for more details. === Index request diff --git a/docs/reference/migration/migrate_1_4.asciidoc b/docs/reference/migration/migrate_1_4.asciidoc index 03a4c1fe741..eecf9ca13e7 100644 --- a/docs/reference/migration/migrate_1_4.asciidoc +++ b/docs/reference/migration/migrate_1_4.asciidoc @@ -32,7 +32,7 @@ Add or update a mapping via the <> or [float] === Indices APIs -The <> will return a section for `warmers` even if there are +The get warmer api will return a section for `warmers` even if there are no warmers. This ensures that the following two examples are equivalent: [source,js] diff --git a/docs/reference/migration/migrate_3_0.asciidoc b/docs/reference/migration/migrate_3_0.asciidoc index e0e6c720401..d3c0b5a2d7a 100644 --- a/docs/reference/migration/migrate_3_0.asciidoc +++ b/docs/reference/migration/migrate_3_0.asciidoc @@ -17,6 +17,16 @@ your application to Elasticsearch 3.0. * <> [[breaking_30_search_changes]] +=== Warmers + +Thanks to several changes like doc values by default or disk-based norms, +warmers have become quite useless. As a consequence, warmers and the warmer +API have been removed: it is not possible anymore to register queries that +will run before a new IndexSearcher is published. + +Don't worry if you have warmers defined on your indices, they will simply be +ignored when upgrading to 3.0. + === Search changes ==== `search_type=count` removed @@ -593,4 +603,4 @@ The percolator by defaults sets the `size` option to `10` whereas before this wa The percolate api can no longer accept documents that have fields that don't exist in the mapping. When percolating an existing document then specifying a document in the source of the percolate request is not allowed -any more. \ No newline at end of file +any more. diff --git a/docs/reference/redirects.asciidoc b/docs/reference/redirects.asciidoc index 823bdb70d07..322c9e7308e 100644 --- a/docs/reference/redirects.asciidoc +++ b/docs/reference/redirects.asciidoc @@ -443,3 +443,9 @@ The `not` query has been replaced by using a `mustNot` clause in a Boolean query === Nested type The docs for the `nested` field datatype have moved to <>. + +[role="exclude",id="indices-warmers"] +=== Warmers + +Warmers have been removed. There have been significant improvements to the +index that make warmers not necessary anymore. diff --git a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.delete_warmer.json b/rest-api-spec/src/main/resources/rest-api-spec/api/indices.delete_warmer.json deleted file mode 100644 index 7284da6291a..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.delete_warmer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "indices.delete_warmer": { - "documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/indices-warmers.html", - "methods": ["DELETE"], - "url": { - "path": "/{index}/_warmer/{name}", - "paths": ["/{index}/_warmer/{name}", "/{index}/_warmers/{name}"], - "parts": { - "index": { - "type" : "list", - "required" : true, - "description" : "A comma-separated list of index names to delete warmers from (supports wildcards); use `_all` to perform the operation on all indices." - }, - "name" : { - "type" : "list", - "required" : true, - "description" : "A comma-separated list of warmer names to delete (supports wildcards); use `_all` to delete all warmers in the specified indices. You must specify a name either in the uri or in the parameters." - } - }, - "params": { - "master_timeout": { - "type" : "time", - "description" : "Specify timeout for connection to master" - }, - "name" : { - "type" : "list", - "description" : "A comma-separated list of warmer names to delete (supports wildcards); use `_all` to delete all warmers in the specified indices. You must specify a name either in the uri or in the parameters." - } - } - }, - "body": null - } -} diff --git a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.get.json b/rest-api-spec/src/main/resources/rest-api-spec/api/indices.get.json index 5c426f962a7..2c0c59f6898 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.get.json +++ b/rest-api-spec/src/main/resources/rest-api-spec/api/indices.get.json @@ -14,7 +14,7 @@ "feature":{ "type":"list", "description":"A comma-separated list of features", - "options": ["_settings", "_mappings", "_warmers", "_aliases"] + "options": ["_settings", "_mappings", "_aliases"] } }, "params":{ diff --git a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.get_warmer.json b/rest-api-spec/src/main/resources/rest-api-spec/api/indices.get_warmer.json deleted file mode 100644 index fbd7abbc34c..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.get_warmer.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "indices.get_warmer": { - "documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/indices-warmers.html", - "methods": ["GET"], - "url": { - "path": "/_warmer", - "paths": [ "/_warmer", "/{index}/_warmer", "/{index}/_warmer/{name}", "/_warmer/{name}", "/{index}/{type}/_warmer/{name}"], - "parts": { - "index": { - "type" : "list", - "description" : "A comma-separated list of index names to restrict the operation; use `_all` to perform the operation on all indices" - }, - "name": { - "type" : "list", - "description" : "The name of the warmer (supports wildcards); leave empty to get all warmers" - }, - "type": { - "type" : "list", - "description" : "A comma-separated list of document types to restrict the operation; leave empty to perform the operation on all types" - } - }, - "params": { - "ignore_unavailable": { - "type" : "boolean", - "description" : "Whether specified concrete indices should be ignored when unavailable (missing or closed)" - }, - "allow_no_indices": { - "type" : "boolean", - "description" : "Whether to ignore if a wildcard indices expression resolves into no concrete indices. (This includes `_all` string or when no indices have been specified)" - }, - "expand_wildcards": { - "type" : "enum", - "options" : ["open","closed","none","all"], - "default" : "open", - "description" : "Whether to expand wildcard expression to concrete indices that are open, closed or both." - }, - "local": { - "type": "boolean", - "description": "Return local information, do not retrieve the state from master node (default: false)" - } - } - }, - "body": null - } -} diff --git a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_warmer.json b/rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_warmer.json deleted file mode 100644 index 9039367d15f..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/api/indices.put_warmer.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "indices.put_warmer": { - "documentation": "http://www.elastic.co/guide/en/elasticsearch/reference/master/indices-warmers.html", - "methods": ["PUT", "POST"], - "url": { - "path": "/{index}/_warmer/{name}", - "paths": ["/_warmer/{name}", "/{index}/_warmer/{name}", "/{index}/{type}/_warmer/{name}", "/_warmers/{name}", "/{index}/_warmers/{name}", "/{index}/{type}/_warmers/{name}"], - "parts": { - "index": { - "type" : "list", - "description" : "A comma-separated list of index names to register the warmer for; use `_all` or omit to perform the operation on all indices" - }, - "name": { - "type" : "string", - "required" : true, - "description" : "The name of the warmer" - }, - "type": { - "type" : "list", - "description" : "A comma-separated list of document types to register the warmer for; leave empty to perform the operation on all types" - } - }, - "params": { - "master_timeout": { - "type" : "time", - "description" : "Specify timeout for connection to master" - }, - "ignore_unavailable": { - "type" : "boolean", - "description" : "Whether specified concrete indices should be ignored when unavailable (missing or closed) in the search request to warm" - }, - "allow_no_indices": { - "type" : "boolean", - "description" : "Whether to ignore if a wildcard indices expression resolves into no concrete indices in the search request to warm. (This includes `_all` string or when no indices have been specified)" - }, - "expand_wildcards": { - "type" : "enum", - "options" : ["open","closed","none","all"], - "default" : "open", - "description" : "Whether to expand wildcard expression to concrete indices that are open, closed or both, in the search request to warm." - }, - "request_cache": { - "type" : "boolean", - "description" : "Specify whether the request to be warmed should use the request cache, defaults to index level setting" - } - } - }, - "body": { - "description" : "The search request definition for the warmer (query, filters, facets, sorting, etc)", - "required" : true - } - } -} diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.create/10_basic.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.create/10_basic.yaml index acb4da22716..3fc0e00d637 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.create/10_basic.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.create/10_basic.yaml @@ -30,25 +30,6 @@ - match: { test_index.settings.index.number_of_replicas: "0"} ---- -"Create index with warmers": - - - do: - indices.create: - index: test_index - body: - warmers: - test_warmer: - source: - query: - match_all: {} - - - do: - indices.get_warmer: - index: test_index - - - match: {test_index.warmers.test_warmer.source.query.match_all: {}} - --- "Create index with aliases": @@ -81,49 +62,3 @@ - match: {test_index.aliases.test_clias.filter.term.field: value} - is_false: test_index.aliases.test_clias.index_routing - is_false: test_index.aliases.test_clias.search_routing - ---- -"Create index with mappings, settings, warmers and aliases": - - - do: - indices.create: - index: test_index - body: - mappings: - type_1: {} - settings: - number_of_replicas: "0" - warmers: - test_warmer: - source: - query: - match_all: {} - aliases: - test_alias: {} - test_blias: {routing: b} - - - do: - indices.get_mapping: - index: test_index - - - match: { test_index.mappings.type_1: {}} - - - do: - indices.get_settings: - index: test_index - - - match: { test_index.settings.index.number_of_replicas: "0"} - - - do: - indices.get_warmer: - index: test_index - - - match: { test_index.warmers.test_warmer.source.query.match_all: {}} - - - do: - indices.get_alias: - index: test_index - - - match: { test_index.aliases.test_alias: {}} - - match: { test_index.aliases.test_blias.search_routing: b} - - match: { test_index.aliases.test_blias.index_routing: b} diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.delete_warmer/all_path_options.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.delete_warmer/all_path_options.yaml deleted file mode 100644 index 603b01c15a6..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.delete_warmer/all_path_options.yaml +++ /dev/null @@ -1,218 +0,0 @@ -setup: - - do: - indices.create: - index: test_index1 - body: - warmers: - test_warmer1: - source: - query: - match_all: {} - test_warmer2: - source: - query: - match_all: {} - - - do: - indices.create: - index: test_index2 - body: - warmers: - test_warmer1: - source: - query: - match_all: {} - test_warmer2: - source: - query: - match_all: {} - - - do: - indices.create: - index: foo - body: - warmers: - test_warmer1: - source: - query: - match_all: {} - test_warmer2: - source: - query: - match_all: {} - ---- -"Check setup": - - - do: - indices.get_warmer: { index: _all, name: '*' } - - - match: {test_index1.warmers.test_warmer1.source.query.match_all: {}} - - match: {test_index1.warmers.test_warmer2.source.query.match_all: {}} - - match: {test_index2.warmers.test_warmer1.source.query.match_all: {}} - - match: {test_index2.warmers.test_warmer2.source.query.match_all: {}} - - match: {foo.warmers.test_warmer1.source.query.match_all: {}} - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - - ---- -"check delete with _all index": - - do: - indices.delete_warmer: - index: _all - name: test_warmer1 - - - do: - indices.get_warmer: {} - - - match: {test_index1.warmers.test_warmer2.source.query.match_all: {}} - - match: {test_index2.warmers.test_warmer2.source.query.match_all: {}} - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - ---- -"check delete with * index": - - do: - indices.delete_warmer: - index: "*" - name: test_warmer1 - - - do: - indices.get_warmer: {} - - - match: {test_index1.warmers.test_warmer2.source.query.match_all: {}} - - match: {test_index2.warmers.test_warmer2.source.query.match_all: {}} - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - ---- -"check delete with index list": - - do: - indices.delete_warmer: - index: "test_index1,test_index2" - name: test_warmer1 - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer1' } - - - match: {foo.warmers.test_warmer1.source.query.match_all: {}} - - is_false: test_index1 - - is_false: test_index2 - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer2' } - - - match: {test_index1.warmers.test_warmer2.source.query.match_all: {}} - - match: {test_index2.warmers.test_warmer2.source.query.match_all: {}} - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - ---- -"check delete with prefix* index": - - do: - indices.delete_warmer: - index: "test_*" - name: test_warmer1 - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer1' } - - - match: {foo.warmers.test_warmer1.source.query.match_all: {}} - - is_false: test_index1 - - is_false: test_index2 - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer2' } - - - match: {test_index1.warmers.test_warmer2.source.query.match_all: {}} - - match: {test_index2.warmers.test_warmer2.source.query.match_all: {}} - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - - ---- -"check delete with index list and * warmers": - - do: - indices.delete_warmer: - index: "test_index1,test_index2" - name: "*" - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer1' } - - - match: {foo.warmers.test_warmer1.source.query.match_all: {}} - - is_false: test_index1 - - is_false: test_index2 - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer2' } - - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - - is_false: test_index1 - - is_false: test_index2 - ---- -"check delete with index list and _all warmers": - - do: - indices.delete_warmer: - index: "test_index1,test_index2" - name: _all - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer1' } - - - match: {foo.warmers.test_warmer1.source.query.match_all: {}} - - is_false: test_index1 - - is_false: test_index2 - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer2' } - - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - - is_false: test_index1 - - is_false: test_index2 - ---- -"check delete with index list and wildcard warmers": - - do: - indices.delete_warmer: - index: "test_index1,test_index2" - name: "*1" - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer1' } - - - match: {foo.warmers.test_warmer1.source.query.match_all: {}} - - is_false: test_index1 - - is_false: test_index2 - - - do: - indices.get_warmer: { index: _all, name: 'test_warmer2' } - - - match: {test_index1.warmers.test_warmer2.source.query.match_all: {}} - - match: {test_index2.warmers.test_warmer2.source.query.match_all: {}} - - match: {foo.warmers.test_warmer2.source.query.match_all: {}} - ---- -"check 404 on no matching test_warmer": - - do: - catch: missing - indices.delete_warmer: - index: "*" - name: "non_existent" - - - do: - catch: missing - indices.delete_warmer: - index: "non_existent" - name: "test_warmer1" - - ---- -"check delete with blank index and blank test_warmer": - - do: - catch: param - indices.delete_warmer: - name: "test_warmer1" - - - do: - catch: param - indices.delete_warmer: - index: "test_index1" - diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get/10_basic.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get/10_basic.yaml index 4c5251b36a3..218d1e0433c 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get/10_basic.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get/10_basic.yaml @@ -10,11 +10,6 @@ setup: test_blias: {} mappings: type_1: {} - warmers: - test_warmer: - source: - query: - match_all: {} settings: number_of_shards: 1 number_of_replicas: 1 @@ -59,7 +54,6 @@ setup: - is_true: test_index.aliases - is_true: test_index.settings - - is_true: test_index.warmers - is_true: test_index.mappings --- @@ -73,20 +67,6 @@ setup: - is_true: test_index.mappings - is_false: test_index.aliases - is_false: test_index.settings - - is_false: test_index.warmers - ---- -"Get index infos for mappings and warmers only": - - - do: - indices.get: - index: test_index - feature: _mapping,_warmer - - - is_true: test_index.mappings - - is_true: test_index.warmers - - is_false: test_index.aliases - - is_false: test_index.settings --- "Get index infos should work on aliases": @@ -94,10 +74,9 @@ setup: - do: indices.get: index: test_blias - feature: _mapping,_warmer + feature: _mapping - is_true: test_index.mappings - - is_true: test_index.warmers - is_false: test_index.aliases - is_false: test_index.settings @@ -113,7 +92,6 @@ setup: - is_true: test_index.settings - is_true: test_index_2.settings - is_false: test_index.aliases - - is_false: test_index.warmers --- "Get index infos with human settings should return index creation date and version in readable format": diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/10_basic.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/10_basic.yaml deleted file mode 100644 index 668a6119c3d..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/10_basic.yaml +++ /dev/null @@ -1,201 +0,0 @@ ---- -setup: - - do: - indices.create: - index: test_1 - body: - warmers: - warmer_1: - source: { query: { match_all: { }}} - warmer_2: - source: { query: { match_all: { }}} - - - - do: - indices.create: - index: test_2 - body: - warmers: - warmer_2: - source: { query: { match_all: { }}} - warmer_3: - source: { query: { match_all: { }}} - - - do: - cluster.health: - wait_for_status: yellow - ---- -"Get /_warmer": - - - do: - indices.get_warmer: {} - - - match: { test_1.warmers.warmer_1.source.query.match_all: {}} - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - match: { test_2.warmers.warmer_2.source.query.match_all: {}} - - match: { test_2.warmers.warmer_3.source.query.match_all: {}} - ---- -"Get /{index}/_warmer": - - - do: - indices.get_warmer: - index: test_1 - - - match: { test_1.warmers.warmer_1.source.query.match_all: {}} - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_2 - - ---- -"Get /{index}/_warmer/_all": - - - do: - indices.get_warmer: - index: test_1 - name: _all - - - match: { test_1.warmers.warmer_1.source.query.match_all: {}} - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_2 - ---- -"Get /{index}/_warmer/*": - - - do: - indices.get_warmer: - index: test_1 - name: '*' - - - match: { test_1.warmers.warmer_1.source.query.match_all: {}} - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_2 - ---- -"Get /{index}/_warmer/{name}": - - - do: - indices.get_warmer: - index: test_1 - name: warmer_1 - - - match: { test_1.warmers.warmer_1.source.query.match_all: {}} - - is_false: test_1.warmers.warmer_2 - - is_false: test_2 - ---- -"Get /{index}/_warmer/{name,name}": - - - do: - indices.get_warmer: - index: test_1 - name: warmer_1,warmer_2 - - - match: { test_1.warmers.warmer_1.source.query.match_all: {}} - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_2 - ---- -"Get /{index}/_warmer/{name*}": - - - do: - indices.get_warmer: - index: test_1 - name: '*2' - - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_1.warmers.warmer_1 - - is_false: test_2 - ---- -"Get /_warmer/{name}": - - - do: - indices.get_warmer: - name: warmer_2 - - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - match: { test_2.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_1.warmers.warmer_1 - - is_false: test_2.warmers.warmer_3 - ---- -"Get /_all/_warmer/{name}": - - - do: - indices.get_warmer: - index: _all - name: warmer_2 - - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - match: { test_2.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_1.warmers.warmer_1 - - is_false: test_2.warmers.warmer_3 - ---- -"Get /*/_warmer/{name}": - - - do: - indices.get_warmer: - index: '*' - name: warmer_2 - - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - match: { test_2.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_1.warmers.warmer_1 - - is_false: test_2.warmers.warmer_3 - ---- -"Get /index,index/_warmer/{name}": - - - do: - indices.get_warmer: - index: test_1,test_2 - name: warmer_2 - - - match: { test_1.warmers.warmer_2.source.query.match_all: {}} - - match: { test_2.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_2.warmers.warmer_3 - ---- -"Get /index*/_warmer/{name}": - - - do: - indices.get_warmer: - index: '*2' - name: warmer_2 - - - match: { test_2.warmers.warmer_2.source.query.match_all: {}} - - is_false: test_1 - - is_false: test_2.warmers.warmer_3 - ---- -"Empty response when no matching warmer": - - - do: - indices.get_warmer: - index: '*' - name: non_existent - - - match: { '': {}} - ---- -"Throw 404 on missing index": - - - do: - catch: missing - indices.get_warmer: - index: non_existent - name: '*' - ---- -"Get /_warmer with local flag": - - - do: - indices.get_warmer: - local: true - - - is_true: test_1 - - is_true: test_2 - diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/20_empty.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/20_empty.yaml deleted file mode 100644 index 702b0cd01d1..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.get_warmer/20_empty.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -setup: - - - do: - indices.create: - index: test_1 - - - do: - indices.create: - index: test_2 - ---- -"Check empty warmers when getting all warmers via /_warmer": - - - do: - indices.get_warmer: {} - - - match: { test_1.warmers: {}} - - match: { test_2.warmers: {}} diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/10_basic.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/10_basic.yaml deleted file mode 100644 index 7e4c57429ec..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/10_basic.yaml +++ /dev/null @@ -1,145 +0,0 @@ ---- -setup: - - do: - indices.create: - index: test_index - - - do: - indices.create: - index: test_idx - - - do: - cluster.health: - wait_for_status: yellow - - - do: - indices.put_warmer: - index: test_idx - name: test_warmer2 - body: - query: - match_all: {} - - - do: - indices.put_warmer: - index: test_index - name: test_warmer - body: - query: - match_all: {} - ---- -"Basic test for warmers": - - do: - indices.get_warmer: - index: test_index - name: test_warmer - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - - do: - indices.delete_warmer: - index: test_index - name: test_warmer - - - do: - indices.get_warmer: - index: test_index - name: test_warmer - - - match: { '': {}} - ---- -"Getting all warmers via /_warmer should work": - - - do: - indices.get_warmer: {} - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - match: {test_idx.warmers.test_warmer2.source.query.match_all: {boost: 1.0}} - - ---- -"Getting warmers for several indices should work using *": - - - do: - indices.get_warmer: - index: '*' - name: '*' - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - match: {test_idx.warmers.test_warmer2.source.query.match_all: {boost: 1.0}} - ---- -"Getting warmers for several indices should work using _all": - - - do: - indices.get_warmer: - index: _all - name: _all - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - match: {test_idx.warmers.test_warmer2.source.query.match_all: {boost: 1.0}} - ---- -"Getting all warmers without specifying index should work": - - - do: - indices.get_warmer: - name: _all - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - match: {test_idx.warmers.test_warmer2.source.query.match_all: {boost: 1.0}} - ---- -"Getting warmers for several indices should work using prefix*": - - - do: - indices.get_warmer: - index: test_i* - name: test_w* - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - match: {test_idx.warmers.test_warmer2.source.query.match_all: {boost: 1.0}} - ---- -"Getting warmers for several indices should work using comma-separated lists": - - - do: - indices.get_warmer: - index: test_index,test_idx - name: test_warmer,test_warmer2 - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - match: {test_idx.warmers.test_warmer2.source.query.match_all: {boost: 1.0}} - ---- -"Getting a non-existent warmer on an existing index should return an empty body": - - - do: - indices.get_warmer: - index: test_index - name: non-existent - - - match: { '': {}} - ---- -"Getting an existent and non-existent warmer should return the existent and no data about the non-existent warmer": - - - do: - indices.get_warmer: - index: test_index - name: test_warmer,non-existent - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - - is_false: test_index.warmers.non-existent - ---- -"Getting warmer on an non-existent index should return 404": - - - do: - catch: missing - indices.get_warmer: - index: non-existent - name: foo - diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/20_aliases.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/20_aliases.yaml deleted file mode 100644 index b8a2fa6b27e..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/20_aliases.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -"Getting warmer for aliases should return the real index as key": - - - do: - indices.create: - index: test_index - - - do: - cluster.health: - wait_for_status: yellow - - - do: - indices.put_warmer: - index: test_index - name: test_warmer - body: - query: - match_all: {} - - - do: - indices.put_alias: - index: test_index - name: test_alias - - - do: - indices.get_warmer: - index: test_alias - - - match: {test_index.warmers.test_warmer.source.query.match_all: {boost: 1.0}} - diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/all_path_options.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/all_path_options.yaml deleted file mode 100644 index ffad427101a..00000000000 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/indices.put_warmer/all_path_options.yaml +++ /dev/null @@ -1,134 +0,0 @@ ---- -setup: - - - do: - indices.create: - index: test_index1 - - - do: - indices.create: - index: test_index2 - - - do: - indices.create: - index: foo - - - do: - cluster.health: - wait_for_status: yellow - ---- -"put warmer per index": - - - do: - indices.put_warmer: - index: test_index1 - name: warmer - body: - query: - match_all: {} - - do: - indices.put_warmer: - index: test_index2 - name: warmer - body: - query: - match_all: {} - - - do: - indices.get_warmer: { index: _all, name: '*' } - - - match: {test_index1.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {test_index2.warmers.warmer.source.query.match_all: {boost: 1.0}} - - is_false: foo - ---- -"put warmer in _all index": - - do: - indices.put_warmer: - index: _all - name: warmer - body: - query: - match_all: {} - - do: - indices.get_warmer: { index: _all, name: '*' } - - - match: {test_index1.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {test_index2.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {foo.warmers.warmer.source.query.match_all: {boost: 1.0}} - ---- -"put warmer in * index": - - do: - indices.put_warmer: - index: "*" - name: warmer - body: - query: - match_all: {} - - do: - indices.get_warmer: { index: _all, name: '*' } - - - match: {test_index1.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {test_index2.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {foo.warmers.warmer.source.query.match_all: {boost: 1.0}} - ---- -"put warmer prefix* index": - - do: - indices.put_warmer: - index: "test_index*" - name: warmer - body: - query: - match_all: {} - - do: - indices.get_warmer: { index: _all, name: '*' } - - - match: {test_index1.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {test_index2.warmers.warmer.source.query.match_all: {boost: 1.0}} - - is_false: foo - ---- -"put warmer in list of indices": - - do: - indices.put_warmer: - index: [test_index1, test_index2] - name: warmer - body: - query: - match_all: {} - - do: - indices.get_warmer: { index: _all, name: '*' } - - - match: {test_index1.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {test_index2.warmers.warmer.source.query.match_all: {boost: 1.0}} - - is_false: foo - ---- -"put warmer with blank index": - - do: - indices.put_warmer: - name: warmer - body: - query: - match_all: {} - - do: - indices.get_warmer: { index: _all, name: '*' } - - - match: {test_index1.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {test_index2.warmers.warmer.source.query.match_all: {boost: 1.0}} - - match: {foo.warmers.warmer.source.query.match_all: {boost: 1.0}} - ---- -"put warmer with missing name": - - - - do: - catch: param - indices.put_warmer: - body: - query: - match_all: {} - From e7f9d685f1133710e7ec52eea064ea690823472b Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Thu, 7 Jan 2016 10:05:53 +0100 Subject: [PATCH 39/59] [TEST] Test that translog can recover after random IOException This commit adds a new test that can throw an IOException at any point in time and ensures that all previously synced documents can be successfully recovered after hitting an excepiton. Relates to #15788 --- .../index/translog/Translog.java | 10 +- .../index/translog/TranslogWriter.java | 5 - .../index/translog/TranslogTests.java | 183 ++++++++++++++++-- 3 files changed, 179 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/translog/Translog.java b/core/src/main/java/org/elasticsearch/index/translog/Translog.java index 0d2fba6ea57..88e4b06421e 100644 --- a/core/src/main/java/org/elasticsearch/index/translog/Translog.java +++ b/core/src/main/java/org/elasticsearch/index/translog/Translog.java @@ -51,6 +51,7 @@ import org.elasticsearch.index.shard.IndexShardComponent; import java.io.Closeable; import java.io.EOFException; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.DirectoryStream; import java.nio.file.Files; @@ -440,7 +441,7 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC if (config.isSyncOnEachOperation()) { current.sync(); } - assert current.assertBytesAtLocation(location, bytes); + assert assertBytesAtLocation(location, bytes); return location; } } catch (AlreadyClosedException | IOException ex) { @@ -454,6 +455,13 @@ public class Translog extends AbstractIndexShardComponent implements IndexShardC } } + boolean assertBytesAtLocation(Translog.Location location, BytesReference expectedBytes) throws IOException { + // tests can override this + ByteBuffer buffer = ByteBuffer.allocate(location.size); + current.readBytes(buffer, location.translogLocation); + return new BytesArray(buffer.array()).equals(expectedBytes); + } + /** * Snapshots the current transaction log allowing to safely iterate over the snapshot. * Snapshots are fixed in time and will not be updated with future operations. diff --git a/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java b/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java index 867b94a8505..6a4d40ec545 100644 --- a/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java +++ b/core/src/main/java/org/elasticsearch/index/translog/TranslogWriter.java @@ -218,11 +218,6 @@ public class TranslogWriter extends TranslogReader { } } - boolean assertBytesAtLocation(Translog.Location location, BytesReference expectedBytes) throws IOException { - ByteBuffer buffer = ByteBuffer.allocate(location.size); - readBytes(buffer, location.translogLocation); - return new BytesArray(buffer.array()).equals(expectedBytes); - } private long getWrittenOffset() throws IOException { return channelReference.getChannel().position(); diff --git a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java index b31aafa432d..ddd8c2f649f 100644 --- a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java +++ b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java @@ -32,6 +32,7 @@ import org.apache.lucene.util.LuceneTestCase; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.bytes.BytesArray; +import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.FileSystemUtils; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; @@ -1316,7 +1317,7 @@ public class TranslogTests extends ESTestCase { public void testFailFlush() throws IOException { Path tempDir = createTempDir(); - final AtomicBoolean fail = new AtomicBoolean(); + final FailSwitch fail = new FailSwitch(); TranslogConfig config = getTranslogConfig(tempDir); Translog translog = getFailableTranslog(fail, config); @@ -1336,9 +1337,13 @@ public class TranslogTests extends ESTestCase { assertFalse(translog.isOpen()); assertEquals("__FAKE__ no space left on device", ex.getMessage()); } - fail.set(randomBoolean()); + if (randomBoolean()) { + fail.failAlways(); + } else { + fail.failNever(); + } } - fail.set(false); + fail.failNever(); if (randomBoolean()) { try { locations.add(translog.add(new Translog.Index("test", "" + opsSynced, Integer.toString(opsSynced).getBytes(Charset.forName("UTF-8"))))); @@ -1409,13 +1414,13 @@ public class TranslogTests extends ESTestCase { public void testTragicEventCanBeAnyException() throws IOException { Path tempDir = createTempDir(); - final AtomicBoolean fail = new AtomicBoolean(); + final FailSwitch fail = new FailSwitch(); TranslogConfig config = getTranslogConfig(tempDir); assumeFalse("this won't work if we sync on any op", config.isSyncOnEachOperation()); Translog translog = getFailableTranslog(fail, config, false, true); LineFileDocs lineFileDocs = new LineFileDocs(random()); // writes pretty big docs so we cross buffer boarders regularly translog.add(new Translog.Index("test", "1", lineFileDocs.nextDoc().toString().getBytes(Charset.forName("UTF-8")))); - fail.set(true); + fail.failAlways(); try { Translog.Location location = translog.add(new Translog.Index("test", "2", lineFileDocs.nextDoc().toString().getBytes(Charset.forName("UTF-8")))); if (randomBoolean()) { @@ -1436,7 +1441,7 @@ public class TranslogTests extends ESTestCase { public void testFatalIOExceptionsWhileWritingConcurrently() throws IOException, InterruptedException { Path tempDir = createTempDir(); - final AtomicBoolean fail = new AtomicBoolean(false); + final FailSwitch fail = new FailSwitch(); TranslogConfig config = getTranslogConfig(tempDir); Translog translog = getFailableTranslog(fail, config); @@ -1473,7 +1478,7 @@ public class TranslogTests extends ESTestCase { // this holds a reference to the current tlog channel such that it's not closed // if we hit a tragic event. this is important to ensure that asserts inside the Translog#add doesn't trip // otherwise our assertions here are off by one sometimes. - fail.set(true); + fail.failAlways(); for (int i = 0; i < threadCount; i++) { threads[i].join(); } @@ -1525,11 +1530,40 @@ public class TranslogTests extends ESTestCase { } } - private Translog getFailableTranslog(final AtomicBoolean fail, final TranslogConfig config) throws IOException { + private Translog getFailableTranslog(FailSwitch fail, final TranslogConfig config) throws IOException { return getFailableTranslog(fail, config, randomBoolean(), false); } - private Translog getFailableTranslog(final AtomicBoolean fail, final TranslogConfig config, final boolean paritalWrites, final boolean throwUnknownException) throws IOException { + private static class FailSwitch { + private volatile int failRate; + private volatile boolean onceFailedFailAlways = false; + public boolean fail() { + boolean fail = randomIntBetween(1, 100) <= failRate; + if (fail && onceFailedFailAlways) { + failAlways(); + } + return fail; + } + + public void failNever() { + failRate = 0; + } + + public void failAlways() { + failRate = 100; + } + + public void failRandomly() { + failRate = randomIntBetween(1, 100); + } + + public void onceFailedFailAlways() { + onceFailedFailAlways = true; + } + } + + + private Translog getFailableTranslog(final FailSwitch fail, final TranslogConfig config, final boolean paritalWrites, final boolean throwUnknownException) throws IOException { return new Translog(config) { @Override TranslogWriter.ChannelFactory getChannelFactory() { @@ -1539,23 +1573,56 @@ public class TranslogTests extends ESTestCase { @Override public FileChannel open(Path file) throws IOException { FileChannel channel = factory.open(file); - return new ThrowingFileChannel(fail, paritalWrites, throwUnknownException, channel); + boolean success = false; + try { + ThrowingFileChannel throwingFileChannel = new ThrowingFileChannel(fail, paritalWrites, throwUnknownException, channel); + success = true; + return throwingFileChannel; + } finally { + if (success == false) { + IOUtils.closeWhileHandlingException(channel); + } + } } }; } + + @Override + protected boolean assertBytesAtLocation(Location location, BytesReference expectedBytes) throws IOException { + return true; // we don't wanna fail in the assert + } }; } public static class ThrowingFileChannel extends FilterFileChannel { - private final AtomicBoolean fail; + private final FailSwitch fail; private final boolean partialWrite; private final boolean throwUnknownException; - public ThrowingFileChannel(AtomicBoolean fail, boolean partialWrite, boolean throwUnknownException, FileChannel delegate) { + public ThrowingFileChannel(FailSwitch fail, boolean partialWrite, boolean throwUnknownException, FileChannel delegate) throws MockDirectoryWrapper.FakeIOException { super(delegate); this.fail = fail; this.partialWrite = partialWrite; this.throwUnknownException = throwUnknownException; + if (fail.fail()) { + throw new MockDirectoryWrapper.FakeIOException(); + } + } + + @Override + public int read(ByteBuffer dst) throws IOException { + if (fail.fail()) { + throw new MockDirectoryWrapper.FakeIOException(); + } + return super.read(dst); + } + + @Override + public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { + if (fail.fail()) { + throw new MockDirectoryWrapper.FakeIOException(); + } + return super.read(dsts, offset, length); } @Override @@ -1570,7 +1637,7 @@ public class TranslogTests extends ESTestCase { public int write(ByteBuffer src) throws IOException { - if (fail.get()) { + if (fail.fail()) { if (partialWrite) { if (src.hasRemaining()) { final int pos = src.position(); @@ -1590,6 +1657,22 @@ public class TranslogTests extends ESTestCase { } return super.write(src); } + + @Override + public void force(boolean metaData) throws IOException { + if (fail.fail()) { + throw new MockDirectoryWrapper.FakeIOException(); + } + super.force(metaData); + } + + @Override + public long position() throws IOException { + if (fail.fail()) { + throw new MockDirectoryWrapper.FakeIOException(); + } + return super.position(); + } } private static final class UnknownException extends RuntimeException { @@ -1711,4 +1794,78 @@ public class TranslogTests extends ESTestCase { } } + /** + * This test adds operations to the translog which might randomly throw an IOException. The only thing this test verifies is + * that we can, after we hit an exception, open and recover the translog successfully and retrieve all successfully synced operations + * from the transaction log. + */ + public void testWithRandomException() throws IOException { + final int runs = randomIntBetween(5, 10); + for (int run = 0; run < runs; run++) { + Path tempDir = createTempDir(); + final FailSwitch fail = new FailSwitch(); + fail.failRandomly(); + TranslogConfig config = getTranslogConfig(tempDir); + final int numOps = randomIntBetween(100, 200); + List syncedDocs = new ArrayList<>(); + List unsynced = new ArrayList<>(); + if (randomBoolean()) { + fail.onceFailedFailAlways(); + } + try { + final Translog failableTLog = getFailableTranslog(fail, config, randomBoolean(), false); + try { + LineFileDocs lineFileDocs = new LineFileDocs(random()); //writes pretty big docs so we cross buffer boarders regularly + for (int opsAdded = 0; opsAdded < numOps; opsAdded++) { + String doc = lineFileDocs.nextDoc().toString(); + failableTLog.add(new Translog.Index("test", "" + opsAdded, doc.getBytes(Charset.forName("UTF-8")))); + unsynced.add(doc); + if (randomBoolean()) { + failableTLog.sync(); + syncedDocs.addAll(unsynced); + unsynced.clear(); + } + if (randomFloat() < 0.1) { + failableTLog.sync(); // we have to sync here first otherwise we don't know if the sync succeeded if the commit fails + syncedDocs.addAll(unsynced); + unsynced.clear(); + if (randomBoolean()) { + failableTLog.prepareCommit(); + } + failableTLog.commit(); + syncedDocs.clear(); + } + } + } catch (TranslogException | MockDirectoryWrapper.FakeIOException ex) { + // fair enough + } catch (IOException ex) { + assertEquals(ex.getMessage(), "__FAKE__ no space left on device"); + } finally { + config.setTranslogGeneration(failableTLog.getGeneration()); + IOUtils.closeWhileHandlingException(failableTLog); + } + } catch (TranslogException | MockDirectoryWrapper.FakeIOException ex) { + // failed - that's ok, we didn't even create it + } + // now randomly open this failing tlog again just to make sure we can also recover from failing during recovery + if (randomBoolean()) { + try { + IOUtils.close(getFailableTranslog(fail, config, randomBoolean(), false)); + } catch (TranslogException | MockDirectoryWrapper.FakeIOException ex) { + // failed - that's ok, we didn't even create it + } + } + + try (Translog translog = new Translog(config)) { + try (Translog.Snapshot snapshot = translog.newSnapshot()) { + assertEquals(syncedDocs.size(), snapshot.estimatedTotalOperations()); + for (int i = 0; i < syncedDocs.size(); i++) { + Translog.Operation next = snapshot.next(); + assertEquals(syncedDocs.get(i), next.getSource().source.toUtf8()); + assertNotNull("operation " + i + " must be non-null", next); + } + } + } + } + } } From d5e6eb58a8120d42341b7dad6669f47ce81c3e86 Mon Sep 17 00:00:00 2001 From: Boaz Leskes Date: Thu, 7 Jan 2016 13:47:02 +0100 Subject: [PATCH 40/59] Log uncaught exceptions from scheduled once tasks `ScheduledThreadPoolExecutor` allows you to schedule tasks to run once or periodically at the future. If such a task throws an exception, that exception is caught and reported in the future that `ScheduledThreadPoolExecutor#schedule` returns. However, we typically do not capture the future / do not test it for errors. This results in exception being swallowed and not reported. To mitigate this we now wrap any command in a LoggingRunnable (already used for periodic tasks). Also, RunnableCommand is changed not to swallow exception but percolate them further for reporting by the future. Closes #15824 --- .../src/main/java/org/elasticsearch/threadpool/ThreadPool.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java index 5d0c814a285..2a6d440c707 100644 --- a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java +++ b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java @@ -357,7 +357,7 @@ public class ThreadPool extends AbstractComponent { if (!Names.SAME.equals(name)) { command = new ThreadedRunnable(command, executor(name)); } - return scheduler.schedule(command, delay.millis(), TimeUnit.MILLISECONDS); + return scheduler.schedule(new LoggingRunnable(command), delay.millis(), TimeUnit.MILLISECONDS); } public void shutdown() { @@ -633,6 +633,7 @@ public class ThreadPool extends AbstractComponent { runnable.run(); } catch (Throwable t) { logger.warn("failed to run {}", t, runnable.toString()); + throw t; } } From 6ce7a972bc6025a3c8b32320eca11e77d85597e5 Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Thu, 7 Jan 2016 14:43:18 +0100 Subject: [PATCH 41/59] Make MetaData parsing less lenient. Today this simply ignores everything that is not recognized. --- .../cluster/metadata/IndexMetaData.java | 17 +++++++++ .../cluster/metadata/MetaData.java | 18 +++++++-- .../cluster/metadata/MetaDataTests.java | 38 +++++++++++++++++++ 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java index d7b70b8ca8f..c1f10079768 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java @@ -859,10 +859,16 @@ public class IndexMetaData implements Diffable, FromXContentBuild if (parser.currentToken() == XContentParser.Token.START_OBJECT) { // on a start object move to next token parser.nextToken(); } + if (parser.currentToken() != XContentParser.Token.FIELD_NAME) { + throw new IllegalArgumentException("expected field name but got a " + parser.currentToken()); + } Builder builder = new Builder(parser.currentName()); String currentFieldName = null; XContentParser.Token token = parser.nextToken(); + if (token != XContentParser.Token.START_OBJECT) { + throw new IllegalArgumentException("expected object but got a " + token); + } while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); @@ -877,6 +883,8 @@ public class IndexMetaData implements Diffable, FromXContentBuild String mappingType = currentFieldName; Map mappingSource = MapBuilder.newMapBuilder().put(mappingType, parser.mapOrdered()).map(); builder.putMapping(new MappingMetaData(mappingType, mappingSource)); + } else { + throw new IllegalArgumentException("Unexpected token: " + token); } } } else if ("aliases".equals(currentFieldName)) { @@ -896,6 +904,8 @@ public class IndexMetaData implements Diffable, FromXContentBuild } } builder.putActiveAllocationIds(Integer.valueOf(shardId), allocationIds); + } else { + throw new IllegalArgumentException("Unexpected token: " + token); } } } else if ("warmers".equals(currentFieldName)) { @@ -904,6 +914,7 @@ public class IndexMetaData implements Diffable, FromXContentBuild // ignore: warmers have been removed in 3.0 and are // simply ignored when upgrading from 2.x assert Version.CURRENT.major <= 3; + parser.skipChildren(); } else { // check if its a custom index metadata Custom proto = lookupPrototype(currentFieldName); @@ -928,13 +939,19 @@ public class IndexMetaData implements Diffable, FromXContentBuild } } } + } else { + throw new IllegalArgumentException("Unexpected field for an array " + currentFieldName); } } else if (token.isValue()) { if ("state".equals(currentFieldName)) { builder.state(State.fromString(parser.text())); } else if ("version".equals(currentFieldName)) { builder.version(parser.longValue()); + } else { + throw new IllegalArgumentException("Unexpected field [" + currentFieldName + "]"); } + } else { + throw new IllegalArgumentException("Unexpected token " + token); } } return builder.build(); diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java index d96e1f17a0b..002d1a51107 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java @@ -1074,14 +1074,20 @@ public class MetaData implements Iterable, Diffable, Fr if (token == XContentParser.Token.START_OBJECT) { // move to the field name (meta-data) token = parser.nextToken(); + if (token != XContentParser.Token.FIELD_NAME) { + throw new IllegalArgumentException("Expected a field name but got " + token); + } // move to the next object token = parser.nextToken(); } currentFieldName = parser.currentName(); - if (token == null) { - // no data... - return builder.build(); - } + } + + if (!"meta-data".equals(parser.currentName())) { + throw new IllegalArgumentException("Expected [meta-data] as a field name but got " + currentFieldName); + } + if (token != XContentParser.Token.START_OBJECT) { + throw new IllegalArgumentException("Expected a START_OBJECT but got " + token); } while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { @@ -1114,7 +1120,11 @@ public class MetaData implements Iterable, Diffable, Fr builder.version = parser.longValue(); } else if ("cluster_uuid".equals(currentFieldName) || "uuid".equals(currentFieldName)) { builder.clusterUUID = parser.text(); + } else { + throw new IllegalArgumentException("Unexpected field [" + currentFieldName + "]"); } + } else { + throw new IllegalArgumentException("Unexpected token " + token); } } return builder.build(); diff --git a/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataTests.java b/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataTests.java index 91a421ee420..4076286ce5d 100644 --- a/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataTests.java +++ b/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataTests.java @@ -20,9 +20,15 @@ package org.elasticsearch.cluster.metadata; import org.elasticsearch.Version; +import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.test.ESTestCase; +import java.io.IOException; + import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; @@ -110,4 +116,36 @@ public class MetaDataTests extends ESTestCase { assertThat(ex.getMessage(), is("index/alias [alias2] provided with routing value [1,2] that resolved to several routing values, rejecting operation")); } } + + public void testUnknownFieldClusterMetaData() throws IOException { + BytesReference metadata = JsonXContent.contentBuilder() + .startObject() + .startObject("meta-data") + .field("random", "value") + .endObject() + .endObject().bytes(); + XContentParser parser = JsonXContent.jsonXContent.createParser(metadata); + try { + MetaData.Builder.fromXContent(parser); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("Unexpected field [random]", e.getMessage()); + } + } + + public void testUnknownFieldIndexMetaData() throws IOException { + BytesReference metadata = JsonXContent.contentBuilder() + .startObject() + .startObject("index_name") + .field("random", "value") + .endObject() + .endObject().bytes(); + XContentParser parser = JsonXContent.jsonXContent.createParser(metadata); + try { + IndexMetaData.Builder.fromXContent(parser); + fail(); + } catch (IllegalArgumentException e) { + assertEquals("Unexpected field [random]", e.getMessage()); + } + } } From f93b4cb2158fec832a45e862929f2f4c7e539de5 Mon Sep 17 00:00:00 2001 From: Britta Weber Date: Thu, 7 Jan 2016 16:27:40 +0100 Subject: [PATCH 42/59] sync translog to disk after recovery from primary Otherwise if that node is shutdown and restarted it might will have lost all operations that were in the translog. --- .../shard/TranslogRecoveryPerformer.java | 1 + .../index/shard/IndexShardTests.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java b/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java index 88df4ee8da7..4811ff1a275 100644 --- a/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java +++ b/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java @@ -70,6 +70,7 @@ public class TranslogRecoveryPerformer { performRecoveryOperation(engine, operation, false); numOps++; } + engine.getTranslog().sync(); } catch (Throwable t) { throw new BatchOperationException(shardId, "failed to apply batch translog operation", numOps, t); } diff --git a/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java b/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java index 64ec036ea1a..66e0a0655d6 100644 --- a/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java +++ b/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java @@ -100,8 +100,10 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; @@ -113,6 +115,7 @@ import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_VERSION_CREATED; import static org.elasticsearch.common.settings.Settings.settingsBuilder; import static org.elasticsearch.common.xcontent.ToXContent.EMPTY_PARAMS; +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; @@ -1054,4 +1057,29 @@ public class IndexShardTests extends ESSingleNodeTestCase { return newShard; } + public void testTranslogRecoverySyncsTranslog() throws IOException { + createIndex("testindexfortranslogsync"); + client().admin().indices().preparePutMapping("testindexfortranslogsync").setType("testtype").setSource(jsonBuilder().startObject() + .startObject("testtype") + .startObject("properties") + .startObject("foo") + .field("type", "string") + .endObject() + .endObject().endObject().endObject()).get(); + ensureGreen(); + IndicesService indicesService = getInstanceFromNode(IndicesService.class); + IndexService test = indicesService.indexService("testindexfortranslogsync"); + IndexShard shard = test.getShardOrNull(0); + ShardRouting routing = new ShardRouting(shard.routingEntry()); + test.removeShard(0, "b/c britta says so"); + IndexShard newShard = test.createShard(routing); + DiscoveryNode localNode = new DiscoveryNode("foo", DummyTransportAddress.INSTANCE, Version.CURRENT); + newShard.markAsRecovering("for testing", new RecoveryState(newShard.shardId(), routing.primary(), RecoveryState.Type.REPLICA, localNode, localNode)); + List operations = new ArrayList<>(); + operations.add(new Translog.Index("testtype", "1", jsonBuilder().startObject().field("foo", "bar").endObject().bytes().toBytes())); + newShard.prepareForIndexRecovery(); + newShard.performTranslogRecovery(true); + newShard.performBatchRecovery(operations); + assertFalse(newShard.getTranslog().syncNeeded()); + } } From 6243d375eb8314a4dc8e8bf9b369ba2754d68b14 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Thu, 7 Jan 2016 10:19:24 -0500 Subject: [PATCH 43/59] Add documentation for global search timeout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds documentation for the global search timeout setting “search.default_search_timeout”. --- docs/reference/search.asciidoc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/reference/search.asciidoc b/docs/reference/search.asciidoc index da7d2e5ee4b..a4de20ee213 100644 --- a/docs/reference/search.asciidoc +++ b/docs/reference/search.asciidoc @@ -73,6 +73,19 @@ the request with two different groups: } -------------------------------------------------- +[float] +[[global-search-timeout]] +== Global Search Timeout + +Individual searches can have a timeout as part of the +<>. Since search requests can originate from many +sources, Elasticsearch has a dynamic cluster-level setting for a global +search timeout that applies to all search requests that do not set a +timeout in the <>. The default value is no global +timeout. The setting key is `search.default_search_timeout` and can be +set using the <> endpoints. Setting this value +to `-1` resets the global search timeout to no timeout. + -- include::search/search.asciidoc[] From 3ef9ec25f83b15af5127ec45a6afacf33a8f5508 Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Thu, 7 Jan 2016 18:50:14 +0100 Subject: [PATCH 44/59] BitSetFilterCache duplicates its content. We have a bug that makes all per-index bitset caches store bitsets for all indices. In the case that you have many indices, which is fairly common with time-based data, this could translate to a lot of wasted memory. Closes #15820 --- .../index/cache/bitset/BitsetFilterCache.java | 11 +++++ .../cache/bitset/BitSetFilterCacheTests.java | 44 ++++++++++++++++++- .../AbstractStringFieldDataTestCase.java | 7 ++- .../AbstractNumberNestedSortingTestCase.java | 7 ++- .../search/nested/NestedSortingTests.java | 11 ++++- .../bucket/nested/NestedAggregatorTests.java | 6 ++- 6 files changed, 79 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java b/core/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java index 4e9ecf569d0..1de139aa695 100644 --- a/core/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java +++ b/core/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java @@ -118,6 +118,12 @@ public final class BitsetFilterCache extends AbstractIndexComponent implements L private BitSet getAndLoadIfNotPresent(final Query query, final LeafReaderContext context) throws IOException, ExecutionException { final Object coreCacheReader = context.reader().getCoreCacheKey(); final ShardId shardId = ShardUtils.extractShardId(context.reader()); + if (shardId != null // can't require it because of the percolator + && indexSettings.getIndex().getName().equals(shardId.getIndex()) == false) { + // insanity + throw new IllegalStateException("Trying to load bit set for index [" + shardId.getIndex() + + "] with cache of index [" + indexSettings.getIndex().getName() + "]"); + } Cache filterToFbs = loadedFilters.computeIfAbsent(coreCacheReader, key -> { context.reader().addCoreClosedListener(BitsetFilterCache.this); return CacheBuilder.builder().build(); @@ -208,6 +214,11 @@ public final class BitsetFilterCache extends AbstractIndexComponent implements L @Override public IndicesWarmer.TerminationHandle warmNewReaders(final IndexShard indexShard, final Engine.Searcher searcher) { + if (indexSettings.getIndex().equals(indexShard.getIndexSettings().getIndex()) == false) { + // this is from a different index + return TerminationHandle.NO_WAIT; + } + if (!loadRandomAccessFiltersEagerly) { return TerminationHandle.NO_WAIT; } diff --git a/core/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java b/core/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java index d2bf6bebc5c..69831d7471a 100644 --- a/core/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java +++ b/core/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java @@ -31,8 +31,11 @@ import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.LogByteSizeMergePolicy; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.join.BitSetProducer; +import org.apache.lucene.store.BaseDirectoryWrapper; +import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Accountable; import org.apache.lucene.util.BitSet; @@ -89,7 +92,8 @@ public class BitSetFilterCacheTests extends ESTestCase { writer.addDocument(document); writer.commit(); - IndexReader reader = DirectoryReader.open(writer, false); + DirectoryReader reader = DirectoryReader.open(writer, false); + reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(new Index("test"), 0)); IndexSearcher searcher = new IndexSearcher(reader); BitsetFilterCache cache = new BitsetFilterCache(INDEX_SETTINGS, warmer, new BitsetFilterCache.Listener() { @@ -114,6 +118,7 @@ public class BitSetFilterCacheTests extends ESTestCase { writer.forceMerge(1); reader.close(); reader = DirectoryReader.open(writer, false); + reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(new Index("test"), 0)); searcher = new IndexSearcher(reader); assertThat(matchCount(filter, reader), equalTo(3)); @@ -139,7 +144,7 @@ public class BitSetFilterCacheTests extends ESTestCase { writer.addDocument(document); writer.commit(); final DirectoryReader writerReader = DirectoryReader.open(writer, false); - final IndexReader reader = randomBoolean() ? writerReader : ElasticsearchDirectoryReader.wrap(writerReader, new ShardId("test", 0)); + final IndexReader reader = ElasticsearchDirectoryReader.wrap(writerReader, new ShardId("test", 0)); final AtomicLong stats = new AtomicLong(); final AtomicInteger onCacheCalls = new AtomicInteger(); @@ -192,4 +197,39 @@ public class BitSetFilterCacheTests extends ESTestCase { } } + public void testRejectOtherIndex() throws IOException { + BitsetFilterCache cache = new BitsetFilterCache(INDEX_SETTINGS, warmer, new BitsetFilterCache.Listener() { + @Override + public void onCache(ShardId shardId, Accountable accountable) { + + } + + @Override + public void onRemoval(ShardId shardId, Accountable accountable) { + + } + }); + + Directory dir = newDirectory(); + IndexWriter writer = new IndexWriter( + dir, + newIndexWriterConfig() + ); + writer.addDocument(new Document()); + DirectoryReader reader = DirectoryReader.open(writer, true); + writer.close(); + reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(new Index("test2"), 0)); + + BitSetProducer producer = cache.getBitSetProducer(new MatchAllDocsQuery()); + + try { + producer.getBitSet(reader.leaves().get(0)); + fail(); + } catch (IllegalStateException expected) { + assertEquals("Trying to load bit set for index [test2] with cache of index [test]", expected.getMessage()); + } finally { + IOUtils.close(reader, dir); + } + } + } diff --git a/core/src/test/java/org/elasticsearch/index/fielddata/AbstractStringFieldDataTestCase.java b/core/src/test/java/org/elasticsearch/index/fielddata/AbstractStringFieldDataTestCase.java index 024a90ce7ba..82b2cca79aa 100644 --- a/core/src/test/java/org/elasticsearch/index/fielddata/AbstractStringFieldDataTestCase.java +++ b/core/src/test/java/org/elasticsearch/index/fielddata/AbstractStringFieldDataTestCase.java @@ -46,12 +46,15 @@ import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.FixedBitSet; import org.apache.lucene.util.TestUtil; import org.apache.lucene.util.UnicodeUtil; +import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader; import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.Index; import org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource; import org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource.Nested; import org.elasticsearch.index.fielddata.fieldcomparator.BytesRefFieldComparatorSource; import org.elasticsearch.index.fielddata.ordinals.GlobalOrdinalsIndexFieldData; +import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.search.MultiValueMode; import java.io.IOException; @@ -385,7 +388,9 @@ public abstract class AbstractStringFieldDataTestCase extends AbstractFieldDataI writer.commit(); } } - IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(writer, true)); + DirectoryReader directoryReader = DirectoryReader.open(writer, true); + directoryReader = ElasticsearchDirectoryReader.wrap(directoryReader, new ShardId(new Index("test"), 0)); + IndexSearcher searcher = new IndexSearcher(directoryReader); IndexFieldData fieldData = getForField("text"); final Object missingValue; switch (randomInt(4)) { diff --git a/core/src/test/java/org/elasticsearch/index/search/nested/AbstractNumberNestedSortingTestCase.java b/core/src/test/java/org/elasticsearch/index/search/nested/AbstractNumberNestedSortingTestCase.java index fa27323c13a..65dfd8a5af4 100644 --- a/core/src/test/java/org/elasticsearch/index/search/nested/AbstractNumberNestedSortingTestCase.java +++ b/core/src/test/java/org/elasticsearch/index/search/nested/AbstractNumberNestedSortingTestCase.java @@ -36,11 +36,14 @@ import org.apache.lucene.search.TopFieldDocs; import org.apache.lucene.search.join.QueryBitSetProducer; import org.apache.lucene.search.join.ScoreMode; import org.apache.lucene.search.join.ToParentBlockJoinQuery; +import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader; import org.elasticsearch.common.lucene.search.Queries; +import org.elasticsearch.index.Index; import org.elasticsearch.index.fielddata.AbstractFieldDataTestCase; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource; import org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource.Nested; +import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.search.MultiValueMode; import java.io.IOException; @@ -216,7 +219,9 @@ public abstract class AbstractNumberNestedSortingTestCase extends AbstractFieldD writer.addDocument(document); MultiValueMode sortMode = MultiValueMode.SUM; - IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(writer, false)); + DirectoryReader directoryReader = DirectoryReader.open(writer, false); + directoryReader = ElasticsearchDirectoryReader.wrap(directoryReader, new ShardId(new Index("test"), 0)); + IndexSearcher searcher = new IndexSearcher(directoryReader); Query parentFilter = new TermQuery(new Term("__type", "parent")); Query childFilter = Queries.not(parentFilter); XFieldComparatorSource nestedComparatorSource = createFieldComparator("field2", sortMode, null, createNested(searcher, parentFilter, childFilter)); diff --git a/core/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java b/core/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java index 49af5f0b82e..a58fea831d5 100644 --- a/core/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java +++ b/core/src/test/java/org/elasticsearch/index/search/nested/NestedSortingTests.java @@ -40,8 +40,10 @@ import org.apache.lucene.search.join.ScoreMode; import org.apache.lucene.search.join.ToParentBlockJoinQuery; import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.TestUtil; +import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader; import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.Index; import org.elasticsearch.index.fielddata.AbstractFieldDataTestCase; import org.elasticsearch.index.fielddata.FieldDataType; import org.elasticsearch.index.fielddata.IndexFieldData; @@ -49,6 +51,7 @@ import org.elasticsearch.index.fielddata.IndexFieldData.XFieldComparatorSource; import org.elasticsearch.index.fielddata.NoOrdinalsStringFieldDataTests; import org.elasticsearch.index.fielddata.fieldcomparator.BytesRefFieldComparatorSource; import org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData; +import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.search.MultiValueMode; import java.io.IOException; @@ -91,7 +94,9 @@ public class NestedSortingTests extends AbstractFieldDataTestCase { writer.commit(); MultiValueMode sortMode = randomFrom(Arrays.asList(MultiValueMode.MIN, MultiValueMode.MAX)); - IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(writer, false)); + DirectoryReader reader = DirectoryReader.open(writer, false); + reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(new Index("test"), 0)); + IndexSearcher searcher = new IndexSearcher(reader); PagedBytesIndexFieldData indexFieldData1 = getForField("f"); IndexFieldData indexFieldData2 = NoOrdinalsStringFieldDataTests.hideOrdinals(indexFieldData1); final String missingValue = randomBoolean() ? null : TestUtil.randomSimpleString(getRandom(), 2); @@ -274,7 +279,9 @@ public class NestedSortingTests extends AbstractFieldDataTestCase { writer.addDocument(document); MultiValueMode sortMode = MultiValueMode.MIN; - IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(writer, false)); + DirectoryReader reader = DirectoryReader.open(writer, false); + reader = ElasticsearchDirectoryReader.wrap(reader, new ShardId(new Index("test"), 0)); + IndexSearcher searcher = new IndexSearcher(reader); PagedBytesIndexFieldData indexFieldData = getForField("field2"); Query parentFilter = new TermQuery(new Term("__type", "parent")); Query childFilter = Queries.not(parentFilter); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java index b5ef5d9eb4f..17e8fd35073 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/nested/NestedAggregatorTests.java @@ -34,10 +34,13 @@ import org.apache.lucene.search.TermQuery; import org.apache.lucene.store.Directory; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.common.compress.CompressedXContent; +import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader; import org.elasticsearch.common.lucene.search.Queries; +import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.mapper.internal.TypeFieldMapper; import org.elasticsearch.index.mapper.internal.UidFieldMapper; +import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.search.aggregations.Aggregator; import org.elasticsearch.search.aggregations.AggregatorFactories; import org.elasticsearch.search.aggregations.BucketCollector; @@ -110,7 +113,8 @@ public class NestedAggregatorTests extends ESSingleNodeTestCase { indexWriter.commit(); indexWriter.close(); - DirectoryReader directoryReader = DirectoryReader.open(directory); + DirectoryReader directoryReader = DirectoryReader.open(directory); + directoryReader = ElasticsearchDirectoryReader.wrap(directoryReader, new ShardId(new Index("test"), 0)); IndexSearcher searcher = new IndexSearcher(directoryReader); IndexService indexService = createIndex("test"); From 8fbb3686cd9097042c2292cdcb1dfabde1c34b01 Mon Sep 17 00:00:00 2001 From: Igor Motov Date: Thu, 7 Jan 2016 19:33:50 -0500 Subject: [PATCH 45/59] Improve stability of the testBatchingShardUpdateTask test On slow machines when this test randomly picks a large number of shards it can occasionally take more than 32.5 seconds to snapshot all shards. That is causing the test to miss the second to last assert in awaitsBusy at 32.5 seconds and then timeout in BlockingClusterStateListener at 60 seconds. Due to the timeout, the pending task queue is cleaned before the last awaitsBusy assert at 65 seconds and as a result the last assert runs on a completely empty queue and fails with a very confusing assert error. This commit makes the timeout in BlockingClusterStateListener to occur after the last assert in assertBusyPendingTasks and therefore allows assertBusyPendingTasks to perform the last assert before cleaning the pending tasks queue takes place. This commit also reduces the maximum number of shards used in the test to 10 in order to speed up this test. --- .../snapshots/AbstractSnapshotIntegTestCase.java | 5 ++++- .../snapshots/SharedClusterSnapshotRestoreIT.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/org/elasticsearch/snapshots/AbstractSnapshotIntegTestCase.java b/core/src/test/java/org/elasticsearch/snapshots/AbstractSnapshotIntegTestCase.java index 1ef3fddcf8e..c6e93204b66 100644 --- a/core/src/test/java/org/elasticsearch/snapshots/AbstractSnapshotIntegTestCase.java +++ b/core/src/test/java/org/elasticsearch/snapshots/AbstractSnapshotIntegTestCase.java @@ -176,7 +176,10 @@ public abstract class AbstractSnapshotIntegTestCase extends ESIntegTestCase { private long stopWaitingAt = -1; public BlockingClusterStateListener(ClusterService clusterService, String blockOn, String countOn, Priority passThroughPriority) { - this(clusterService, blockOn, countOn, passThroughPriority, TimeValue.timeValueMinutes(1)); + // Waiting for the 70 seconds here to make sure that the last check at 65 sec mark in assertBusyPendingTasks has a chance + // to finish before we timeout on the cluster state block. Otherwise the last check in assertBusyPendingTasks kicks in + // after the cluster state block clean up takes place and it's assert doesn't reflect the actual failure + this(clusterService, blockOn, countOn, passThroughPriority, TimeValue.timeValueSeconds(70)); } public BlockingClusterStateListener(ClusterService clusterService, final String blockOn, final String countOn, Priority passThroughPriority, TimeValue timeout) { diff --git a/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java b/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java index 669527fd5f3..e8ff9674eed 100644 --- a/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java +++ b/core/src/test/java/org/elasticsearch/snapshots/SharedClusterSnapshotRestoreIT.java @@ -1943,7 +1943,7 @@ public class SharedClusterSnapshotRestoreIT extends AbstractSnapshotIntegTestCas .put("compress", randomBoolean()) .put("chunk_size", randomIntBetween(100, 1000), ByteSizeUnit.BYTES))); - assertAcked(prepareCreate("test-idx", 0, settingsBuilder().put("number_of_shards", between(1, 20)) + assertAcked(prepareCreate("test-idx", 0, settingsBuilder().put("number_of_shards", between(1, 10)) .put("number_of_replicas", 0))); ensureGreen(); From 71796e2319edf248f5529142e85659038997e60e Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Fri, 8 Jan 2016 13:08:40 +0100 Subject: [PATCH 46/59] [TEST] Close failable translog in a controlled way otherwise assertions are off in the test --- .../org/elasticsearch/index/translog/TranslogTests.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java index ddd8c2f649f..da5e5c8aa08 100644 --- a/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java +++ b/core/src/test/java/org/elasticsearch/index/translog/TranslogTests.java @@ -1836,6 +1836,12 @@ public class TranslogTests extends ESTestCase { syncedDocs.clear(); } } + // we survived all the randomness!!! + // lets close the translog and if it succeeds we are all synced again. If we don't do this we will close + // it in the finally block but miss to copy over unsynced docs to syncedDocs and fail the assertion down the road... + failableTLog.close(); + syncedDocs.addAll(unsynced); + unsynced.clear(); } catch (TranslogException | MockDirectoryWrapper.FakeIOException ex) { // fair enough } catch (IOException ex) { From 21f5b0ff357c6d74356281cf602993fbcfc3da84 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 8 Jan 2016 11:56:26 -0500 Subject: [PATCH 47/59] Remove dead o.e.c.m.UnboxedMathUtils This commit removes the dead UnboxedMathUtils from the codebase. --- .../common/math/UnboxedMathUtils.java | 593 ------------------ 1 file changed, 593 deletions(-) delete mode 100644 core/src/main/java/org/elasticsearch/common/math/UnboxedMathUtils.java diff --git a/core/src/main/java/org/elasticsearch/common/math/UnboxedMathUtils.java b/core/src/main/java/org/elasticsearch/common/math/UnboxedMathUtils.java deleted file mode 100644 index 6c8e0b45f70..00000000000 --- a/core/src/main/java/org/elasticsearch/common/math/UnboxedMathUtils.java +++ /dev/null @@ -1,593 +0,0 @@ -/* - * 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.common.math; - -import org.elasticsearch.common.SuppressForbidden; - -import java.util.concurrent.ThreadLocalRandom; - -/** - * - */ -public class UnboxedMathUtils { - - public static double sin(Short a) { - return Math.sin(a.doubleValue()); - } - - public static double sin(Integer a) { - return Math.sin(a.doubleValue()); - } - - public static double sin(Float a) { - return Math.sin(a.doubleValue()); - } - - public static double sin(Long a) { - return Math.sin(a.doubleValue()); - } - - public static double sin(Double a) { - return Math.sin(a); - } - - public static double cos(Short a) { - return Math.cos(a.doubleValue()); - } - - public static double cos(Integer a) { - return Math.cos(a.doubleValue()); - } - - public static double cos(Float a) { - return Math.cos(a.doubleValue()); - } - - public static double cos(Long a) { - return Math.cos(a.doubleValue()); - } - - public static double cos(Double a) { - return Math.cos(a); - } - - public static double tan(Short a) { - return Math.tan(a.doubleValue()); - } - - public static double tan(Integer a) { - return Math.tan(a.doubleValue()); - } - - public static double tan(Float a) { - return Math.tan(a.doubleValue()); - } - - public static double tan(Long a) { - return Math.tan(a.doubleValue()); - } - - public static double tan(Double a) { - return Math.tan(a); - } - - public static double asin(Short a) { - return Math.asin(a.doubleValue()); - } - - public static double asin(Integer a) { - return Math.asin(a.doubleValue()); - } - - public static double asin(Float a) { - return Math.asin(a.doubleValue()); - } - - public static double asin(Long a) { - return Math.asin(a.doubleValue()); - } - - public static double asin(Double a) { - return Math.asin(a); - } - - public static double acos(Short a) { - return Math.acos(a.doubleValue()); - } - - - public static double acos(Integer a) { - return Math.acos(a.doubleValue()); - } - - - public static double acos(Float a) { - return Math.acos(a.doubleValue()); - } - - public static double acos(Long a) { - return Math.acos(a.doubleValue()); - } - - public static double acos(Double a) { - return Math.acos(a); - } - - public static double atan(Short a) { - return Math.atan(a.doubleValue()); - } - - public static double atan(Integer a) { - return Math.atan(a.doubleValue()); - } - - public static double atan(Float a) { - return Math.atan(a.doubleValue()); - } - - public static double atan(Long a) { - return Math.atan(a.doubleValue()); - } - - public static double atan(Double a) { - return Math.atan(a); - } - - public static double toRadians(Short angdeg) { - return Math.toRadians(angdeg.doubleValue()); - } - - public static double toRadians(Integer angdeg) { - return Math.toRadians(angdeg.doubleValue()); - } - - public static double toRadians(Float angdeg) { - return Math.toRadians(angdeg.doubleValue()); - } - - public static double toRadians(Long angdeg) { - return Math.toRadians(angdeg.doubleValue()); - } - - public static double toRadians(Double angdeg) { - return Math.toRadians(angdeg); - } - - public static double toDegrees(Short angrad) { - return Math.toDegrees(angrad.doubleValue()); - } - - public static double toDegrees(Integer angrad) { - return Math.toDegrees(angrad.doubleValue()); - } - - public static double toDegrees(Float angrad) { - return Math.toDegrees(angrad.doubleValue()); - } - - public static double toDegrees(Long angrad) { - return Math.toDegrees(angrad.doubleValue()); - } - - public static double toDegrees(Double angrad) { - return Math.toDegrees(angrad); - } - - public static double exp(Short a) { - return Math.exp(a.doubleValue()); - } - - public static double exp(Integer a) { - return Math.exp(a.doubleValue()); - } - - public static double exp(Float a) { - return Math.exp(a.doubleValue()); - } - - public static double exp(Long a) { - return Math.exp(a.doubleValue()); - } - - public static double exp(Double a) { - return Math.exp(a); - } - - public static double log(Short a) { - return Math.log(a.doubleValue()); - } - - public static double log(Integer a) { - return Math.log(a.doubleValue()); - } - - public static double log(Float a) { - return Math.log(a.doubleValue()); - } - - public static double log(Long a) { - return Math.log(a.doubleValue()); - } - - public static double log(Double a) { - return Math.log(a); - } - - public static double log10(Short a) { - return Math.log10(a.doubleValue()); - } - - public static double log10(Integer a) { - return Math.log10(a.doubleValue()); - } - - public static double log10(Float a) { - return Math.log10(a.doubleValue()); - } - - public static double log10(Long a) { - return Math.log10(a.doubleValue()); - } - - public static double log10(Double a) { - return Math.log10(a); - } - - public static double sqrt(Short a) { - return Math.sqrt(a.doubleValue()); - } - - public static double sqrt(Integer a) { - return Math.sqrt(a.doubleValue()); - } - - public static double sqrt(Float a) { - return Math.sqrt(a.doubleValue()); - } - - public static double sqrt(Long a) { - return Math.sqrt(a.doubleValue()); - } - - public static double sqrt(Double a) { - return Math.sqrt(a); - } - - public static double cbrt(Short a) { - return Math.cbrt(a.doubleValue()); - } - - public static double cbrt(Integer a) { - return Math.cbrt(a.doubleValue()); - } - - public static double cbrt(Float a) { - return Math.cbrt(a.doubleValue()); - } - - public static double cbrt(Long a) { - return Math.cbrt(a.doubleValue()); - } - - public static double cbrt(Double a) { - return Math.cbrt(a); - } - - public static double IEEEremainder(Short f1, Short f2) { - return Math.IEEEremainder(f1.doubleValue(), f2.doubleValue()); - } - - public static double IEEEremainder(Integer f1, Integer f2) { - return Math.IEEEremainder(f1.doubleValue(), f2.doubleValue()); - } - - public static double IEEEremainder(Float f1, Float f2) { - return Math.IEEEremainder(f1.doubleValue(), f2.doubleValue()); - } - - public static double IEEEremainder(Long f1, Long f2) { - return Math.IEEEremainder(f1.doubleValue(), f2.doubleValue()); - } - - public static double IEEEremainder(Double f1, Double f2) { - return Math.IEEEremainder(f1, f2); - } - - public static double ceil(Short a) { - return Math.ceil(a.doubleValue()); - } - - public static double ceil(Integer a) { - return Math.ceil(a.doubleValue()); - } - - public static double ceil(Float a) { - return Math.ceil(a.doubleValue()); - } - - public static double ceil(Long a) { - return Math.ceil(a.doubleValue()); - } - - public static double ceil(Double a) { - return Math.ceil(a); - } - - public static double floor(Short a) { - return Math.floor(a.doubleValue()); - } - - public static double floor(Integer a) { - return Math.floor(a.doubleValue()); - } - - public static double floor(Float a) { - return Math.floor(a.doubleValue()); - } - - public static double floor(Long a) { - return Math.floor(a.doubleValue()); - } - - public static double floor(Double a) { - return Math.floor(a); - } - - public static double rint(Short a) { - return Math.rint(a.doubleValue()); - } - - public static double rint(Integer a) { - return Math.rint(a.doubleValue()); - } - - public static double rint(Float a) { - return Math.rint(a.doubleValue()); - } - - public static double rint(Long a) { - return Math.rint(a.doubleValue()); - } - - public static double rint(Double a) { - return Math.rint(a); - } - - public static double atan2(Short y, Short x) { - return Math.atan2(y.doubleValue(), x.doubleValue()); - } - - public static double atan2(Integer y, Integer x) { - return Math.atan2(y.doubleValue(), x.doubleValue()); - } - - public static double atan2(Float y, Float x) { - return Math.atan2(y.doubleValue(), x.doubleValue()); - } - - public static double atan2(Long y, Long x) { - return Math.atan2(y.doubleValue(), x.doubleValue()); - } - - public static double atan2(Double y, Double x) { - return Math.atan2(y, x); - } - - public static double pow(Short a, Short b) { - return Math.pow(a.doubleValue(), b.doubleValue()); - } - - public static double pow(Integer a, Integer b) { - return Math.pow(a.doubleValue(), b.doubleValue()); - } - - public static double pow(Float a, Float b) { - return Math.pow(a.doubleValue(), b.doubleValue()); - } - - public static double pow(Long a, Long b) { - return Math.pow(a.doubleValue(), b.doubleValue()); - } - - public static double pow(Double a, Double b) { - return Math.pow(a, b); - } - - public static int round(Short a) { - return Math.round(a.floatValue()); - } - - public static int round(Integer a) { - return Math.round(a.floatValue()); - } - - public static int round(Float a) { - return Math.round(a); - } - - public static long round(Long a) { - return Math.round(a.doubleValue()); - } - - public static long round(Double a) { - return Math.round(a); - } - - public static double random() { - return ThreadLocalRandom.current().nextDouble(); - } - - public static double randomDouble() { - return ThreadLocalRandom.current().nextDouble(); - } - - public static double randomFloat() { - return ThreadLocalRandom.current().nextFloat(); - } - - public static double randomInt() { - return ThreadLocalRandom.current().nextInt(); - } - - public static double randomInt(Integer i) { - return ThreadLocalRandom.current().nextInt(i); - } - - public static double randomLong() { - return ThreadLocalRandom.current().nextLong(); - } - - public static double randomLong(Long l) { - return ThreadLocalRandom.current().nextLong(l); - } - - @SuppressForbidden(reason = "Math#abs is trappy") - public static int abs(Integer a) { - return Math.abs(a); - } - - @SuppressForbidden(reason = "Math#abs is trappy") - public static long abs(Long a) { - return Math.abs(a); - } - - @SuppressForbidden(reason = "Math#abs is trappy") - public static float abs(Float a) { - return Math.abs(a); - } - - @SuppressForbidden(reason = "Math#abs is trappy") - public static double abs(Double a) { - return Math.abs(a); - } - - public static int max(Integer a, Integer b) { - return Math.max(a, b); - } - - public static long max(Long a, Long b) { - return Math.max(a, b); - } - - public static float max(Float a, Float b) { - return Math.max(a, b); - } - - public static double max(Double a, Double b) { - return Math.max(a, b); - } - - public static int min(Integer a, Integer b) { - return Math.min(a, b); - } - - public static long min(Long a, Long b) { - return Math.min(a, b); - } - - public static float min(Float a, Float b) { - return Math.min(a, b); - } - - public static double min(Double a, Double b) { - return Math.min(a, b); - } - - public static double ulp(Double d) { - return Math.ulp(d); - } - - public static float ulp(Float f) { - return Math.ulp(f); - } - - public static double signum(Double d) { - return Math.signum(d); - } - - public static float signum(Float f) { - return Math.signum(f); - } - - public static double sinh(Double x) { - return Math.sinh(x); - } - - public static double cosh(Double x) { - return Math.cosh(x); - } - - public static double tanh(Double x) { - return Math.tanh(x); - } - - public static double hypot(Double x, Double y) { - return Math.hypot(x, y); - } - - public static double expm1(Double x) { - return Math.expm1(x); - } - - public static double log1p(Double x) { - return Math.log1p(x); - } - - public static double copySign(Double magnitude, Double sign) { - return Math.copySign(magnitude, sign); - } - - public static float copySign(Float magnitude, Float sign) { - return Math.copySign(magnitude, sign); - } - - public static int getExponent(Float f) { - return Math.getExponent(f); - } - - public static int getExponent(Double d) { - return Math.getExponent(d); - } - - public static double nextAfter(Double start, Double direction) { - return Math.nextAfter(start, direction); - } - - public static float nextAfter(Float start, Double direction) { - return Math.nextAfter(start, direction); - } - - public static double nextUp(Double d) { - return Math.nextUp(d); - } - - public static float nextUp(Float f) { - return Math.nextUp(f); - } - - - public static double scalb(Double d, Integer scaleFactor) { - return Math.scalb(d, scaleFactor); - } - - public static float scalb(Float f, Integer scaleFactor) { - return Math.scalb(f, scaleFactor); - } -} From 871d1b48853bc3b31376a00d8b5a74edbd64e857 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 8 Jan 2016 12:10:03 -0500 Subject: [PATCH 48/59] Remove and forbid use of j.u.c.ThreadLocalRandom This commit removes and now forbids all uses of java.util.concurrent.ThreadLocalRandom across the codebase. The underlying issue with ThreadLocalRandom is that it can not be seeded. This means that if ThreadLocalRandom is used in production code, then tests that cover any code path containing ThreadLocalRandom will be prevented from being reproducible by use of ThreadLocalRandom. Instead, using org.elasticsearch.common.random.Randomness#get will give reproducible sources of random when running under tests and otherwise still give an instance of ThreadLocalRandom when running as production code. --- .../main/resources/forbidden/all-signatures.txt | 4 +++- .../query/TransportValidateQueryAction.java | 4 ++-- .../cluster/routing/IndexRoutingTable.java | 4 ++-- .../cluster/routing/IndexShardRoutingTable.java | 4 ++-- .../java/org/elasticsearch/common/Randomness.java | 1 + .../node/internal/InternalSettingsPreparer.java | 4 ++-- .../JavaScriptScriptMultiThreadedTests.java | 14 +++++++------- .../python/PythonScriptMultiThreadedTests.java | 14 +++++++------- 8 files changed, 26 insertions(+), 23 deletions(-) diff --git a/buildSrc/src/main/resources/forbidden/all-signatures.txt b/buildSrc/src/main/resources/forbidden/all-signatures.txt index c1e65cbaf22..76cd83cdede 100644 --- a/buildSrc/src/main/resources/forbidden/all-signatures.txt +++ b/buildSrc/src/main/resources/forbidden/all-signatures.txt @@ -125,4 +125,6 @@ java.util.Collections#EMPTY_MAP java.util.Collections#EMPTY_SET java.util.Collections#shuffle(java.util.List) @ Use java.util.Collections#shuffle(java.util.List, java.util.Random) with a reproducible source of randomness -java.util.Random#() @ Use org.elasticsearch.common.random.Randomness#create for reproducible sources of randomness +@defaultMessage Use org.elasticsearch.common.Randomness#get for reproducible sources of randomness +java.util.Random#() +java.util.concurrent.ThreadLocalRandom \ No newline at end of file diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java index 326dbc01289..225ee326b95 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java @@ -37,6 +37,7 @@ import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.routing.GroupShardsIterator; import org.elasticsearch.cluster.routing.ShardRouting; import org.elasticsearch.common.ParsingException; +import org.elasticsearch.common.Randomness; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.BigArrays; @@ -59,7 +60,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicReferenceArray; /** @@ -108,7 +108,7 @@ public class TransportValidateQueryAction extends TransportBroadcastAction> routingMap = indexNameExpressionResolver.resolveSearchRouting(clusterState, Integer.toString(ThreadLocalRandom.current().nextInt(1000)), request.indices()); + Map> routingMap = indexNameExpressionResolver.resolveSearchRouting(clusterState, Integer.toString(Randomness.get().nextInt(1000)), request.indices()); return clusterService.operationRouting().searchShards(clusterState, concreteIndices, routingMap, "_local"); } diff --git a/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java b/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java index bcf489c6a2c..bb186a64a8c 100644 --- a/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java +++ b/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java @@ -26,6 +26,7 @@ import org.apache.lucene.util.CollectionUtil; import org.elasticsearch.cluster.AbstractDiffable; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MetaData; +import org.elasticsearch.common.Randomness; import org.elasticsearch.common.collect.ImmutableOpenIntMap; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -39,7 +40,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; /** * The {@link IndexRoutingTable} represents routing information for a single @@ -71,7 +71,7 @@ public class IndexRoutingTable extends AbstractDiffable imple IndexRoutingTable(String index, ImmutableOpenIntMap shards) { this.index = index; - this.shuffler = new RotationShardShuffler(ThreadLocalRandom.current().nextInt()); + this.shuffler = new RotationShardShuffler(Randomness.get().nextInt()); this.shards = shards; List allActiveShards = new ArrayList<>(); for (IntObjectCursor cursor : shards) { diff --git a/core/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java b/core/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java index d425b63b34c..bcdb7a43fef 100644 --- a/core/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java +++ b/core/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java @@ -21,6 +21,7 @@ package org.elasticsearch.cluster.routing; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; +import org.elasticsearch.common.Randomness; import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -36,7 +37,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; import static java.util.Collections.emptyMap; @@ -73,7 +73,7 @@ public class IndexShardRoutingTable implements Iterable { IndexShardRoutingTable(ShardId shardId, List shards) { this.shardId = shardId; - this.shuffler = new RotationShardShuffler(ThreadLocalRandom.current().nextInt()); + this.shuffler = new RotationShardShuffler(Randomness.get().nextInt()); this.shards = Collections.unmodifiableList(shards); ShardRouting primary = null; diff --git a/core/src/main/java/org/elasticsearch/common/Randomness.java b/core/src/main/java/org/elasticsearch/common/Randomness.java index dbfa8034b99..7f71afc1c70 100644 --- a/core/src/main/java/org/elasticsearch/common/Randomness.java +++ b/core/src/main/java/org/elasticsearch/common/Randomness.java @@ -109,6 +109,7 @@ public final class Randomness { } } + @SuppressForbidden(reason = "ThreadLocalRandom is okay when not running tests") private static Random getWithoutSeed() { assert currentMethod == null && getRandomMethod == null : "running under tests but tried to create non-reproducible random"; return ThreadLocalRandom.current(); diff --git a/core/src/main/java/org/elasticsearch/node/internal/InternalSettingsPreparer.java b/core/src/main/java/org/elasticsearch/node/internal/InternalSettingsPreparer.java index 11db520ed7d..53b86e4dce4 100644 --- a/core/src/main/java/org/elasticsearch/node/internal/InternalSettingsPreparer.java +++ b/core/src/main/java/org/elasticsearch/node/internal/InternalSettingsPreparer.java @@ -22,6 +22,7 @@ package org.elasticsearch.node.internal; import org.elasticsearch.bootstrap.BootstrapInfo; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.common.Booleans; +import org.elasticsearch.common.Randomness; import org.elasticsearch.common.Strings; import org.elasticsearch.common.cli.Terminal; import org.elasticsearch.common.collect.Tuple; @@ -41,7 +42,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.ThreadLocalRandom; import static org.elasticsearch.common.Strings.cleanPath; import static org.elasticsearch.common.settings.Settings.settingsBuilder; @@ -207,7 +207,7 @@ public class InternalSettingsPreparer { name = reader.readLine(); } } - int index = ThreadLocalRandom.current().nextInt(names.size()); + int index = Randomness.get().nextInt(names.size()); return names.get(index); } catch (IOException e) { throw new RuntimeException("Could not read node names list", e); diff --git a/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptMultiThreadedTests.java b/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptMultiThreadedTests.java index 2aa6e13a99f..b6be9f6dde0 100644 --- a/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptMultiThreadedTests.java +++ b/plugins/lang-javascript/src/test/java/org/elasticsearch/script/javascript/JavaScriptScriptMultiThreadedTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.script.javascript; +import org.elasticsearch.common.Randomness; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.script.CompiledScript; import org.elasticsearch.script.ExecutableScript; @@ -30,7 +31,6 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; import static org.hamcrest.Matchers.equalTo; @@ -53,8 +53,8 @@ public class JavaScriptScriptMultiThreadedTests extends ESTestCase { public void run() { try { barrier.await(); - long x = ThreadLocalRandom.current().nextInt(); - long y = ThreadLocalRandom.current().nextInt(); + long x = Randomness.get().nextInt(); + long y = Randomness.get().nextInt(); long addition = x + y; Map vars = new HashMap(); vars.put("x", x); @@ -95,12 +95,12 @@ public class JavaScriptScriptMultiThreadedTests extends ESTestCase { public void run() { try { barrier.await(); - long x = ThreadLocalRandom.current().nextInt(); + long x = Randomness.get().nextInt(); Map vars = new HashMap(); vars.put("x", x); ExecutableScript script = se.executable(new CompiledScript(ScriptService.ScriptType.INLINE, "testExecutableNoRuntimeParams", "js", compiled), vars); for (int i = 0; i < 100000; i++) { - long y = ThreadLocalRandom.current().nextInt(); + long y = Randomness.get().nextInt(); long addition = x + y; script.setNextVar("y", y); long result = ((Number) script.run()).longValue(); @@ -139,8 +139,8 @@ public class JavaScriptScriptMultiThreadedTests extends ESTestCase { barrier.await(); Map runtimeVars = new HashMap(); for (int i = 0; i < 100000; i++) { - long x = ThreadLocalRandom.current().nextInt(); - long y = ThreadLocalRandom.current().nextInt(); + long x = Randomness.get().nextInt(); + long y = Randomness.get().nextInt(); long addition = x + y; runtimeVars.put("x", x); runtimeVars.put("y", y); diff --git a/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptMultiThreadedTests.java b/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptMultiThreadedTests.java index 06d3da03ab8..f24cc889a70 100644 --- a/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptMultiThreadedTests.java +++ b/plugins/lang-python/src/test/java/org/elasticsearch/script/python/PythonScriptMultiThreadedTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.script.python; +import org.elasticsearch.common.Randomness; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.script.CompiledScript; import org.elasticsearch.script.ExecutableScript; @@ -30,7 +31,6 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; -import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; import static org.hamcrest.Matchers.equalTo; @@ -55,8 +55,8 @@ public class PythonScriptMultiThreadedTests extends ESTestCase { public void run() { try { barrier.await(); - long x = ThreadLocalRandom.current().nextInt(); - long y = ThreadLocalRandom.current().nextInt(); + long x = Randomness.get().nextInt(); + long y = Randomness.get().nextInt(); long addition = x + y; Map vars = new HashMap(); vars.put("x", x); @@ -97,13 +97,13 @@ public class PythonScriptMultiThreadedTests extends ESTestCase { // @Override public void run() { // try { // barrier.await(); -// long x = ThreadLocalRandom.current().nextInt(); +// long x = Randomness.get().nextInt(); // Map vars = new HashMap(); // vars.put("x", x); // ExecutableScript script = se.executable(compiled, vars); // Map runtimeVars = new HashMap(); // for (int i = 0; i < 100000; i++) { -// long y = ThreadLocalRandom.current().nextInt(); +// long y = Randomness.get().nextInt(); // long addition = x + y; // runtimeVars.put("y", y); // long result = ((Number) script.run(runtimeVars)).longValue(); @@ -143,8 +143,8 @@ public class PythonScriptMultiThreadedTests extends ESTestCase { barrier.await(); Map runtimeVars = new HashMap(); for (int i = 0; i < 10000; i++) { - long x = ThreadLocalRandom.current().nextInt(); - long y = ThreadLocalRandom.current().nextInt(); + long x = Randomness.get().nextInt(); + long y = Randomness.get().nextInt(); long addition = x + y; runtimeVars.put("x", x); runtimeVars.put("y", y); From 8568480a74492a8806e53cc24c54ce6ecef81fe8 Mon Sep 17 00:00:00 2001 From: Adrien Grand Date: Fri, 8 Jan 2016 20:03:35 +0100 Subject: [PATCH 49/59] Fix initial sizing of BytesStreamOutput. It currently tries to align to the page size (16KB) by default. However, this might waste a significant memory (if many BytesStreamOutputs are allocated) and is also useless given that BytesStreamOutput does not recycle (on the contrary to ReleasableBytesStreamOutput). So the initial size has been changed to 0. Closes #15789 --- .../elasticsearch/common/io/stream/BytesStreamOutput.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/common/io/stream/BytesStreamOutput.java b/core/src/main/java/org/elasticsearch/common/io/stream/BytesStreamOutput.java index 155a8ca02f7..2d2719a113e 100644 --- a/core/src/main/java/org/elasticsearch/common/io/stream/BytesStreamOutput.java +++ b/core/src/main/java/org/elasticsearch/common/io/stream/BytesStreamOutput.java @@ -39,10 +39,12 @@ public class BytesStreamOutput extends StreamOutput implements BytesStream { protected int count; /** - * Create a non recycling {@link BytesStreamOutput} with 1 initial page acquired. + * Create a non recycling {@link BytesStreamOutput} with an initial capacity of 0. */ public BytesStreamOutput() { - this(BigArrays.PAGE_SIZE_IN_BYTES); + // since this impl is not recycling anyway, don't bother aligning to + // the page size, this will even save memory + this(0); } /** From 2dbad1d65adfee7de8ed51a27d10d5be334862d4 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Fri, 8 Jan 2016 23:49:04 +0100 Subject: [PATCH 50/59] Merge pull request #15841 from simonw/patch-1 Fixed broken link on from-size documentation page --- docs/reference/search/request/from-size.asciidoc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/reference/search/request/from-size.asciidoc b/docs/reference/search/request/from-size.asciidoc index d19b850ec4a..0804ff27d58 100644 --- a/docs/reference/search/request/from-size.asciidoc +++ b/docs/reference/search/request/from-size.asciidoc @@ -21,6 +21,5 @@ defaults to `10`. -------------------------------------------------- Note that `from` + `size` can not be more than the `index.max_result_window` -index setting which defaults to 10,000. See the -{ref}/search-request-scroll.html[Scroll] api for more efficient ways to do deep -scrolling. +index setting which defaults to 10,000. See the <> +API for more efficient ways to do deep scrolling. From 37880040a2a52c422e7bdb4b6d497132cdde1ddb Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Sat, 9 Jan 2016 12:16:09 -0500 Subject: [PATCH 51/59] Remove unused imports from o/e/i/e/InternalEngine.java --- .../java/org/elasticsearch/index/engine/InternalEngine.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java index 1fcbbee5414..d93ce36686e 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java +++ b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java @@ -55,12 +55,10 @@ import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader; import org.elasticsearch.common.lucene.index.ElasticsearchLeafReader; import org.elasticsearch.common.lucene.uid.Versions; import org.elasticsearch.common.math.MathUtils; -import org.elasticsearch.common.metrics.CounterMetric; import org.elasticsearch.common.util.concurrent.AbstractRunnable; import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException; import org.elasticsearch.common.util.concurrent.ReleasableLock; import org.elasticsearch.index.IndexSettings; -import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.mapper.Uid; import org.elasticsearch.index.merge.MergeStats; import org.elasticsearch.index.merge.OnGoingMerge; From 54d1e35d845bde4985d1b1557143d98f42c060c4 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Sat, 9 Jan 2016 21:50:17 +0100 Subject: [PATCH 52/59] Cleanup IndexingOperationListeners infrastructure This commit reduces the former ShardIndexinService to a simple stats/metrics class, moves IndexingSlowLog to the IndexService level since it can be shared across shards of an index and is now hidden behind IndexingOperationListener. IndexingOperationListener is now a first class citizen in IndexShard and is passed in from IndexService. --- .../admin/indices/stats/CommonStats.java | 2 +- .../action/bulk/TransportShardBulkAction.java | 2 +- .../action/update/TransportUpdateAction.java | 2 +- .../elasticsearch/cluster/ClusterModule.java | 2 +- .../org/elasticsearch/index/IndexService.java | 13 +- .../index/{indexing => }/IndexingSlowLog.java | 12 +- .../index/engine/EngineConfig.java | 1 - .../index/engine/InternalEngine.java | 2 - .../indexing/IndexingOperationListener.java | 70 -------- .../elasticsearch/index/shard/IndexShard.java | 43 +++-- .../shard/IndexingOperationListener.java | 152 ++++++++++++++++ .../{indexing => shard}/IndexingStats.java | 2 +- .../InternalIndexingStats.java} | 79 +-------- .../elasticsearch/indices/IndicesService.java | 2 +- .../indices/NodeIndicesStats.java | 2 +- .../rest/action/cat/RestNodesAction.java | 2 +- .../{indexing => }/IndexingSlowLogTests.java | 4 +- .../index/shard/IndexShardTests.java | 130 ++++++++------ .../shard/IndexingOperationListenerTests.java | 162 ++++++++++++++++++ 19 files changed, 449 insertions(+), 235 deletions(-) rename core/src/main/java/org/elasticsearch/index/{indexing => }/IndexingSlowLog.java (96%) delete mode 100644 core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java create mode 100644 core/src/main/java/org/elasticsearch/index/shard/IndexingOperationListener.java rename core/src/main/java/org/elasticsearch/index/{indexing => shard}/IndexingStats.java (99%) rename core/src/main/java/org/elasticsearch/index/{indexing/ShardIndexingService.java => shard/InternalIndexingStats.java} (67%) rename core/src/test/java/org/elasticsearch/index/{indexing => }/IndexingSlowLogTests.java (94%) create mode 100644 core/src/test/java/org/elasticsearch/index/shard/IndexingOperationListenerTests.java diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/stats/CommonStats.java b/core/src/main/java/org/elasticsearch/action/admin/indices/stats/CommonStats.java index ebdc8b72c74..85644e8523e 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/stats/CommonStats.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/stats/CommonStats.java @@ -32,7 +32,7 @@ import org.elasticsearch.index.engine.SegmentsStats; import org.elasticsearch.index.fielddata.FieldDataStats; import org.elasticsearch.index.flush.FlushStats; import org.elasticsearch.index.get.GetStats; -import org.elasticsearch.index.indexing.IndexingStats; +import org.elasticsearch.index.shard.IndexingStats; import org.elasticsearch.index.merge.MergeStats; import org.elasticsearch.index.percolator.PercolateStats; import org.elasticsearch.index.recovery.RecoveryStats; diff --git a/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java b/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java index 2597695a1e2..d7d40426a6e 100644 --- a/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java +++ b/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java @@ -410,7 +410,7 @@ public class TransportShardBulkAction extends TransportReplicationAction nodeServicesProvider.getIndicesQueryCache().onClose(shardId))); if (useShadowEngine(primary, indexSettings)) { - indexShard = new ShadowIndexShard(shardId, this.indexSettings, path, store, indexCache, mapperService, similarityService, indexFieldData, engineFactory, eventListener, searcherWrapper, nodeServicesProvider); + indexShard = new ShadowIndexShard(shardId, this.indexSettings, path, store, indexCache, mapperService, similarityService, indexFieldData, engineFactory, eventListener, searcherWrapper, nodeServicesProvider); // no indexing listeners - shadow engines don't index } else { - indexShard = new IndexShard(shardId, this.indexSettings, path, store, indexCache, mapperService, similarityService, indexFieldData, engineFactory, eventListener, searcherWrapper, nodeServicesProvider); + indexShard = new IndexShard(shardId, this.indexSettings, path, store, indexCache, mapperService, similarityService, indexFieldData, engineFactory, eventListener, searcherWrapper, nodeServicesProvider, slowLog); } eventListener.indexShardStateChanged(indexShard, null, indexShard.state(), "shard created"); @@ -552,6 +554,11 @@ public final class IndexService extends AbstractIndexComponent implements IndexC } catch (Exception e) { logger.warn("failed to refresh index store settings", e); } + try { + slowLog.onRefreshSettings(settings); // this will be refactored soon anyway so duplication is ok here + } catch (Exception e) { + logger.warn("failed to refresh slowlog settings", e); + } } } diff --git a/core/src/main/java/org/elasticsearch/index/indexing/IndexingSlowLog.java b/core/src/main/java/org/elasticsearch/index/IndexingSlowLog.java similarity index 96% rename from core/src/main/java/org/elasticsearch/index/indexing/IndexingSlowLog.java rename to core/src/main/java/org/elasticsearch/index/IndexingSlowLog.java index 292c2a16e91..5cd3685b2f8 100644 --- a/core/src/main/java/org/elasticsearch/index/indexing/IndexingSlowLog.java +++ b/core/src/main/java/org/elasticsearch/index/IndexingSlowLog.java @@ -17,7 +17,7 @@ * under the License. */ -package org.elasticsearch.index.indexing; +package org.elasticsearch.index; import org.elasticsearch.common.Booleans; import org.elasticsearch.common.Strings; @@ -28,6 +28,7 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.index.engine.Engine; import org.elasticsearch.index.mapper.ParsedDocument; +import org.elasticsearch.index.shard.IndexingOperationListener; import java.io.IOException; import java.util.Locale; @@ -35,7 +36,7 @@ import java.util.concurrent.TimeUnit; /** */ -public final class IndexingSlowLog { +public final class IndexingSlowLog implements IndexingOperationListener { private boolean reformat; @@ -124,8 +125,9 @@ public final class IndexingSlowLog { } } - void postIndex(Engine.Index index, long tookInNanos) { - postIndexing(index.parsedDoc(), tookInNanos); + public void postIndex(Engine.Index index) { + final long took = index.endTime() - index.startTime(); + postIndexing(index.parsedDoc(), took); } /** @@ -192,4 +194,4 @@ public final class IndexingSlowLog { return sb.toString(); } } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java b/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java index 35f1e066d3a..4086bebfa88 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java +++ b/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java @@ -30,7 +30,6 @@ import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.codec.CodecService; -import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.shard.MergeSchedulerConfig; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.TranslogRecoveryPerformer; diff --git a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java index 1fcbbee5414..d93ce36686e 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java +++ b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java @@ -55,12 +55,10 @@ import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader; import org.elasticsearch.common.lucene.index.ElasticsearchLeafReader; import org.elasticsearch.common.lucene.uid.Versions; import org.elasticsearch.common.math.MathUtils; -import org.elasticsearch.common.metrics.CounterMetric; import org.elasticsearch.common.util.concurrent.AbstractRunnable; import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException; import org.elasticsearch.common.util.concurrent.ReleasableLock; import org.elasticsearch.index.IndexSettings; -import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.mapper.Uid; import org.elasticsearch.index.merge.MergeStats; import org.elasticsearch.index.merge.OnGoingMerge; diff --git a/core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java b/core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java deleted file mode 100644 index 39f3dd602fb..00000000000 --- a/core/src/main/java/org/elasticsearch/index/indexing/IndexingOperationListener.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.indexing; - -import org.elasticsearch.index.engine.Engine; - -/** - * An indexing listener for indexing, delete, events. - */ -public abstract class IndexingOperationListener { - - /** - * Called before the indexing occurs. - */ - public Engine.Index preIndex(Engine.Index operation) { - return operation; - } - - /** - * Called after the indexing operation occurred. - */ - public void postIndex(Engine.Index index) { - - } - - /** - * Called after the indexing operation occurred with exception. - */ - public void postIndex(Engine.Index index, Throwable ex) { - - } - - /** - * Called before the delete occurs. - */ - public Engine.Delete preDelete(Engine.Delete delete) { - return delete; - } - - - /** - * Called after the delete operation occurred. - */ - public void postDelete(Engine.Delete delete) { - - } - - /** - * Called after the delete operation occurred with exception. - */ - public void postDelete(Engine.Delete delete, Throwable ex) { - - } -} diff --git a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java index 54bd1cd8443..db5e1f7e4a5 100644 --- a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -81,8 +81,6 @@ import org.elasticsearch.index.fielddata.ShardFieldData; import org.elasticsearch.index.flush.FlushStats; import org.elasticsearch.index.get.GetStats; import org.elasticsearch.index.get.ShardGetService; -import org.elasticsearch.index.indexing.IndexingStats; -import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.DocumentMapperForType; import org.elasticsearch.index.mapper.MapperService; @@ -125,6 +123,8 @@ import java.io.IOException; import java.io.PrintStream; import java.nio.channels.ClosedByInterruptException; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -143,7 +143,7 @@ public class IndexShard extends AbstractIndexShardComponent { private final IndexCache indexCache; private final Store store; private final MergeSchedulerConfig mergeSchedulerConfig; - private final ShardIndexingService indexingService; + private final InternalIndexingStats internalIndexingStats; private final ShardSearchStats searchService; private final ShardGetService getService; private final ShardIndexWarmerService shardWarmerService; @@ -167,7 +167,6 @@ public class IndexShard extends AbstractIndexShardComponent { private final IndexEventListener indexEventListener; private final IndexSettings idxSettings; private final NodeServicesProvider provider; - private TimeValue refreshInterval; private volatile ScheduledFuture refreshScheduledFuture; @@ -176,6 +175,8 @@ public class IndexShard extends AbstractIndexShardComponent { protected final AtomicReference currentEngineReference = new AtomicReference<>(); protected final EngineFactory engineFactory; + private final IndexingOperationListener indexingOperationListeners; + @Nullable private RecoveryState recoveryState; @@ -215,7 +216,7 @@ public class IndexShard extends AbstractIndexShardComponent { public IndexShard(ShardId shardId, IndexSettings indexSettings, ShardPath path, Store store, IndexCache indexCache, MapperService mapperService, SimilarityService similarityService, IndexFieldDataService indexFieldDataService, @Nullable EngineFactory engineFactory, - IndexEventListener indexEventListener, IndexSearcherWrapper indexSearcherWrapper, NodeServicesProvider provider) { + IndexEventListener indexEventListener, IndexSearcherWrapper indexSearcherWrapper, NodeServicesProvider provider, IndexingOperationListener... listeners) { super(shardId, indexSettings); final Settings settings = indexSettings.getSettings(); this.inactiveTime = settings.getAsTime(INDEX_SHARD_INACTIVE_TIME_SETTING, settings.getAsTime(INDICES_INACTIVE_TIME_SETTING, TimeValue.timeValueMinutes(5))); @@ -232,7 +233,10 @@ public class IndexShard extends AbstractIndexShardComponent { this.threadPool = provider.getThreadPool(); this.mapperService = mapperService; this.indexCache = indexCache; - this.indexingService = new ShardIndexingService(shardId, indexSettings); + this.internalIndexingStats = new InternalIndexingStats(); + final List listenersList = new ArrayList<>(Arrays.asList(listeners)); + listenersList.add(internalIndexingStats); + this.indexingOperationListeners = new IndexingOperationListener.CompositeListener(listenersList, logger); this.getService = new ShardGetService(indexSettings, this, mapperService); this.termVectorsService = provider.getTermVectorsService(); this.searchService = new ShardSearchStats(settings); @@ -285,10 +289,6 @@ public class IndexShard extends AbstractIndexShardComponent { return true; } - public ShardIndexingService indexingService() { - return this.indexingService; - } - public ShardGetService getService() { return this.getService; } @@ -489,7 +489,7 @@ public class IndexShard extends AbstractIndexShardComponent { public boolean index(Engine.Index index) { ensureWriteAllowed(index); markLastWrite(); - index = indexingService.preIndex(index); + index = indexingOperationListeners.preIndex(index); final boolean created; try { if (logger.isTraceEnabled()) { @@ -503,10 +503,10 @@ public class IndexShard extends AbstractIndexShardComponent { } index.endTime(System.nanoTime()); } catch (Throwable ex) { - indexingService.postIndex(index, ex); + indexingOperationListeners.postIndex(index, ex); throw ex; } - indexingService.postIndex(index); + indexingOperationListeners.postIndex(index); return created; } @@ -532,7 +532,7 @@ public class IndexShard extends AbstractIndexShardComponent { public void delete(Engine.Delete delete) { ensureWriteAllowed(delete); markLastWrite(); - delete = indexingService.preDelete(delete); + delete = indexingOperationListeners.preDelete(delete); try { if (logger.isTraceEnabled()) { logger.trace("delete [{}]", delete.uid().text()); @@ -545,10 +545,10 @@ public class IndexShard extends AbstractIndexShardComponent { } delete.endTime(System.nanoTime()); } catch (Throwable ex) { - indexingService.postDelete(delete, ex); + indexingOperationListeners.postDelete(delete, ex); throw ex; } - indexingService.postDelete(delete); + indexingOperationListeners.postDelete(delete); } public Engine.GetResult get(Engine.Get get) { @@ -600,7 +600,7 @@ public class IndexShard extends AbstractIndexShardComponent { throttled = engine.isThrottled(); throttleTimeInMillis = engine.getIndexThrottleTimeInMillis(); } - return indexingService.stats(throttled, throttleTimeInMillis, types); + return internalIndexingStats.stats(throttled, throttleTimeInMillis, types); } public SearchStats searchStats(String... groups) { @@ -1222,7 +1222,6 @@ public class IndexShard extends AbstractIndexShardComponent { } mergePolicyConfig.onRefreshSettings(settings); searchService.onRefreshSettings(settings); - indexingService.onRefreshSettings(settings); if (change) { getEngine().onSettingsChanged(); } @@ -1258,6 +1257,14 @@ public class IndexShard extends AbstractIndexShardComponent { return inactiveTime; } + /** + * Should be called for each no-op update operation to increment relevant statistics. + * @param type the doc type of the update + */ + public void noopUpdate(String type) { + internalIndexingStats.noopUpdate(type); + } + class EngineRefresher implements Runnable { @Override public void run() { diff --git a/core/src/main/java/org/elasticsearch/index/shard/IndexingOperationListener.java b/core/src/main/java/org/elasticsearch/index/shard/IndexingOperationListener.java new file mode 100644 index 00000000000..e5d3574223a --- /dev/null +++ b/core/src/main/java/org/elasticsearch/index/shard/IndexingOperationListener.java @@ -0,0 +1,152 @@ +/* + * 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.shard; + +import org.elasticsearch.common.logging.ESLogger; +import org.elasticsearch.index.engine.Engine; + +import java.util.List; + +/** + * An indexing listener for indexing, delete, events. + */ +public interface IndexingOperationListener { + + /** + * Called before the indexing occurs. + */ + default Engine.Index preIndex(Engine.Index operation) { + return operation; + } + + /** + * Called after the indexing operation occurred. + */ + default void postIndex(Engine.Index index) {} + + /** + * Called after the indexing operation occurred with exception. + */ + default void postIndex(Engine.Index index, Throwable ex) {} + + /** + * Called before the delete occurs. + */ + default Engine.Delete preDelete(Engine.Delete delete) { + return delete; + } + + + /** + * Called after the delete operation occurred. + */ + default void postDelete(Engine.Delete delete) {} + + /** + * Called after the delete operation occurred with exception. + */ + default void postDelete(Engine.Delete delete, Throwable ex) {} + + /** + * A Composite listener that multiplexes calls to each of the listeners methods. + */ + final class CompositeListener implements IndexingOperationListener{ + private final List listeners; + private final ESLogger logger; + + public CompositeListener(List listeners, ESLogger logger) { + this.listeners = listeners; + this.logger = logger; + } + + @Override + public Engine.Index preIndex(Engine.Index operation) { + assert operation != null; + for (IndexingOperationListener listener : listeners) { + try { + listener.preIndex(operation); + } catch (Throwable t) { + logger.warn("preIndex listener [{}] failed", t, listener); + } + } + return operation; + } + + @Override + public void postIndex(Engine.Index index) { + assert index != null; + for (IndexingOperationListener listener : listeners) { + try { + listener.postIndex(index); + } catch (Throwable t) { + logger.warn("postIndex listener [{}] failed", t, listener); + } + } + } + + @Override + public void postIndex(Engine.Index index, Throwable ex) { + assert index != null && ex != null; + for (IndexingOperationListener listener : listeners) { + try { + listener.postIndex(index, ex); + } catch (Throwable t) { + logger.warn("postIndex listener [{}] failed", t, listener); + } + } + } + + @Override + public Engine.Delete preDelete(Engine.Delete delete) { + assert delete != null; + for (IndexingOperationListener listener : listeners) { + try { + listener.preDelete(delete); + } catch (Throwable t) { + logger.warn("preDelete listener [{}] failed", t, listener); + } + } + return delete; + } + + @Override + public void postDelete(Engine.Delete delete) { + assert delete != null; + for (IndexingOperationListener listener : listeners) { + try { + listener.postDelete(delete); + } catch (Throwable t) { + logger.warn("postDelete listener [{}] failed", t, listener); + } + } + } + + @Override + public void postDelete(Engine.Delete delete, Throwable ex) { + assert delete != null && ex != null; + for (IndexingOperationListener listener : listeners) { + try { + listener.postDelete(delete, ex); + } catch (Throwable t) { + logger.warn("postDelete listener [{}] failed", t, listener); + } + } + } + } +} diff --git a/core/src/main/java/org/elasticsearch/index/indexing/IndexingStats.java b/core/src/main/java/org/elasticsearch/index/shard/IndexingStats.java similarity index 99% rename from core/src/main/java/org/elasticsearch/index/indexing/IndexingStats.java rename to core/src/main/java/org/elasticsearch/index/shard/IndexingStats.java index 07ca8af17e3..27cda2ca1c8 100644 --- a/core/src/main/java/org/elasticsearch/index/indexing/IndexingStats.java +++ b/core/src/main/java/org/elasticsearch/index/shard/IndexingStats.java @@ -17,7 +17,7 @@ * under the License. */ -package org.elasticsearch.index.indexing; +package org.elasticsearch.index.shard; import org.elasticsearch.Version; import org.elasticsearch.common.Nullable; diff --git a/core/src/main/java/org/elasticsearch/index/indexing/ShardIndexingService.java b/core/src/main/java/org/elasticsearch/index/shard/InternalIndexingStats.java similarity index 67% rename from core/src/main/java/org/elasticsearch/index/indexing/ShardIndexingService.java rename to core/src/main/java/org/elasticsearch/index/shard/InternalIndexingStats.java index f7175c02c59..9996d705b33 100644 --- a/core/src/main/java/org/elasticsearch/index/indexing/ShardIndexingService.java +++ b/core/src/main/java/org/elasticsearch/index/shard/InternalIndexingStats.java @@ -17,49 +17,34 @@ * under the License. */ -package org.elasticsearch.index.indexing; +package org.elasticsearch.index.shard; import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.metrics.CounterMetric; import org.elasticsearch.common.metrics.MeanMetric; import org.elasticsearch.common.regex.Regex; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.index.IndexSettings; import org.elasticsearch.index.engine.Engine; -import org.elasticsearch.index.shard.AbstractIndexShardComponent; -import org.elasticsearch.index.shard.ShardId; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; import static java.util.Collections.emptyMap; /** + * Internal class that maintains relevant indexing statistics / metrics. + * @see IndexShard */ -public class ShardIndexingService extends AbstractIndexShardComponent { - - private final IndexingSlowLog slowLog; - +final class InternalIndexingStats implements IndexingOperationListener { private final StatsHolder totalStats = new StatsHolder(); - - private final CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); - private volatile Map typesStats = emptyMap(); - public ShardIndexingService(ShardId shardId, IndexSettings indexSettings) { - super(shardId, indexSettings); - this.slowLog = new IndexingSlowLog(this.indexSettings.getSettings()); - } - /** * Returns the stats, including type specific stats. If the types are null/0 length, then nothing * is returned for them. If they are set, then only types provided will be returned, or * _all for all types. */ - public IndexingStats stats(boolean isThrottled, long currentThrottleInMillis, String... types) { + IndexingStats stats(boolean isThrottled, long currentThrottleInMillis, String... types) { IndexingStats.Stats total = totalStats.stats(isThrottled, currentThrottleInMillis); Map typesSt = null; if (types != null && types.length > 0) { @@ -79,20 +64,10 @@ public class ShardIndexingService extends AbstractIndexShardComponent { return new IndexingStats(total, typesSt); } - public void addListener(IndexingOperationListener listener) { - listeners.add(listener); - } - - public void removeListener(IndexingOperationListener listener) { - listeners.remove(listener); - } public Engine.Index preIndex(Engine.Index operation) { totalStats.indexCurrent.inc(); typeStats(operation.type()).indexCurrent.inc(); - for (IndexingOperationListener listener : listeners) { - operation = listener.preIndex(operation); - } return operation; } @@ -103,14 +78,6 @@ public class ShardIndexingService extends AbstractIndexShardComponent { StatsHolder typeStats = typeStats(index.type()); typeStats.indexMetric.inc(took); typeStats.indexCurrent.dec(); - slowLog.postIndex(index, took); - for (IndexingOperationListener listener : listeners) { - try { - listener.postIndex(index); - } catch (Exception e) { - logger.warn("postIndex listener [{}] failed", e, listener); - } - } } public void postIndex(Engine.Index index, Throwable ex) { @@ -118,21 +85,11 @@ public class ShardIndexingService extends AbstractIndexShardComponent { typeStats(index.type()).indexCurrent.dec(); totalStats.indexFailed.inc(); typeStats(index.type()).indexFailed.inc(); - for (IndexingOperationListener listener : listeners) { - try { - listener.postIndex(index, ex); - } catch (Throwable t) { - logger.warn("postIndex listener [{}] failed", t, listener); - } - } } public Engine.Delete preDelete(Engine.Delete delete) { totalStats.deleteCurrent.inc(); typeStats(delete.type()).deleteCurrent.inc(); - for (IndexingOperationListener listener : listeners) { - delete = listener.preDelete(delete); - } return delete; } @@ -144,25 +101,11 @@ public class ShardIndexingService extends AbstractIndexShardComponent { StatsHolder typeStats = typeStats(delete.type()); typeStats.deleteMetric.inc(took); typeStats.deleteCurrent.dec(); - for (IndexingOperationListener listener : listeners) { - try { - listener.postDelete(delete); - } catch (Exception e) { - logger.warn("postDelete listener [{}] failed", e, listener); - } - } } public void postDelete(Engine.Delete delete, Throwable ex) { totalStats.deleteCurrent.dec(); typeStats(delete.type()).deleteCurrent.dec(); - for (IndexingOperationListener listener : listeners) { - try { - listener. postDelete(delete, ex); - } catch (Throwable t) { - logger.warn("postDelete listener [{}] failed", t, listener); - } - } } public void noopUpdate(String type) { @@ -170,7 +113,7 @@ public class ShardIndexingService extends AbstractIndexShardComponent { typeStats(type).noopUpdates.inc(); } - public void clear() { + public void clear() { // NOCOMMIT - this is unused? totalStats.clear(); synchronized (this) { if (!typesStats.isEmpty()) { @@ -200,10 +143,6 @@ public class ShardIndexingService extends AbstractIndexShardComponent { return stats; } - public void onRefreshSettings(Settings settings) { - slowLog.onRefreshSettings(settings); - } - static class StatsHolder { public final MeanMetric indexMetric = new MeanMetric(); public final MeanMetric deleteMetric = new MeanMetric(); @@ -214,9 +153,9 @@ public class ShardIndexingService extends AbstractIndexShardComponent { public IndexingStats.Stats stats(boolean isThrottled, long currentThrottleMillis) { return new IndexingStats.Stats( - indexMetric.count(), TimeUnit.NANOSECONDS.toMillis(indexMetric.sum()), indexCurrent.count(), indexFailed.count(), - deleteMetric.count(), TimeUnit.NANOSECONDS.toMillis(deleteMetric.sum()), deleteCurrent.count(), - noopUpdates.count(), isThrottled, TimeUnit.MILLISECONDS.toMillis(currentThrottleMillis)); + indexMetric.count(), TimeUnit.NANOSECONDS.toMillis(indexMetric.sum()), indexCurrent.count(), indexFailed.count(), + deleteMetric.count(), TimeUnit.NANOSECONDS.toMillis(deleteMetric.sum()), deleteCurrent.count(), + noopUpdates.count(), isThrottled, TimeUnit.MILLISECONDS.toMillis(currentThrottleMillis)); } public long totalCurrent() { diff --git a/core/src/main/java/org/elasticsearch/indices/IndicesService.java b/core/src/main/java/org/elasticsearch/indices/IndicesService.java index 36ed70ae65a..392a58686eb 100644 --- a/core/src/main/java/org/elasticsearch/indices/IndicesService.java +++ b/core/src/main/java/org/elasticsearch/indices/IndicesService.java @@ -52,7 +52,7 @@ import org.elasticsearch.index.NodeServicesProvider; import org.elasticsearch.index.analysis.AnalysisRegistry; import org.elasticsearch.index.flush.FlushStats; import org.elasticsearch.index.get.GetStats; -import org.elasticsearch.index.indexing.IndexingStats; +import org.elasticsearch.index.shard.IndexingStats; import org.elasticsearch.index.merge.MergeStats; import org.elasticsearch.index.recovery.RecoveryStats; import org.elasticsearch.index.refresh.RefreshStats; diff --git a/core/src/main/java/org/elasticsearch/indices/NodeIndicesStats.java b/core/src/main/java/org/elasticsearch/indices/NodeIndicesStats.java index c8142f3d37a..0a036cbd801 100644 --- a/core/src/main/java/org/elasticsearch/indices/NodeIndicesStats.java +++ b/core/src/main/java/org/elasticsearch/indices/NodeIndicesStats.java @@ -36,7 +36,7 @@ import org.elasticsearch.index.engine.SegmentsStats; import org.elasticsearch.index.fielddata.FieldDataStats; import org.elasticsearch.index.flush.FlushStats; import org.elasticsearch.index.get.GetStats; -import org.elasticsearch.index.indexing.IndexingStats; +import org.elasticsearch.index.shard.IndexingStats; import org.elasticsearch.index.merge.MergeStats; import org.elasticsearch.index.percolator.PercolateStats; import org.elasticsearch.index.recovery.RecoveryStats; diff --git a/core/src/main/java/org/elasticsearch/rest/action/cat/RestNodesAction.java b/core/src/main/java/org/elasticsearch/rest/action/cat/RestNodesAction.java index e86132a909e..110aa90047f 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/cat/RestNodesAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/cat/RestNodesAction.java @@ -41,7 +41,7 @@ import org.elasticsearch.index.engine.SegmentsStats; import org.elasticsearch.index.fielddata.FieldDataStats; import org.elasticsearch.index.flush.FlushStats; import org.elasticsearch.index.get.GetStats; -import org.elasticsearch.index.indexing.IndexingStats; +import org.elasticsearch.index.shard.IndexingStats; import org.elasticsearch.index.merge.MergeStats; import org.elasticsearch.index.percolator.PercolateStats; import org.elasticsearch.index.refresh.RefreshStats; diff --git a/core/src/test/java/org/elasticsearch/index/indexing/IndexingSlowLogTests.java b/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java similarity index 94% rename from core/src/test/java/org/elasticsearch/index/indexing/IndexingSlowLogTests.java rename to core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java index ccbef6837c9..e39c0a805fe 100644 --- a/core/src/test/java/org/elasticsearch/index/indexing/IndexingSlowLogTests.java +++ b/core/src/test/java/org/elasticsearch/index/IndexingSlowLogTests.java @@ -17,14 +17,14 @@ * under the License. */ -package org.elasticsearch.index.indexing; +package org.elasticsearch.index; import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.IntField; import org.apache.lucene.document.StringField; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.json.JsonXContent; -import org.elasticsearch.index.indexing.IndexingSlowLog.SlowLogParsedDocumentPrinter; +import org.elasticsearch.index.IndexingSlowLog.SlowLogParsedDocumentPrinter; import org.elasticsearch.index.mapper.ParsedDocument; import org.elasticsearch.test.ESTestCase; diff --git a/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java b/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java index 66e0a0655d6..d18e279636b 100644 --- a/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java +++ b/core/src/test/java/org/elasticsearch/index/shard/IndexShardTests.java @@ -76,8 +76,6 @@ import org.elasticsearch.index.engine.EngineException; import org.elasticsearch.index.fielddata.FieldDataStats; import org.elasticsearch.index.fielddata.IndexFieldData; import org.elasticsearch.index.flush.FlushStats; -import org.elasticsearch.index.indexing.IndexingOperationListener; -import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.Mapping; import org.elasticsearch.index.mapper.ParseContext; @@ -109,6 +107,7 @@ import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; @@ -612,77 +611,77 @@ public class IndexShardTests extends ESSingleNodeTestCase { return new ParsedDocument(uidField, versionField, id, type, routing, timestamp, ttl, Arrays.asList(document), source, mappingUpdate); } - public void testPreIndex() throws IOException { - createIndex("testpreindex"); + public void testIndexingOperationsListeners() throws IOException { + createIndex("test_iol"); ensureGreen(); + client().prepareIndex("test_iol", "test", "0").setSource("{\"foo\" : \"bar\"}").setRefresh(true).get(); IndicesService indicesService = getInstanceFromNode(IndicesService.class); - IndexService test = indicesService.indexService("testpreindex"); + IndexService test = indicesService.indexService("test_iol"); IndexShard shard = test.getShardOrNull(0); - ShardIndexingService shardIndexingService = shard.indexingService(); - final AtomicBoolean preIndexCalled = new AtomicBoolean(false); - - shardIndexingService.addListener(new IndexingOperationListener() { + AtomicInteger preIndex = new AtomicInteger(); + AtomicInteger postIndex = new AtomicInteger(); + AtomicInteger postIndexException = new AtomicInteger(); + AtomicInteger preDelete = new AtomicInteger(); + AtomicInteger postDelete = new AtomicInteger(); + AtomicInteger postDeleteException = new AtomicInteger(); + shard = reinitWithWrapper(test, shard, null, new IndexingOperationListener() { @Override public Engine.Index preIndex(Engine.Index operation) { - preIndexCalled.set(true); - return super.preIndex(operation); + preIndex.incrementAndGet(); + return operation; } - }); - ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, new ParseContext.Document(), new BytesArray(new byte[]{1}), null); - Engine.Index index = new Engine.Index(new Term("_uid", "1"), doc); - shard.index(index); - assertTrue(preIndexCalled.get()); - } - - public void testPostIndex() throws IOException { - createIndex("testpostindex"); - ensureGreen(); - IndicesService indicesService = getInstanceFromNode(IndicesService.class); - IndexService test = indicesService.indexService("testpostindex"); - IndexShard shard = test.getShardOrNull(0); - ShardIndexingService shardIndexingService = shard.indexingService(); - final AtomicBoolean postIndexCalled = new AtomicBoolean(false); - - shardIndexingService.addListener(new IndexingOperationListener() { @Override public void postIndex(Engine.Index index) { - postIndexCalled.set(true); - super.postIndex(index); + postIndex.incrementAndGet(); + } + + @Override + public void postIndex(Engine.Index index, Throwable ex) { + postIndexException.incrementAndGet(); + } + + @Override + public Engine.Delete preDelete(Engine.Delete delete) { + preDelete.incrementAndGet(); + return delete; + } + + @Override + public void postDelete(Engine.Delete delete) { + postDelete.incrementAndGet(); + } + + @Override + public void postDelete(Engine.Delete delete, Throwable ex) { + postDeleteException.incrementAndGet(); + } }); ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, new ParseContext.Document(), new BytesArray(new byte[]{1}), null); Engine.Index index = new Engine.Index(new Term("_uid", "1"), doc); shard.index(index); - assertTrue(postIndexCalled.get()); - } + assertEquals(1, preIndex.get()); + assertEquals(1, postIndex.get()); + assertEquals(0, postIndexException.get()); + assertEquals(0, preDelete.get()); + assertEquals(0, postDelete.get()); + assertEquals(0, postDeleteException.get()); - public void testPostIndexWithException() throws IOException { - createIndex("testpostindexwithexception"); - ensureGreen(); - IndicesService indicesService = getInstanceFromNode(IndicesService.class); - IndexService test = indicesService.indexService("testpostindexwithexception"); - IndexShard shard = test.getShardOrNull(0); - ShardIndexingService shardIndexingService = shard.indexingService(); + Engine.Delete delete = new Engine.Delete("test", "1", new Term("_uid", "1")); + shard.delete(delete); + + assertEquals(1, preIndex.get()); + assertEquals(1, postIndex.get()); + assertEquals(0, postIndexException.get()); + assertEquals(1, preDelete.get()); + assertEquals(1, postDelete.get()); + assertEquals(0, postDeleteException.get()); shard.close("Unexpected close", true); shard.state = IndexShardState.STARTED; // It will generate exception - final AtomicBoolean postIndexWithExceptionCalled = new AtomicBoolean(false); - - shardIndexingService.addListener(new IndexingOperationListener() { - @Override - public void postIndex(Engine.Index index, Throwable ex) { - assertNotNull(ex); - postIndexWithExceptionCalled.set(true); - super.postIndex(index, ex); - } - }); - - ParsedDocument doc = testParsedDocument("1", "1", "test", null, -1, -1, new ParseContext.Document(), new BytesArray(new byte[]{1}), null); - Engine.Index index = new Engine.Index(new Term("_uid", "1"), doc); - try { shard.index(index); fail(); @@ -690,7 +689,26 @@ public class IndexShardTests extends ESSingleNodeTestCase { } - assertTrue(postIndexWithExceptionCalled.get()); + assertEquals(2, preIndex.get()); + assertEquals(1, postIndex.get()); + assertEquals(1, postIndexException.get()); + assertEquals(1, preDelete.get()); + assertEquals(1, postDelete.get()); + assertEquals(0, postDeleteException.get()); + try { + shard.delete(delete); + fail(); + }catch (IllegalIndexShardStateException e){ + + } + + assertEquals(2, preIndex.get()); + assertEquals(1, postIndex.get()); + assertEquals(1, postIndexException.get()); + assertEquals(2, preDelete.get()); + assertEquals(1, postDelete.get()); + assertEquals(1, postDeleteException.get()); + } public void testMaybeFlush() throws Exception { @@ -1041,11 +1059,11 @@ public class IndexShardTests extends ESSingleNodeTestCase { // test will fail due to unclosed searchers if the searcher is not released } - private final IndexShard reinitWithWrapper(IndexService indexService, IndexShard shard, IndexSearcherWrapper wrapper) throws IOException { + private final IndexShard reinitWithWrapper(IndexService indexService, IndexShard shard, IndexSearcherWrapper wrapper, IndexingOperationListener... listeners) throws IOException { ShardRouting routing = new ShardRouting(shard.routingEntry()); shard.close("simon says", true); NodeServicesProvider indexServices = indexService.getIndexServices(); - IndexShard newShard = new IndexShard(shard.shardId(), indexService.getIndexSettings(), shard.shardPath(), shard.store(), indexService.cache(), indexService.mapperService(), indexService.similarityService(), indexService.fieldData(), shard.getEngineFactory(), indexService.getIndexEventListener(), wrapper, indexServices); + IndexShard newShard = new IndexShard(shard.shardId(), indexService.getIndexSettings(), shard.shardPath(), shard.store(), indexService.cache(), indexService.mapperService(), indexService.similarityService(), indexService.fieldData(), shard.getEngineFactory(), indexService.getIndexEventListener(), wrapper, indexServices, listeners); ShardRoutingHelper.reinit(routing); newShard.updateRoutingEntry(routing, false); DiscoveryNode localNode = new DiscoveryNode("foo", DummyTransportAddress.INSTANCE, Version.CURRENT); diff --git a/core/src/test/java/org/elasticsearch/index/shard/IndexingOperationListenerTests.java b/core/src/test/java/org/elasticsearch/index/shard/IndexingOperationListenerTests.java new file mode 100644 index 00000000000..92bbf06a7b6 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/index/shard/IndexingOperationListenerTests.java @@ -0,0 +1,162 @@ +/* + * 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.shard; + +import org.apache.lucene.index.Term; +import org.elasticsearch.index.engine.Engine; +import org.elasticsearch.test.ESTestCase; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class IndexingOperationListenerTests extends ESTestCase{ + + // this test also tests if calls are correct if one or more listeners throw exceptions + public void testListenersAreExecuted() { + AtomicInteger preIndex = new AtomicInteger(); + AtomicInteger postIndex = new AtomicInteger(); + AtomicInteger postIndexException = new AtomicInteger(); + AtomicInteger preDelete = new AtomicInteger(); + AtomicInteger postDelete = new AtomicInteger(); + AtomicInteger postDeleteException = new AtomicInteger(); + IndexingOperationListener listener = new IndexingOperationListener() { + @Override + public Engine.Index preIndex(Engine.Index operation) { + preIndex.incrementAndGet(); + return operation; + } + + @Override + public void postIndex(Engine.Index index) { + postIndex.incrementAndGet(); + } + + @Override + public void postIndex(Engine.Index index, Throwable ex) { + postIndexException.incrementAndGet(); + } + + @Override + public Engine.Delete preDelete(Engine.Delete delete) { + preDelete.incrementAndGet(); + return delete; + } + + @Override + public void postDelete(Engine.Delete delete) { + postDelete.incrementAndGet(); + } + + @Override + public void postDelete(Engine.Delete delete, Throwable ex) { + postDeleteException.incrementAndGet(); + } + }; + + IndexingOperationListener throwingListener = new IndexingOperationListener() { + @Override + public Engine.Index preIndex(Engine.Index operation) { + throw new RuntimeException(); + } + + @Override + public void postIndex(Engine.Index index) { + throw new RuntimeException(); } + + @Override + public void postIndex(Engine.Index index, Throwable ex) { + throw new RuntimeException(); } + + @Override + public Engine.Delete preDelete(Engine.Delete delete) { + throw new RuntimeException(); + } + + @Override + public void postDelete(Engine.Delete delete) { + throw new RuntimeException(); } + + @Override + public void postDelete(Engine.Delete delete, Throwable ex) { + throw new RuntimeException(); + } + }; + final List indexingOperationListeners = new ArrayList<>(Arrays.asList(listener, listener)); + if (randomBoolean()) { + indexingOperationListeners.add(throwingListener); + if (randomBoolean()) { + indexingOperationListeners.add(throwingListener); + } + } + Collections.shuffle(indexingOperationListeners, random()); + IndexingOperationListener.CompositeListener compositeListener = new IndexingOperationListener.CompositeListener(indexingOperationListeners, logger); + Engine.Delete delete = new Engine.Delete("test", "1", new Term("_uid", "1")); + Engine.Index index = new Engine.Index(new Term("_uid", "1"), null); + compositeListener.postDelete(delete); + assertEquals(0, preIndex.get()); + assertEquals(0, postIndex.get()); + assertEquals(0, postIndexException.get()); + assertEquals(0, preDelete.get()); + assertEquals(2, postDelete.get()); + assertEquals(0, postDeleteException.get()); + + compositeListener.postDelete(delete, new RuntimeException()); + assertEquals(0, preIndex.get()); + assertEquals(0, postIndex.get()); + assertEquals(0, postIndexException.get()); + assertEquals(0, preDelete.get()); + assertEquals(2, postDelete.get()); + assertEquals(2, postDeleteException.get()); + + compositeListener.preDelete(delete); + assertEquals(0, preIndex.get()); + assertEquals(0, postIndex.get()); + assertEquals(0, postIndexException.get()); + assertEquals(2, preDelete.get()); + assertEquals(2, postDelete.get()); + assertEquals(2, postDeleteException.get()); + + compositeListener.postIndex(index); + assertEquals(0, preIndex.get()); + assertEquals(2, postIndex.get()); + assertEquals(0, postIndexException.get()); + assertEquals(2, preDelete.get()); + assertEquals(2, postDelete.get()); + assertEquals(2, postDeleteException.get()); + + compositeListener.postIndex(index, new RuntimeException()); + assertEquals(0, preIndex.get()); + assertEquals(2, postIndex.get()); + assertEquals(2, postIndexException.get()); + assertEquals(2, preDelete.get()); + assertEquals(2, postDelete.get()); + assertEquals(2, postDeleteException.get()); + + compositeListener.preIndex(index); + assertEquals(2, preIndex.get()); + assertEquals(2, postIndex.get()); + assertEquals(2, postIndexException.get()); + assertEquals(2, preDelete.get()); + assertEquals(2, postDelete.get()); + assertEquals(2, postDeleteException.get()); + } +} From 9773cca58efb56fc9a86776bd0c5c10723d4c676 Mon Sep 17 00:00:00 2001 From: Clinton Gormley Date: Sun, 10 Jan 2016 10:05:34 +0100 Subject: [PATCH 53/59] Merge pull request #15870 from rjruizes/patch-1 fix nested multi-value query --- docs/reference/mapping/types/nested.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/mapping/types/nested.asciidoc b/docs/reference/mapping/types/nested.asciidoc index b4bb06e236c..e13b94c7773 100644 --- a/docs/reference/mapping/types/nested.asciidoc +++ b/docs/reference/mapping/types/nested.asciidoc @@ -55,7 +55,7 @@ GET my_index/_search "bool": { "must": [ { "match": { "user.first": "Alice" }}, - { "match": { "user.last": "White" }} + { "match": { "user.last": "Smith" }} ] } } From 3c58a93a6e5337cfea0b612dc2b5ec1a1b8a30c3 Mon Sep 17 00:00:00 2001 From: Clinton Gormley Date: Sun, 10 Jan 2016 10:47:44 +0100 Subject: [PATCH 54/59] Merge pull request #15856 from marcbachmann/patch-1 Document index deletion using comma separated indices --- docs/reference/indices/delete-index.asciidoc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/reference/indices/delete-index.asciidoc b/docs/reference/indices/delete-index.asciidoc index 25d176668cc..5c652accfb9 100644 --- a/docs/reference/indices/delete-index.asciidoc +++ b/docs/reference/indices/delete-index.asciidoc @@ -11,9 +11,8 @@ $ curl -XDELETE 'http://localhost:9200/twitter/' The above example deletes an index called `twitter`. Specifying an index, alias or wildcard expression is required. -The delete index API can also be applied to more than one index, or on -all indices (be careful!) by using `_all` or `*` as index. +The delete index API can also be applied to more than one index, by either using a comma separated list, or on all indices (be careful!) by using `_all` or `*` as index. In order to disable allowing to delete indices via wildcards or `_all`, set `action.destructive_requires_name` setting in the config to `true`. -This setting can also be changed via the cluster update settings api. \ No newline at end of file +This setting can also be changed via the cluster update settings api. From abaf816d001bbf4290b6bb63365dcb615746bee6 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Sat, 9 Jan 2016 11:06:41 -0500 Subject: [PATCH 55/59] Remove and forbid use of IndexWriter#isLocked This commit removes and now forbids use of org.apache.lucene.index.IndexWriter#isLocked as this method was deprecated in LUCENE-6508. The deprecation is due to the fact that checking if a lock is held before acquiring that lock is subject to a time-of-check-to-time-of-use race condition. There were three uses of IndexWriter#isLocked in the code base: - a logging statement in o.e.i.e.InternalEngine where we are already in an exceptional condition that the lock was held; in this case, logging whether or not the directory is locked is superfluous - in o.e.c.l.u.VersionsTests where we were verifying that a write lock is released upon closing an IndexWriter; in this case, the check is not needed as successfully closing an IndexWriter releases its write lock - in o.e.t.s.MockFSDirectoryService where we were verifying that a directory is not write-locked before (implicitly) trying to obtain such a write lock in org.apache.lucene.index.CheckIndex# (this is the exact type of a situation that is subject to a race condition); in this case we can proceed by just (implicitly) trying to obtain the write lock and failing if we encounter a LockObtainFailedException --- buildSrc/src/main/resources/forbidden/all-signatures.txt | 1 + .../org/elasticsearch/index/engine/InternalEngine.java | 3 +-- .../elasticsearch/common/lucene/uid/VersionsTests.java | 2 -- .../elasticsearch/test/store/MockFSDirectoryService.java | 8 ++++---- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/buildSrc/src/main/resources/forbidden/all-signatures.txt b/buildSrc/src/main/resources/forbidden/all-signatures.txt index 76cd83cdede..f72de510721 100644 --- a/buildSrc/src/main/resources/forbidden/all-signatures.txt +++ b/buildSrc/src/main/resources/forbidden/all-signatures.txt @@ -45,6 +45,7 @@ org.apache.lucene.search.NumericRangeFilter org.apache.lucene.search.PrefixFilter org.apache.lucene.search.QueryWrapperFilter org.apache.lucene.search.join.BitDocIdSetCachingWrapperFilter +org.apache.lucene.index.IndexWriter#isLocked(org.apache.lucene.store.Directory) java.nio.file.Paths @ Use org.elasticsearch.common.io.PathUtils.get() instead. java.nio.file.FileSystems#getDefault() @ use org.elasticsearch.common.io.PathUtils.getDefaultFileSystem() instead. diff --git a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java index d93ce36686e..b2d81f07107 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java +++ b/core/src/main/java/org/elasticsearch/index/engine/InternalEngine.java @@ -959,8 +959,7 @@ public class InternalEngine extends Engine { }); return new IndexWriter(store.directory(), iwc); } catch (LockObtainFailedException ex) { - boolean isLocked = IndexWriter.isLocked(store.directory()); - logger.warn("Could not lock IndexWriter isLocked [{}]", ex, isLocked); + logger.warn("could not lock IndexWriter", ex); throw ex; } } diff --git a/core/src/test/java/org/elasticsearch/common/lucene/uid/VersionsTests.java b/core/src/test/java/org/elasticsearch/common/lucene/uid/VersionsTests.java index fb3c021fd5d..d6abcfe7735 100644 --- a/core/src/test/java/org/elasticsearch/common/lucene/uid/VersionsTests.java +++ b/core/src/test/java/org/elasticsearch/common/lucene/uid/VersionsTests.java @@ -56,7 +56,6 @@ import java.util.List; import java.util.Map; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; @@ -292,7 +291,6 @@ public class VersionsTests extends ESTestCase { } iw.close(); - assertThat(IndexWriter.isLocked(iw.getDirectory()), is(false)); ir.close(); dir.close(); } diff --git a/test/framework/src/main/java/org/elasticsearch/test/store/MockFSDirectoryService.java b/test/framework/src/main/java/org/elasticsearch/test/store/MockFSDirectoryService.java index 58a72789f65..3128a2220ae 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/store/MockFSDirectoryService.java +++ b/test/framework/src/main/java/org/elasticsearch/test/store/MockFSDirectoryService.java @@ -26,6 +26,7 @@ import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.BaseDirectoryWrapper; import org.apache.lucene.store.Directory; import org.apache.lucene.store.LockFactory; +import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.store.MockDirectoryWrapper; import org.apache.lucene.store.StoreRateLimiting; import org.apache.lucene.util.LuceneTestCase; @@ -113,10 +114,6 @@ public class MockFSDirectoryService extends FsDirectoryService { if (!Lucene.indexExists(dir)) { return; } - if (IndexWriter.isLocked(dir)) { - ESTestCase.checkIndexFailed = true; - throw new IllegalStateException("IndexWriter is still open on shard " + shardId); - } try (CheckIndex checkIndex = new CheckIndex(dir)) { BytesStreamOutput os = new BytesStreamOutput(); PrintStream out = new PrintStream(os, false, StandardCharsets.UTF_8.name()); @@ -134,6 +131,9 @@ public class MockFSDirectoryService extends FsDirectoryService { logger.debug("check index [success]\n{}", new String(os.bytes().toBytes(), StandardCharsets.UTF_8)); } } + } catch (LockObtainFailedException e) { + ESTestCase.checkIndexFailed = true; + throw new IllegalStateException("IndexWriter is still open on shard " + shardId, e); } } catch (Exception e) { logger.warn("failed to check index", e); From 80ef201514764e948d2ed8b91143c205560382b1 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Sun, 10 Jan 2016 20:04:25 +0100 Subject: [PATCH 56/59] Remove dead code and add missing @Override annotations --- .../index/shard/InternalIndexingStats.java | 46 ++++++------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/shard/InternalIndexingStats.java b/core/src/main/java/org/elasticsearch/index/shard/InternalIndexingStats.java index 9996d705b33..ce8c8140ce0 100644 --- a/core/src/main/java/org/elasticsearch/index/shard/InternalIndexingStats.java +++ b/core/src/main/java/org/elasticsearch/index/shard/InternalIndexingStats.java @@ -64,13 +64,14 @@ final class InternalIndexingStats implements IndexingOperationListener { return new IndexingStats(total, typesSt); } - + @Override public Engine.Index preIndex(Engine.Index operation) { totalStats.indexCurrent.inc(); typeStats(operation.type()).indexCurrent.inc(); return operation; } + @Override public void postIndex(Engine.Index index) { long took = index.endTime() - index.startTime(); totalStats.indexMetric.inc(took); @@ -80,6 +81,7 @@ final class InternalIndexingStats implements IndexingOperationListener { typeStats.indexCurrent.dec(); } + @Override public void postIndex(Engine.Index index, Throwable ex) { totalStats.indexCurrent.dec(); typeStats(index.type()).indexCurrent.dec(); @@ -87,13 +89,14 @@ final class InternalIndexingStats implements IndexingOperationListener { typeStats(index.type()).indexFailed.inc(); } + @Override public Engine.Delete preDelete(Engine.Delete delete) { totalStats.deleteCurrent.inc(); typeStats(delete.type()).deleteCurrent.inc(); return delete; } - + @Override public void postDelete(Engine.Delete delete) { long took = delete.endTime() - delete.startTime(); totalStats.deleteMetric.inc(took); @@ -103,6 +106,7 @@ final class InternalIndexingStats implements IndexingOperationListener { typeStats.deleteCurrent.dec(); } + @Override public void postDelete(Engine.Delete delete, Throwable ex) { totalStats.deleteCurrent.dec(); typeStats(delete.type()).deleteCurrent.dec(); @@ -113,22 +117,6 @@ final class InternalIndexingStats implements IndexingOperationListener { typeStats(type).noopUpdates.inc(); } - public void clear() { // NOCOMMIT - this is unused? - totalStats.clear(); - synchronized (this) { - if (!typesStats.isEmpty()) { - MapBuilder typesStatsBuilder = MapBuilder.newMapBuilder(); - for (Map.Entry typeStats : typesStats.entrySet()) { - if (typeStats.getValue().totalCurrent() > 0) { - typeStats.getValue().clear(); - typesStatsBuilder.put(typeStats.getKey(), typeStats.getValue()); - } - } - typesStats = typesStatsBuilder.immutableMap(); - } - } - } - private StatsHolder typeStats(String type) { StatsHolder stats = typesStats.get(type); if (stats == null) { @@ -144,29 +132,23 @@ final class InternalIndexingStats implements IndexingOperationListener { } static class StatsHolder { - public final MeanMetric indexMetric = new MeanMetric(); - public final MeanMetric deleteMetric = new MeanMetric(); - public final CounterMetric indexCurrent = new CounterMetric(); - public final CounterMetric indexFailed = new CounterMetric(); - public final CounterMetric deleteCurrent = new CounterMetric(); - public final CounterMetric noopUpdates = new CounterMetric(); + private final MeanMetric indexMetric = new MeanMetric(); + private final MeanMetric deleteMetric = new MeanMetric(); + private final CounterMetric indexCurrent = new CounterMetric(); + private final CounterMetric indexFailed = new CounterMetric(); + private final CounterMetric deleteCurrent = new CounterMetric(); + private final CounterMetric noopUpdates = new CounterMetric(); - public IndexingStats.Stats stats(boolean isThrottled, long currentThrottleMillis) { + IndexingStats.Stats stats(boolean isThrottled, long currentThrottleMillis) { return new IndexingStats.Stats( indexMetric.count(), TimeUnit.NANOSECONDS.toMillis(indexMetric.sum()), indexCurrent.count(), indexFailed.count(), deleteMetric.count(), TimeUnit.NANOSECONDS.toMillis(deleteMetric.sum()), deleteCurrent.count(), noopUpdates.count(), isThrottled, TimeUnit.MILLISECONDS.toMillis(currentThrottleMillis)); } - public long totalCurrent() { - return indexCurrent.count() + deleteMetric.count(); - } - - public void clear() { + void clear() { indexMetric.clear(); deleteMetric.clear(); } - - } } From 91e8d156f55366af9d7be9c5f37ef848efe7050c Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Sun, 10 Jan 2016 20:40:51 +0100 Subject: [PATCH 57/59] Make IndexingMemoryController private to IndicesService This commit detaches the IndexingMemoryController from guice and moves it's creation and closing into IndicesService where it logically belongs. --- .../index/engine/EngineConfig.java | 4 +- .../elasticsearch/index/shard/IndexShard.java | 2 +- .../IndexingMemoryController.java | 39 +++++++------------ .../elasticsearch/indices/IndicesModule.java | 2 - .../elasticsearch/indices/IndicesService.java | 9 +++-- .../cluster/IndicesClusterStateService.java | 5 +-- .../java/org/elasticsearch/node/Node.java | 5 --- .../IndexingMemoryControllerIT.java | 2 +- .../IndexingMemoryControllerTests.java | 10 ++++- 9 files changed, 33 insertions(+), 45 deletions(-) rename core/src/main/java/org/elasticsearch/indices/{memory => }/IndexingMemoryController.java (89%) rename core/src/test/java/org/elasticsearch/indices/{memory => }/IndexingMemoryControllerIT.java (99%) rename core/src/test/java/org/elasticsearch/indices/{memory => }/IndexingMemoryControllerTests.java (97%) diff --git a/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java b/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java index 4086bebfa88..913c4989d40 100644 --- a/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java +++ b/core/src/main/java/org/elasticsearch/index/engine/EngineConfig.java @@ -35,7 +35,7 @@ import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.TranslogRecoveryPerformer; import org.elasticsearch.index.store.Store; import org.elasticsearch.index.translog.TranslogConfig; -import org.elasticsearch.indices.memory.IndexingMemoryController; +import org.elasticsearch.indices.IndexingMemoryController; import org.elasticsearch.threadpool.ThreadPool; import java.util.concurrent.TimeUnit; @@ -192,7 +192,7 @@ public final class EngineConfig { } /** - * Returns the initial index buffer size. This setting is only read on startup and otherwise controlled by {@link org.elasticsearch.indices.memory.IndexingMemoryController} + * Returns the initial index buffer size. This setting is only read on startup and otherwise controlled by {@link IndexingMemoryController} */ public ByteSizeValue getIndexingBufferSize() { return indexingBufferSize; diff --git a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java index db5e1f7e4a5..e4f656dd558 100644 --- a/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java +++ b/core/src/main/java/org/elasticsearch/index/shard/IndexShard.java @@ -111,7 +111,7 @@ import org.elasticsearch.index.warmer.ShardIndexWarmerService; import org.elasticsearch.index.warmer.WarmerStats; import org.elasticsearch.indices.IndicesWarmer; import org.elasticsearch.indices.cache.query.IndicesQueryCache; -import org.elasticsearch.indices.memory.IndexingMemoryController; +import org.elasticsearch.indices.IndexingMemoryController; import org.elasticsearch.indices.recovery.RecoveryFailedException; import org.elasticsearch.indices.recovery.RecoveryState; import org.elasticsearch.percolator.PercolatorService; diff --git a/core/src/main/java/org/elasticsearch/indices/memory/IndexingMemoryController.java b/core/src/main/java/org/elasticsearch/indices/IndexingMemoryController.java similarity index 89% rename from core/src/main/java/org/elasticsearch/indices/memory/IndexingMemoryController.java rename to core/src/main/java/org/elasticsearch/indices/IndexingMemoryController.java index a72c115835c..25c91a80582 100644 --- a/core/src/main/java/org/elasticsearch/indices/memory/IndexingMemoryController.java +++ b/core/src/main/java/org/elasticsearch/indices/IndexingMemoryController.java @@ -17,10 +17,9 @@ * under the License. */ -package org.elasticsearch.indices.memory; +package org.elasticsearch.indices; -import org.elasticsearch.common.component.AbstractLifecycleComponent; -import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.ByteSizeUnit; import org.elasticsearch.common.unit.ByteSizeValue; @@ -32,16 +31,16 @@ import org.elasticsearch.index.engine.FlushNotAllowedEngineException; import org.elasticsearch.index.shard.IndexEventListener; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.index.shard.IndexShardState; -import org.elasticsearch.indices.IndicesService; import org.elasticsearch.monitor.jvm.JvmInfo; import org.elasticsearch.threadpool.ThreadPool; +import java.io.Closeable; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.concurrent.ScheduledFuture; -public class IndexingMemoryController extends AbstractLifecycleComponent implements IndexEventListener { +public class IndexingMemoryController extends AbstractComponent implements IndexEventListener, Closeable { /** How much heap (% or bytes) we will share across all actively indexing shards on this node (default: 10%). */ public static final String INDEX_BUFFER_SIZE_SETTING = "indices.memory.index_buffer_size"; @@ -70,10 +69,6 @@ public class IndexingMemoryController extends AbstractLifecycleComponent CAN_UPDATE_INDEX_BUFFER_STATES = EnumSet.of( IndexShardState.RECOVERING, IndexShardState.POST_RECOVERY, IndexShardState.STARTED, IndexShardState.RELOCATED); private final ShardsIndicesStatusChecker statusChecker; - @Inject - public IndexingMemoryController(Settings settings, ThreadPool threadPool, IndicesService indicesService) { + IndexingMemoryController(Settings settings, ThreadPool threadPool, IndicesService indicesService) { this(settings, threadPool, indicesService, JvmInfo.jvmInfo().getMem().getHeapMax().bytes()); } // for testing - protected IndexingMemoryController(Settings settings, ThreadPool threadPool, IndicesService indicesService, long jvmMemoryInBytes) { + IndexingMemoryController(Settings settings, ThreadPool threadPool, IndicesService indicesService, long jvmMemoryInBytes) { super(settings); - this.threadPool = threadPool; this.indicesService = indicesService; ByteSizeValue indexingBuffer; @@ -131,29 +124,23 @@ public class IndexingMemoryController extends AbstractLifecycleComponent scheduleTask(ThreadPool threadPool) { // it's fine to run it on the scheduler thread, no busy work - this.scheduler = threadPool.scheduleWithFixedDelay(statusChecker, interval); + return threadPool.scheduleWithFixedDelay(statusChecker, interval); } - @Override - protected void doStop() { + public void close() { FutureUtils.cancel(scheduler); - scheduler = null; - } - - @Override - protected void doClose() { } /** * returns the current budget for the total amount of indexing buffers of * active shards on this node */ - public ByteSizeValue indexingBufferSize() { + ByteSizeValue indexingBufferSize() { return indexingBuffer; } @@ -188,7 +175,7 @@ public class IndexingMemoryController extends AbstractLifecycleComponent i private final OldShardsStats oldShardsStats = new OldShardsStats(); private final IndexStoreConfig indexStoreConfig; private final MapperRegistry mapperRegistry; + private final IndexingMemoryController indexingMemoryController; @Override protected void doStart() { @@ -114,7 +116,7 @@ public class IndicesService extends AbstractLifecycleComponent i public IndicesService(Settings settings, PluginsService pluginsService, NodeEnvironment nodeEnv, ClusterSettings clusterSettings, AnalysisRegistry analysisRegistry, IndicesQueriesRegistry indicesQueriesRegistry, IndexNameExpressionResolver indexNameExpressionResolver, - ClusterService clusterService, MapperRegistry mapperRegistry) { + ClusterService clusterService, MapperRegistry mapperRegistry, ThreadPool threadPool) { super(settings); this.pluginsService = pluginsService; this.nodeEnv = nodeEnv; @@ -127,7 +129,7 @@ public class IndicesService extends AbstractLifecycleComponent i this.mapperRegistry = mapperRegistry; clusterSettings.addSettingsUpdateConsumer(IndexStoreConfig.INDICES_STORE_THROTTLE_TYPE_SETTING, indexStoreConfig::setRateLimitingType); clusterSettings.addSettingsUpdateConsumer(IndexStoreConfig.INDICES_STORE_THROTTLE_MAX_BYTES_PER_SEC_SETTING, indexStoreConfig::setRateLimitingThrottle); - + indexingMemoryController = new IndexingMemoryController(settings, threadPool, this); } @Override @@ -161,7 +163,7 @@ public class IndicesService extends AbstractLifecycleComponent i @Override protected void doClose() { - IOUtils.closeWhileHandlingException(analysisRegistry); + IOUtils.closeWhileHandlingException(analysisRegistry, indexingMemoryController); } /** @@ -291,6 +293,7 @@ public class IndicesService extends AbstractLifecycleComponent i final IndexModule indexModule = new IndexModule(idxSettings, indexStoreConfig, analysisRegistry); pluginsService.onIndexModule(indexModule); + indexModule.addIndexEventListener(indexingMemoryController); for (IndexEventListener listener : builtInListeners) { indexModule.addIndexEventListener(listener); } diff --git a/core/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java b/core/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java index 8a213898b6c..9357de7b1eb 100644 --- a/core/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java +++ b/core/src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java @@ -63,7 +63,6 @@ import org.elasticsearch.index.shard.ShardNotFoundException; import org.elasticsearch.index.snapshots.IndexShardRepository; import org.elasticsearch.indices.IndicesService; import org.elasticsearch.indices.flush.SyncedFlushService; -import org.elasticsearch.indices.memory.IndexingMemoryController; import org.elasticsearch.indices.recovery.RecoveryFailedException; import org.elasticsearch.indices.recovery.RecoverySource; import org.elasticsearch.indices.recovery.RecoveryState; @@ -130,9 +129,9 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent scheduleTask(ThreadPool threadPool) { + return null; + } } public void testShardAdditionAndRemoval() { From 2f5e2c09c80cdaf2153c4aec19296b5b17fb3ce9 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Sun, 10 Jan 2016 21:08:51 +0100 Subject: [PATCH 58/59] add @Override annotation --- .../java/org/elasticsearch/indices/IndexingMemoryController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/org/elasticsearch/indices/IndexingMemoryController.java b/core/src/main/java/org/elasticsearch/indices/IndexingMemoryController.java index 25c91a80582..d84c3b00255 100644 --- a/core/src/main/java/org/elasticsearch/indices/IndexingMemoryController.java +++ b/core/src/main/java/org/elasticsearch/indices/IndexingMemoryController.java @@ -132,6 +132,7 @@ public class IndexingMemoryController extends AbstractComponent implements Index return threadPool.scheduleWithFixedDelay(statusChecker, interval); } + @Override public void close() { FutureUtils.cancel(scheduler); } From 1cf48b08fb19c58ef85dbcaf3920ceb5e2b85618 Mon Sep 17 00:00:00 2001 From: Clinton Gormley Date: Sun, 10 Jan 2016 21:51:29 +0100 Subject: [PATCH 59/59] Merge pull request #15534 from jmluy/patch-2 Fix minor typos in inner hits document --- docs/reference/search/request/inner-hits.asciidoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/reference/search/request/inner-hits.asciidoc b/docs/reference/search/request/inner-hits.asciidoc index a79071b2662..09d995bbd27 100644 --- a/docs/reference/search/request/inner-hits.asciidoc +++ b/docs/reference/search/request/inner-hits.asciidoc @@ -11,7 +11,7 @@ it's very useful to know which inner nested objects (in the case of nested) or c of parent/child) caused certain information to be returned. The inner hits feature can be used for this. This feature returns per search hit in the search response additional nested hits that caused a search hit to match in a different scope. -Inner hits can be used by defining a `inner_hits` definition on a `nested`, `has_child` or `has_parent` query and filter. +Inner hits can be used by defining an `inner_hits` definition on a `nested`, `has_child` or `has_parent` query and filter. The structure looks like this: [source,js] @@ -23,7 +23,7 @@ The structure looks like this: } -------------------------------------------------- -If `_inner_hits` is defined on a query that supports it then each search hit will contain a `inner_hits` json object with the following structure: +If `_inner_hits` is defined on a query that supports it then each search hit will contain an `inner_hits` json object with the following structure: [source,js] -------------------------------------------------- @@ -234,7 +234,7 @@ An example of a response snippet that could be generated from the above search r Besides defining inner hits on query and filters, inner hits can also be defined as a top level construct alongside the `query` and `aggregations` definition. The main reason for using the top level inner hits definition is to let the inner hits return documents that don't match with the main query. Also inner hits definitions can be nested via the -top level notation. Other then that the inner hit definition inside the query should be used, because that is the most +top level notation. Other than that, the inner hit definition inside the query should be used because that is the most compact way for defining inner hits. The following snippet explains the basic structure of inner hits defined at the top level of the search request body: @@ -254,7 +254,7 @@ The following snippet explains the basic structure of inner hits defined at the } -------------------------------------------------- -Inside the `inner_hits` definition, first the name if the inner hit is defined then whether the inner_hit +Inside the `inner_hits` definition, first the name of the inner hit is defined then whether the inner_hit is a nested by defining `path` or a parent/child based definition by defining `type`. The next object layer contains the name of the nested object field if the inner_hits is nested or the parent or child type if the inner_hit definition is parent/child based.