Add asserting searcher to track searcher references

This assertion module also injects an AssertingIndexSearcher that
checks if our queries are all compliant with the lucene specification
which is improtant for future updates and changes in the upstream project.
This commit is contained in:
Simon Willnauer 2013-09-18 22:05:05 +02:00
parent bb4f30c76c
commit 04deb80634
16 changed files with 273 additions and 82 deletions

View File

@ -36,6 +36,7 @@ public class IndexEngineModule extends AbstractModule implements SpawnModules {
public static final class EngineSettings { public static final class EngineSettings {
public static final String ENGINE_TYPE = "index.engine.type"; public static final String ENGINE_TYPE = "index.engine.type";
public static final String INDEX_ENGINE_TYPE = "index.index_engine.type";
public static final Class<? extends Module> DEFAULT_INDEX_ENGINE = RobinIndexEngineModule.class; public static final Class<? extends Module> DEFAULT_INDEX_ENGINE = RobinIndexEngineModule.class;
public static final Class<? extends Module> DEFAULT_ENGINE = RobinEngineModule.class; public static final Class<? extends Module> DEFAULT_ENGINE = RobinEngineModule.class;
} }
@ -48,7 +49,7 @@ public class IndexEngineModule extends AbstractModule implements SpawnModules {
@Override @Override
public Iterable<? extends Module> spawnModules() { public Iterable<? extends Module> spawnModules() {
return ImmutableList.of(createModule(settings.getAsClass(EngineSettings.ENGINE_TYPE, EngineSettings.DEFAULT_INDEX_ENGINE, "org.elasticsearch.index.engine.", "IndexEngineModule"), settings)); return ImmutableList.of(createModule(settings.getAsClass(EngineSettings.INDEX_ENGINE_TYPE, EngineSettings.DEFAULT_INDEX_ENGINE, "org.elasticsearch.index.engine.", "IndexEngineModule"), settings));
} }
@Override @Override

View File

@ -676,17 +676,21 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
} }
@Override @Override
public Searcher searcher() throws EngineException { public final Searcher searcher() throws EngineException {
SearcherManager manager = this.searcherManager; SearcherManager manager = this.searcherManager;
try { try {
IndexSearcher searcher = manager.acquire(); IndexSearcher searcher = manager.acquire();
return new RobinSearcher(searcher, manager); return newSearcher(searcher, manager);
} catch (IOException ex) { } catch (IOException ex) {
logger.error("failed to accquire searcher for shard [{}]", ex, shardId); logger.error("failed to accquire searcher for shard [{}]", ex, shardId);
throw new EngineException(shardId, ex.getMessage()); throw new EngineException(shardId, ex.getMessage());
} }
} }
protected Searcher newSearcher(IndexSearcher searcher, SearcherManager manager) {
return new RobinSearcher(searcher, manager);
}
@Override @Override
public boolean refreshNeeded() { public boolean refreshNeeded() {
return dirty; return dirty;

View File

@ -19,7 +19,10 @@
package org.apache.lucene.util; package org.apache.lucene.util;
import com.carrotsearch.randomizedtesting.*; import com.carrotsearch.randomizedtesting.JUnit4MethodProvider;
import com.carrotsearch.randomizedtesting.LifecycleScope;
import com.carrotsearch.randomizedtesting.RandomizedContext;
import com.carrotsearch.randomizedtesting.RandomizedTest;
import com.carrotsearch.randomizedtesting.annotations.Listeners; import com.carrotsearch.randomizedtesting.annotations.Listeners;
import com.carrotsearch.randomizedtesting.annotations.TestGroup; import com.carrotsearch.randomizedtesting.annotations.TestGroup;
import com.carrotsearch.randomizedtesting.annotations.TestMethodProviders; import com.carrotsearch.randomizedtesting.annotations.TestMethodProviders;
@ -59,7 +62,6 @@ import java.util.logging.Logger;
// NOTE: this class is in o.a.lucene.util since it uses some classes that are related // NOTE: this class is in o.a.lucene.util since it uses some classes that are related
// to the test framework that didn't make sense to copy but are package private access // to the test framework that didn't make sense to copy but are package private access
public abstract class AbstractRandomizedTest extends RandomizedTest { public abstract class AbstractRandomizedTest extends RandomizedTest {
/** /**
* Annotation for integration tests * Annotation for integration tests
*/ */
@ -305,7 +307,6 @@ public abstract class AbstractRandomizedTest extends RandomizedTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
parentChainCallRule.setupCalled = true; parentChainCallRule.setupCalled = true;
currentSeed = SeedUtils.parseSeed(getContext().getRunnerSeedAsString());
} }
/** /**
@ -314,7 +315,6 @@ public abstract class AbstractRandomizedTest extends RandomizedTest {
@After @After
public void tearDown() throws Exception { public void tearDown() throws Exception {
parentChainCallRule.teardownCalled = true; parentChainCallRule.teardownCalled = true;
currentSeed = null;
} }
@ -355,10 +355,4 @@ public abstract class AbstractRandomizedTest extends RandomizedTest {
public String getTestName() { public String getTestName() {
return threadAndTestNameRule.testMethodName; return threadAndTestNameRule.testMethodName;
} }
private static volatile Long currentSeed;
public static Long getCurrentSeed() {
return currentSeed;
}
} }

View File

@ -103,6 +103,7 @@ public abstract class AbstractSharedClusterTest extends ElasticsearchTestCase {
cluster.beforeTest(getRandom()); cluster.beforeTest(getRandom());
wipeIndices(); wipeIndices();
wipeTemplates(); wipeTemplates();
randomIndexTemplate();
logger.info("[{}#{}]: before test", getTestClass().getSimpleName(), getTestName()); logger.info("[{}#{}]: before test", getTestClass().getSimpleName(), getTestName());
} }
@ -116,6 +117,7 @@ public abstract class AbstractSharedClusterTest extends ElasticsearchTestCase {
.persistentSettings().getAsMap().size(), equalTo(0)); .persistentSettings().getAsMap().size(), equalTo(0));
wipeIndices(); // wipe after to make sure we fail in the test that didn't ack the delete wipeIndices(); // wipe after to make sure we fail in the test that didn't ack the delete
wipeTemplates(); wipeTemplates();
ensureAllSearchersClosed();
ensureAllFilesClosed(); ensureAllFilesClosed();
logger.info("[{}#{}]: cleaned up after test", getTestClass().getSimpleName(), getTestName()); logger.info("[{}#{}]: cleaned up after test", getTestClass().getSimpleName(), getTestName());
} }
@ -136,6 +138,15 @@ public abstract class AbstractSharedClusterTest extends ElasticsearchTestCase {
return cluster().client(); return cluster().client();
} }
private static void randomIndexTemplate() {
client().admin().indices().preparePutTemplate("random_index_template")
.setTemplate("*")
.setOrder(0)
.setSettings(ImmutableSettings.builder()
.put(INDEX_SEED_SETTING, getRandom().nextLong()))
.execute().actionGet();
}
public static Iterable<Client> clients() { public static Iterable<Client> clients() {
return cluster().clients(); return cluster().clients();
} }

View File

@ -29,12 +29,14 @@ import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.index.store.mock.MockDirectoryHelper; import org.elasticsearch.index.store.mock.MockDirectoryHelper;
import org.elasticsearch.junit.listeners.LoggingListener; import org.elasticsearch.junit.listeners.LoggingListener;
import org.elasticsearch.test.engine.MockRobinEngine;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import java.io.Closeable; import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.Map.Entry;
import java.util.Random; import java.util.Random;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -49,6 +51,7 @@ public abstract class ElasticsearchTestCase extends AbstractRandomizedTest {
public static final String CHILD_VM_ID = System.getProperty("junit4.childvm.id", "" + System.currentTimeMillis()); public static final String CHILD_VM_ID = System.getProperty("junit4.childvm.id", "" + System.currentTimeMillis());
public static final long SHARED_CLUSTER_SEED = clusterSeed(); public static final long SHARED_CLUSTER_SEED = clusterSeed();
public static final String INDEX_SEED_SETTING = "index.tests.seed";
private static long clusterSeed() { private static long clusterSeed() {
String property = System.getProperty("tests.cluster_seed"); String property = System.getProperty("tests.cluster_seed");
@ -111,6 +114,24 @@ public abstract class ElasticsearchTestCase extends AbstractRandomizedTest {
} }
} }
public static void ensureAllSearchersClosed() {
if (MockRobinEngine.INFLIGHT_ENGINE_SEARCHERS.isEmpty()) {
return;
}
try {
RuntimeException ex = null;
StringBuilder builder = new StringBuilder("Unclosed Searchers instance for shards: [");
for (Entry<MockRobinEngine.AssertingSearcher, RuntimeException> entry : MockRobinEngine.INFLIGHT_ENGINE_SEARCHERS.entrySet()) {
ex = entry.getValue();
builder.append(entry.getKey().shardId()).append(",");
}
builder.append("]");
throw new RuntimeException(builder.toString(), ex);
} finally {
MockRobinEngine.INFLIGHT_ENGINE_SEARCHERS.clear();
}
}
public static void forceClearMockWrappers() { public static void forceClearMockWrappers() {
MockDirectoryHelper.wrappers.clear(); MockDirectoryHelper.wrappers.clear();
} }
@ -133,5 +154,12 @@ public abstract class ElasticsearchTestCase extends AbstractRandomizedTest {
ensureAllFilesClosed(); ensureAllFilesClosed();
} }
}); });
closeAfterSuite(new Closeable() {
@Override
public void close() throws IOException {
ensureAllSearchersClosed();
}
});
} }
} }

View File

@ -40,9 +40,11 @@ import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.engine.IndexEngineModule;
import org.elasticsearch.index.store.mock.MockFSIndexStoreModule; import org.elasticsearch.index.store.mock.MockFSIndexStoreModule;
import org.elasticsearch.node.Node; import org.elasticsearch.node.Node;
import org.elasticsearch.node.internal.InternalNode; import org.elasticsearch.node.internal.InternalNode;
import org.elasticsearch.test.engine.MockEngineModule;
import org.elasticsearch.transport.TransportService; import org.elasticsearch.transport.TransportService;
import java.io.Closeable; import java.io.Closeable;
@ -114,6 +116,7 @@ public class TestCluster {
/* use RAM directories in 10% of the runs */ /* use RAM directories in 10% of the runs */
// .put("index.store.type", random.nextInt(10) == 0 ? MockRamIndexStoreModule.class.getName() : MockFSIndexStoreModule.class.getName()) // .put("index.store.type", random.nextInt(10) == 0 ? MockRamIndexStoreModule.class.getName() : MockFSIndexStoreModule.class.getName())
.put("index.store.type", MockFSIndexStoreModule.class.getName()) // no RAM dir for now! .put("index.store.type", MockFSIndexStoreModule.class.getName()) // no RAM dir for now!
.put(IndexEngineModule.EngineSettings.ENGINE_TYPE, MockEngineModule.class.getName())
.put(defaultSettings) .put(defaultSettings)
.put("cluster.name", clusterName).build(); .put("cluster.name", clusterName).build();
} }

View File

@ -39,7 +39,7 @@ public class DeleteByQueryTests extends AbstractSharedClusterTest {
public void testDeleteAllNoIndices() { public void testDeleteAllNoIndices() {
client().admin().indices().prepareDelete().execute().actionGet(); client().admin().indices().prepareDelete().execute().actionGet();
client().admin().indices().prepareRefresh().execute().actionGet(); client().admin().indices().prepareRefresh().execute().actionGet();
DeleteByQueryRequestBuilder deleteByQueryRequestBuilder = new DeleteByQueryRequestBuilder(client()); DeleteByQueryRequestBuilder deleteByQueryRequestBuilder = client().prepareDeleteByQuery();
deleteByQueryRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); deleteByQueryRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
DeleteByQueryResponse actionGet = deleteByQueryRequestBuilder.execute().actionGet(); DeleteByQueryResponse actionGet = deleteByQueryRequestBuilder.execute().actionGet();
assertThat(actionGet.getIndices().size(), equalTo(0)); assertThat(actionGet.getIndices().size(), equalTo(0));
@ -55,7 +55,7 @@ public class DeleteByQueryTests extends AbstractSharedClusterTest {
SearchResponse search = client().prepareSearch().setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); SearchResponse search = client().prepareSearch().setQuery(QueryBuilders.matchAllQuery()).execute().actionGet();
assertThat(search.getHits().totalHits(), equalTo(1l)); assertThat(search.getHits().totalHits(), equalTo(1l));
DeleteByQueryRequestBuilder deleteByQueryRequestBuilder = new DeleteByQueryRequestBuilder(client()); DeleteByQueryRequestBuilder deleteByQueryRequestBuilder = client().prepareDeleteByQuery();
deleteByQueryRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); deleteByQueryRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
DeleteByQueryResponse actionGet = deleteByQueryRequestBuilder.execute().actionGet(); DeleteByQueryResponse actionGet = deleteByQueryRequestBuilder.execute().actionGet();
@ -78,7 +78,7 @@ public class DeleteByQueryTests extends AbstractSharedClusterTest {
SearchResponse search = client().prepareSearch().setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); SearchResponse search = client().prepareSearch().setQuery(QueryBuilders.matchAllQuery()).execute().actionGet();
assertThat(search.getHits().totalHits(), equalTo(1l)); assertThat(search.getHits().totalHits(), equalTo(1l));
DeleteByQueryRequestBuilder deleteByQueryRequestBuilder = new DeleteByQueryRequestBuilder(client()); DeleteByQueryRequestBuilder deleteByQueryRequestBuilder = client().prepareDeleteByQuery();
deleteByQueryRequestBuilder.setIndices("twitter", "missing"); deleteByQueryRequestBuilder.setIndices("twitter", "missing");
deleteByQueryRequestBuilder.setQuery(QueryBuilders.matchAllQuery()); deleteByQueryRequestBuilder.setQuery(QueryBuilders.matchAllQuery());

View File

@ -27,6 +27,7 @@ import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexDeletionPolicy; import org.apache.lucene.index.IndexDeletionPolicy;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TermQuery;
import org.elasticsearch.ElasticsearchTestCase;
import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.lucene.Lucene;
@ -39,6 +40,7 @@ import org.elasticsearch.index.codec.CodecService;
import org.elasticsearch.index.deletionpolicy.KeepOnlyLastDeletionPolicy; import org.elasticsearch.index.deletionpolicy.KeepOnlyLastDeletionPolicy;
import org.elasticsearch.index.deletionpolicy.SnapshotDeletionPolicy; import org.elasticsearch.index.deletionpolicy.SnapshotDeletionPolicy;
import org.elasticsearch.index.deletionpolicy.SnapshotIndexCommit; import org.elasticsearch.index.deletionpolicy.SnapshotIndexCommit;
import org.elasticsearch.index.deletionpolicy.SnapshotIndexCommitExistsMatcher;
import org.elasticsearch.index.engine.*; import org.elasticsearch.index.engine.*;
import org.elasticsearch.index.indexing.ShardIndexingService; import org.elasticsearch.index.indexing.ShardIndexingService;
import org.elasticsearch.index.indexing.slowlog.ShardSlowLogIndexingService; import org.elasticsearch.index.indexing.slowlog.ShardSlowLogIndexingService;
@ -57,11 +59,8 @@ import org.elasticsearch.index.store.Store;
import org.elasticsearch.index.store.distributor.LeastUsedDistributor; import org.elasticsearch.index.store.distributor.LeastUsedDistributor;
import org.elasticsearch.index.store.ram.RamDirectoryService; import org.elasticsearch.index.store.ram.RamDirectoryService;
import org.elasticsearch.index.translog.Translog; import org.elasticsearch.index.translog.Translog;
import org.elasticsearch.index.translog.fs.FsTranslog;
import org.elasticsearch.ElasticsearchTestCase;
import org.elasticsearch.index.deletionpolicy.SnapshotIndexCommitExistsMatcher;
import org.elasticsearch.index.engine.EngineSearcherTotalHitsMatcher;
import org.elasticsearch.index.translog.TranslogSizeMatcher; import org.elasticsearch.index.translog.TranslogSizeMatcher;
import org.elasticsearch.index.translog.fs.FsTranslog;
import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.threadpool.ThreadPool;
import org.hamcrest.MatcherAssert; import org.hamcrest.MatcherAssert;
import org.junit.After; import org.junit.After;
@ -321,11 +320,12 @@ public class RobinEngineTests extends ElasticsearchTestCase {
assertThat(getResult.exists(), equalTo(true)); assertThat(getResult.exists(), equalTo(true));
assertThat(getResult.source().source.toBytesArray(), equalTo(B_1.toBytesArray())); assertThat(getResult.source().source.toBytesArray(), equalTo(B_1.toBytesArray()));
assertThat(getResult.docIdAndVersion(), nullValue()); assertThat(getResult.docIdAndVersion(), nullValue());
getResult.release();
// but, not there non realtime // but, not there non realtime
getResult = engine.get(new Engine.Get(false, newUid("1"))); getResult = engine.get(new Engine.Get(false, newUid("1")));
assertThat(getResult.exists(), equalTo(false)); assertThat(getResult.exists(), equalTo(false));
getResult.release();
// refresh and it should be there // refresh and it should be there
engine.refresh(new Engine.Refresh().force(false)); engine.refresh(new Engine.Refresh().force(false));
@ -339,6 +339,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
getResult = engine.get(new Engine.Get(false, newUid("1"))); getResult = engine.get(new Engine.Get(false, newUid("1")));
assertThat(getResult.exists(), equalTo(true)); assertThat(getResult.exists(), equalTo(true));
assertThat(getResult.docIdAndVersion(), notNullValue()); assertThat(getResult.docIdAndVersion(), notNullValue());
getResult.release();
// now do an update // now do an update
document = testDocument(); document = testDocument();
@ -359,6 +360,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
assertThat(getResult.exists(), equalTo(true)); assertThat(getResult.exists(), equalTo(true));
assertThat(getResult.source().source.toBytesArray(), equalTo(B_2.toBytesArray())); assertThat(getResult.source().source.toBytesArray(), equalTo(B_2.toBytesArray()));
assertThat(getResult.docIdAndVersion(), nullValue()); assertThat(getResult.docIdAndVersion(), nullValue());
getResult.release();
// refresh and it should be updated // refresh and it should be updated
engine.refresh(new Engine.Refresh().force(false)); engine.refresh(new Engine.Refresh().force(false));
@ -382,6 +384,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
// but, get should not see it (in realtime) // but, get should not see it (in realtime)
getResult = engine.get(new Engine.Get(true, newUid("1"))); getResult = engine.get(new Engine.Get(true, newUid("1")));
assertThat(getResult.exists(), equalTo(false)); assertThat(getResult.exists(), equalTo(false));
getResult.release();
// refresh and it should be deleted // refresh and it should be deleted
engine.refresh(new Engine.Refresh().force(false)); engine.refresh(new Engine.Refresh().force(false));
@ -423,7 +426,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
assertThat(getResult.exists(), equalTo(true)); assertThat(getResult.exists(), equalTo(true));
assertThat(getResult.source(), nullValue()); assertThat(getResult.source(), nullValue());
assertThat(getResult.docIdAndVersion(), notNullValue()); assertThat(getResult.docIdAndVersion(), notNullValue());
getResult.release();
// make sure we can still work with the engine // make sure we can still work with the engine
// now do an update // now do an update

View File

@ -22,8 +22,8 @@ package org.elasticsearch.index.store.mock;
import com.carrotsearch.randomizedtesting.SeedUtils; import com.carrotsearch.randomizedtesting.SeedUtils;
import org.apache.lucene.store.*; import org.apache.lucene.store.*;
import org.apache.lucene.store.MockDirectoryWrapper.Throttling; import org.apache.lucene.store.MockDirectoryWrapper.Throttling;
import org.apache.lucene.util.AbstractRandomizedTest;
import org.apache.lucene.util.Constants; import org.apache.lucene.util.Constants;
import org.elasticsearch.ElasticsearchTestCase;
import org.elasticsearch.cache.memory.ByteBufferCache; import org.elasticsearch.cache.memory.ByteBufferCache;
import org.elasticsearch.common.logging.ESLogger; import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
@ -44,7 +44,6 @@ import java.util.Set;
public class MockDirectoryHelper { public class MockDirectoryHelper {
public static final String RANDOM_IO_EXCEPTION_RATE = "index.store.mock.random.io_exception_rate"; public static final String RANDOM_IO_EXCEPTION_RATE = "index.store.mock.random.io_exception_rate";
public static final String RANDOM_IO_EXCEPTION_RATE_ON_OPEN = "index.store.mock.random.io_exception_rate_on_open"; public static final String RANDOM_IO_EXCEPTION_RATE_ON_OPEN = "index.store.mock.random.io_exception_rate_on_open";
public static final String RANDOM_SEED = "index.store.mock.random.seed";
public static final String RANDOM_THROTTLE = "index.store.mock.random.throttle"; public static final String RANDOM_THROTTLE = "index.store.mock.random.throttle";
public static final String CHECK_INDEX_ON_CLOSE = "index.store.mock.check_index_on_close"; public static final String CHECK_INDEX_ON_CLOSE = "index.store.mock.check_index_on_close";
public static final Set<MockDirectoryWrapper> wrappers = ConcurrentCollections.newConcurrentSet(); public static final Set<MockDirectoryWrapper> wrappers = ConcurrentCollections.newConcurrentSet();
@ -59,9 +58,7 @@ public class MockDirectoryHelper {
public MockDirectoryHelper(ShardId shardId, Settings indexSettings, ESLogger logger) { public MockDirectoryHelper(ShardId shardId, Settings indexSettings, ESLogger logger) {
randomIOExceptionRate = indexSettings.getAsDouble(RANDOM_IO_EXCEPTION_RATE, 0.0d); randomIOExceptionRate = indexSettings.getAsDouble(RANDOM_IO_EXCEPTION_RATE, 0.0d);
randomIOExceptionRateOnOpen = indexSettings.getAsDouble(RANDOM_IO_EXCEPTION_RATE_ON_OPEN, 0.0d); randomIOExceptionRateOnOpen = indexSettings.getAsDouble(RANDOM_IO_EXCEPTION_RATE_ON_OPEN, 0.0d);
final Long currentSeed = AbstractRandomizedTest.getCurrentSeed(); final long seed = indexSettings.getAsLong(ElasticsearchTestCase.INDEX_SEED_SETTING, 0l);
assert currentSeed != null;
final long seed = indexSettings.getAsLong(RANDOM_SEED, currentSeed);
random = new Random(seed); random = new Random(seed);
random.nextInt(shardId.getId() + 1); // some randomness per shard random.nextInt(shardId.getId() + 1); // some randomness per shard
throttle = Throttling.valueOf(indexSettings.get(RANDOM_THROTTLE, random.nextDouble() < 0.1 ? "SOMETIMES" : "NEVER")); throttle = Throttling.valueOf(indexSettings.get(RANDOM_THROTTLE, random.nextDouble() < 0.1 ? "SOMETIMES" : "NEVER"));

View File

@ -116,6 +116,7 @@ public class SimpleIndexTemplateTests extends AbstractSharedClusterTest {
@Test @Test
public void testDeleteIndexTemplate() throws Exception { public void testDeleteIndexTemplate() throws Exception {
final int existingTemplates = admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().size();
logger.info("--> put template_1 and template_2"); logger.info("--> put template_1 and template_2");
client().admin().indices().preparePutTemplate("template_1") client().admin().indices().preparePutTemplate("template_1")
.setTemplate("te*") .setTemplate("te*")
@ -136,8 +137,10 @@ public class SimpleIndexTemplateTests extends AbstractSharedClusterTest {
logger.info("--> explicitly delete template_1"); logger.info("--> explicitly delete template_1");
admin().indices().prepareDeleteTemplate("template_1").execute().actionGet(); admin().indices().prepareDeleteTemplate("template_1").execute().actionGet();
assertThat(admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().size(), equalTo(1)); assertThat(admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().size(), equalTo(1+existingTemplates));
assertThat(admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().containsKey("template_2"), equalTo(true)); assertThat(admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().containsKey("template_2"), equalTo(true));
assertThat(admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().containsKey("template_1"), equalTo(false));
logger.info("--> put template_1 back"); logger.info("--> put template_1 back");
client().admin().indices().preparePutTemplate("template_1") client().admin().indices().preparePutTemplate("template_1")
@ -151,7 +154,7 @@ public class SimpleIndexTemplateTests extends AbstractSharedClusterTest {
logger.info("--> delete template*"); logger.info("--> delete template*");
admin().indices().prepareDeleteTemplate("template*").execute().actionGet(); admin().indices().prepareDeleteTemplate("template*").execute().actionGet();
assertThat(admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().size(), equalTo(0)); assertThat(admin().cluster().prepareState().execute().actionGet().getState().metaData().templates().size(), equalTo(existingTemplates));
logger.info("--> delete * with no templates, make sure we don't get a failure"); logger.info("--> delete * with no templates, make sure we don't get a failure");
admin().indices().prepareDeleteTemplate("*").execute().actionGet(); admin().indices().prepareDeleteTemplate("*").execute().actionGet();
@ -224,7 +227,7 @@ public class SimpleIndexTemplateTests extends AbstractSharedClusterTest {
assertThat(templateNames, containsInAnyOrder("template_1", "template_2")); assertThat(templateNames, containsInAnyOrder("template_1", "template_2"));
logger.info("--> get all templates"); logger.info("--> get all templates");
getTemplate1Response = client().admin().indices().prepareGetTemplates().execute().actionGet(); getTemplate1Response = client().admin().indices().prepareGetTemplates("template*").execute().actionGet();
assertThat(getTemplate1Response.getIndexTemplates(), hasSize(3)); assertThat(getTemplate1Response.getIndexTemplates(), hasSize(3));
templateNames = Lists.newArrayList(); templateNames = Lists.newArrayList();

View File

@ -66,10 +66,7 @@ public class SearchWhileRelocatingTests extends AbstractSharedClusterTest {
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>(); List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();
final int numDocs = between(10, 20); final int numDocs = between(10, 20);
for (int i = 0; i < numDocs; i++) { for (int i = 0; i < numDocs; i++) {
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex("test", "type", Integer.toString(i))
.setType("type")
.setId(Integer.toString(i))
.setIndex("test")
.setSource( .setSource(
jsonBuilder().startObject().field("test", "value").startObject("loc").field("lat", 11).field("lon", 21) jsonBuilder().startObject().field("test", "value").startObject("loc").field("lat", 11).field("lon", 21)
.endObject().endObject())); .endObject().endObject()));

View File

@ -19,6 +19,7 @@
package org.elasticsearch.search.child; package org.elasticsearch.search.child;
import org.elasticsearch.AbstractSharedClusterTest;
import org.elasticsearch.ElasticSearchException; import org.elasticsearch.ElasticSearchException;
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse; import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
import org.elasticsearch.action.count.CountResponse; import org.elasticsearch.action.count.CountResponse;
@ -33,7 +34,6 @@ import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.facet.terms.TermsFacet; import org.elasticsearch.search.facet.terms.TermsFacet;
import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.AbstractSharedClusterTest;
import org.hamcrest.Matchers; import org.hamcrest.Matchers;
import org.junit.Test; import org.junit.Test;
@ -1107,54 +1107,54 @@ public class SimpleChildQuerySearchTests extends AbstractSharedClusterTest {
List<IndexRequestBuilder> createDocBuilders() { List<IndexRequestBuilder> createDocBuilders() {
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>(); List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();
// Parent 1 and its children // Parent 1 and its children
indexBuilders.add(new IndexRequestBuilder(client()).setType("parent").setId("1").setIndex("test").setSource("p_field", "p_value1")); indexBuilders.add(client().prepareIndex().setType("parent").setId("1").setIndex("test").setSource("p_field", "p_value1"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("1").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("1").setIndex("test")
.setSource("c_field1", 1, "c_field2", 0).setParent("1")); .setSource("c_field1", 1, "c_field2", 0).setParent("1"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("2").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("2").setIndex("test")
.setSource("c_field1", 1, "c_field2", 0).setParent("1")); .setSource("c_field1", 1, "c_field2", 0).setParent("1"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("3").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("3").setIndex("test")
.setSource("c_field1", 2, "c_field2", 0).setParent("1")); .setSource("c_field1", 2, "c_field2", 0).setParent("1"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("4").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("4").setIndex("test")
.setSource("c_field1", 2, "c_field2", 0).setParent("1")); .setSource("c_field1", 2, "c_field2", 0).setParent("1"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("5").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("5").setIndex("test")
.setSource("c_field1", 1, "c_field2", 1).setParent("1")); .setSource("c_field1", 1, "c_field2", 1).setParent("1"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("6").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("6").setIndex("test")
.setSource("c_field1", 1, "c_field2", 2).setParent("1")); .setSource("c_field1", 1, "c_field2", 2).setParent("1"));
// Parent 2 and its children // Parent 2 and its children
indexBuilders.add(new IndexRequestBuilder(client()).setType("parent").setId("2").setIndex("test").setSource("p_field", "p_value2")); indexBuilders.add(client().prepareIndex().setType("parent").setId("2").setIndex("test").setSource("p_field", "p_value2"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("7").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("7").setIndex("test")
.setSource("c_field1", 3, "c_field2", 0).setParent("2")); .setSource("c_field1", 3, "c_field2", 0).setParent("2"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("8").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("8").setIndex("test")
.setSource("c_field1", 1, "c_field2", 1).setParent("2")); .setSource("c_field1", 1, "c_field2", 1).setParent("2"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("9").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("9").setIndex("test")
.setSource("c_field1", 1, "c_field2", 1).setParent("p")); // why .setSource("c_field1", 1, "c_field2", 1).setParent("p")); // why
// "p"???? // "p"????
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("10").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("10").setIndex("test")
.setSource("c_field1", 1, "c_field2", 1).setParent("2")); .setSource("c_field1", 1, "c_field2", 1).setParent("2"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("11").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("11").setIndex("test")
.setSource("c_field1", 1, "c_field2", 1).setParent("2")); .setSource("c_field1", 1, "c_field2", 1).setParent("2"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("12").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("12").setIndex("test")
.setSource("c_field1", 1, "c_field2", 2).setParent("2")); .setSource("c_field1", 1, "c_field2", 2).setParent("2"));
// Parent 3 and its children // Parent 3 and its children
indexBuilders.add(new IndexRequestBuilder(client()).setType("parent").setId("3").setIndex("test") indexBuilders.add(client().prepareIndex().setType("parent").setId("3").setIndex("test")
.setSource("p_field1", "p_value3", "p_field2", 5)); .setSource("p_field1", "p_value3", "p_field2", 5));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("13").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("13").setIndex("test")
.setSource("c_field1", 4, "c_field2", 0, "c_field3", 0).setParent("3")); .setSource("c_field1", 4, "c_field2", 0, "c_field3", 0).setParent("3"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("14").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("14").setIndex("test")
.setSource("c_field1", 1, "c_field2", 1, "c_field3", 1).setParent("3")); .setSource("c_field1", 1, "c_field2", 1, "c_field3", 1).setParent("3"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("15").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("15").setIndex("test")
.setSource("c_field1", 1, "c_field2", 2, "c_field3", 2).setParent("3")); // why .setSource("c_field1", 1, "c_field2", 2, "c_field3", 2).setParent("3")); // why
// "p"???? // "p"????
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("16").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("16").setIndex("test")
.setSource("c_field1", 1, "c_field2", 2, "c_field3", 3).setParent("3")); .setSource("c_field1", 1, "c_field2", 2, "c_field3", 3).setParent("3"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("17").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("17").setIndex("test")
.setSource("c_field1", 1, "c_field2", 2, "c_field3", 4).setParent("3")); .setSource("c_field1", 1, "c_field2", 2, "c_field3", 4).setParent("3"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child").setId("18").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child").setId("18").setIndex("test")
.setSource("c_field1", 1, "c_field2", 2, "c_field3", 5).setParent("3")); .setSource("c_field1", 1, "c_field2", 2, "c_field3", 5).setParent("3"));
indexBuilders.add(new IndexRequestBuilder(client()).setType("child1").setId("1").setIndex("test") indexBuilders.add(client().prepareIndex().setType("child1").setId("1").setIndex("test")
.setSource("c_field1", 1, "c_field2", 2, "c_field3", 6).setParent("3")); .setSource("c_field1", 1, "c_field2", 2, "c_field3", 6).setParent("3"));
return indexBuilders; return indexBuilders;

View File

@ -61,14 +61,14 @@ public class DecayFunctionScoreTests extends AbstractSharedClusterTest {
ensureYellow(); ensureYellow();
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>(); List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex()
.setType("type1") .setType("type1")
.setId("1") .setId("1")
.setIndex("test") .setIndex("test")
.setSource( .setSource(
jsonBuilder().startObject().field("test", "value").startObject("loc").field("lat", 10).field("lon", 20).endObject() jsonBuilder().startObject().field("test", "value").startObject("loc").field("lat", 10).field("lon", 20).endObject()
.endObject())); .endObject()));
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex()
.setType("type1") .setType("type1")
.setId("2") .setId("2")
.setIndex("test") .setIndex("test")
@ -78,7 +78,7 @@ public class DecayFunctionScoreTests extends AbstractSharedClusterTest {
int numDummyDocs = 20; int numDummyDocs = 20;
for (int i = 1; i <= numDummyDocs; i++) { for (int i = 1; i <= numDummyDocs; i++) {
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex()
.setType("type1") .setType("type1")
.setId(Integer.toString(i + 3)) .setId(Integer.toString(i + 3))
.setIndex("test") .setIndex("test")
@ -163,15 +163,15 @@ public class DecayFunctionScoreTests extends AbstractSharedClusterTest {
// add tw docs within offset // add tw docs within offset
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>(); List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();
indexBuilders.add(new IndexRequestBuilder(client()).setType("type1").setId("1").setIndex("test") indexBuilders.add(client().prepareIndex().setType("type1").setId("1").setIndex("test")
.setSource(jsonBuilder().startObject().field("test", "value").field("num", 0.5).endObject())); .setSource(jsonBuilder().startObject().field("test", "value").field("num", 0.5).endObject()));
indexBuilders.add(new IndexRequestBuilder(client()).setType("type1").setId("2").setIndex("test") indexBuilders.add(client().prepareIndex().setType("type1").setId("2").setIndex("test")
.setSource(jsonBuilder().startObject().field("test", "value").field("num", 1.7).endObject())); .setSource(jsonBuilder().startObject().field("test", "value").field("num", 1.7).endObject()));
// add docs outside offset // add docs outside offset
int numDummyDocs = 20; int numDummyDocs = 20;
for (int i = 0; i < numDummyDocs; i++) { for (int i = 0; i < numDummyDocs; i++) {
indexBuilders.add(new IndexRequestBuilder(client()).setType("type1").setId(Integer.toString(i + 3)).setIndex("test") indexBuilders.add(client().prepareIndex().setType("type1").setId(Integer.toString(i + 3)).setIndex("test")
.setSource(jsonBuilder().startObject().field("test", "value").field("num", 3.0 + i).endObject())); .setSource(jsonBuilder().startObject().field("test", "value").field("num", 3.0 + i).endObject()));
} }
IndexRequestBuilder[] builders = indexBuilders.toArray(new IndexRequestBuilder[indexBuilders.size()]); IndexRequestBuilder[] builders = indexBuilders.toArray(new IndexRequestBuilder[indexBuilders.size()]);
@ -242,14 +242,14 @@ public class DecayFunctionScoreTests extends AbstractSharedClusterTest {
ensureYellow(); ensureYellow();
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>(); List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex()
.setType("type1") .setType("type1")
.setId("1") .setId("1")
.setIndex("test") .setIndex("test")
.setSource( .setSource(
jsonBuilder().startObject().field("test", "value").startObject("loc").field("lat", 11).field("lon", 21).endObject() jsonBuilder().startObject().field("test", "value").startObject("loc").field("lat", 11).field("lon", 21).endObject()
.endObject())); .endObject()));
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex()
.setType("type1") .setType("type1")
.setId("2") .setId("2")
.setIndex("test") .setIndex("test")
@ -300,7 +300,7 @@ public class DecayFunctionScoreTests extends AbstractSharedClusterTest {
ensureYellow(); ensureYellow();
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>(); List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex()
.setType("type1") .setType("type1")
.setId("1") .setId("1")
.setIndex("test") .setIndex("test")
@ -346,7 +346,7 @@ public class DecayFunctionScoreTests extends AbstractSharedClusterTest {
ensureYellow(); ensureYellow();
List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>(); List<IndexRequestBuilder> indexBuilders = new ArrayList<IndexRequestBuilder>();
indexBuilders.add(new IndexRequestBuilder(client()).setType("type1").setId("1").setIndex("test") indexBuilders.add(client().prepareIndex().setType("type1").setId("1").setIndex("test")
.setSource(jsonBuilder().startObject().field("test", "value").field("num", 1.0).endObject())); .setSource(jsonBuilder().startObject().field("test", "value").field("num", 1.0).endObject()));
IndexRequestBuilder[] builders = indexBuilders.toArray(new IndexRequestBuilder[indexBuilders.size()]); IndexRequestBuilder[] builders = indexBuilders.toArray(new IndexRequestBuilder[indexBuilders.size()]);
@ -579,7 +579,7 @@ public class DecayFunctionScoreTests extends AbstractSharedClusterTest {
String dayString = day < 10 ? "0" + Integer.toString(day) : Integer.toString(day); String dayString = day < 10 ? "0" + Integer.toString(day) : Integer.toString(day);
String date = "2013-05-" + dayString; String date = "2013-05-" + dayString;
indexBuilders.add(new IndexRequestBuilder(client()) indexBuilders.add(client().prepareIndex()
.setType("type") .setType("type")
.setId(Integer.toString(i)) .setId(Integer.toString(i))
.setIndex("test") .setIndex("test")

View File

@ -214,11 +214,6 @@ public class SearchScrollTests extends AbstractSharedClusterTest {
@Test @Test
public void testSimpleScrollQueryThenFetch_clearScrollIds() throws Exception { public void testSimpleScrollQueryThenFetch_clearScrollIds() throws Exception {
try {
client().admin().indices().prepareDelete("test").execute().actionGet();
} catch (Exception e) {
// ignore
}
client().admin().indices().prepareCreate("test").setSettings(ImmutableSettings.settingsBuilder().put("index.number_of_shards", 3)).execute().actionGet(); client().admin().indices().prepareCreate("test").setSettings(ImmutableSettings.settingsBuilder().put("index.number_of_shards", 3)).execute().actionGet();
client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().execute().actionGet(); client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().execute().actionGet();
@ -234,6 +229,7 @@ public class SearchScrollTests extends AbstractSharedClusterTest {
.setQuery(matchAllQuery()) .setQuery(matchAllQuery())
.setSize(35) .setSize(35)
.setScroll(TimeValue.timeValueMinutes(2)) .setScroll(TimeValue.timeValueMinutes(2))
.setSearchType(SearchType.QUERY_THEN_FETCH)
.addSort("field", SortOrder.ASC) .addSort("field", SortOrder.ASC)
.execute().actionGet(); .execute().actionGet();
@ -241,6 +237,7 @@ public class SearchScrollTests extends AbstractSharedClusterTest {
.setQuery(matchAllQuery()) .setQuery(matchAllQuery())
.setSize(35) .setSize(35)
.setScroll(TimeValue.timeValueMinutes(2)) .setScroll(TimeValue.timeValueMinutes(2))
.setSearchType(SearchType.QUERY_THEN_FETCH)
.addSort("field", SortOrder.ASC) .addSort("field", SortOrder.ASC)
.execute().actionGet(); .execute().actionGet();
@ -302,11 +299,6 @@ public class SearchScrollTests extends AbstractSharedClusterTest {
@Test @Test
public void testSimpleScrollQueryThenFetch_clearAllScrollIds() throws Exception { public void testSimpleScrollQueryThenFetch_clearAllScrollIds() throws Exception {
try {
client().admin().indices().prepareDelete("test").execute().actionGet();
} catch (Exception e) {
// ignore
}
client().admin().indices().prepareCreate("test").setSettings(ImmutableSettings.settingsBuilder().put("index.number_of_shards", 3)).execute().actionGet(); client().admin().indices().prepareCreate("test").setSettings(ImmutableSettings.settingsBuilder().put("index.number_of_shards", 3)).execute().actionGet();
client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().execute().actionGet(); client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().execute().actionGet();
@ -322,6 +314,7 @@ public class SearchScrollTests extends AbstractSharedClusterTest {
.setQuery(matchAllQuery()) .setQuery(matchAllQuery())
.setSize(35) .setSize(35)
.setScroll(TimeValue.timeValueMinutes(2)) .setScroll(TimeValue.timeValueMinutes(2))
.setSearchType(SearchType.QUERY_THEN_FETCH)
.addSort("field", SortOrder.ASC) .addSort("field", SortOrder.ASC)
.execute().actionGet(); .execute().actionGet();
@ -329,6 +322,7 @@ public class SearchScrollTests extends AbstractSharedClusterTest {
.setQuery(matchAllQuery()) .setQuery(matchAllQuery())
.setSize(35) .setSize(35)
.setScroll(TimeValue.timeValueMinutes(2)) .setScroll(TimeValue.timeValueMinutes(2))
.setSearchType(SearchType.QUERY_THEN_FETCH)
.addSort("field", SortOrder.ASC) .addSort("field", SortOrder.ASC)
.execute().actionGet(); .execute().actionGet();

View File

@ -0,0 +1,31 @@
/*
* Licensed to ElasticSearch and Shay Banon 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.test.engine;
import org.elasticsearch.common.inject.AbstractModule;
import org.elasticsearch.index.engine.Engine;
public class MockEngineModule extends AbstractModule {
@Override
protected void configure() {
bind(Engine.class).to(MockRobinEngine.class).asEagerSingleton();
}
}

View File

@ -0,0 +1,125 @@
/*
* Licensed to ElasticSearch and Shay Banon 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.test.engine;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.AssertingIndexSearcher;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.SearcherManager;
import org.elasticsearch.ElasticSearchException;
import org.elasticsearch.ElasticsearchTestCase;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.analysis.AnalysisService;
import org.elasticsearch.index.codec.CodecService;
import org.elasticsearch.index.deletionpolicy.SnapshotDeletionPolicy;
import org.elasticsearch.index.engine.Engine;
import org.elasticsearch.index.engine.EngineException;
import org.elasticsearch.index.engine.robin.RobinEngine;
import org.elasticsearch.index.indexing.ShardIndexingService;
import org.elasticsearch.index.merge.policy.MergePolicyProvider;
import org.elasticsearch.index.merge.scheduler.MergeSchedulerProvider;
import org.elasticsearch.index.settings.IndexSettings;
import org.elasticsearch.index.settings.IndexSettingsService;
import org.elasticsearch.index.shard.ShardId;
import org.elasticsearch.index.similarity.SimilarityService;
import org.elasticsearch.index.store.Store;
import org.elasticsearch.index.translog.Translog;
import org.elasticsearch.indices.warmer.IndicesWarmer;
import org.elasticsearch.threadpool.ThreadPool;
import java.util.Map.Entry;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public final class MockRobinEngine extends RobinEngine implements Engine {
public static final ConcurrentMap<AssertingSearcher, RuntimeException> INFLIGHT_ENGINE_SEARCHERS = new ConcurrentHashMap<AssertingSearcher, RuntimeException>();
private final Random random;
@Inject
public MockRobinEngine(ShardId shardId, @IndexSettings Settings indexSettings, ThreadPool threadPool,
IndexSettingsService indexSettingsService, ShardIndexingService indexingService, @Nullable IndicesWarmer warmer, Store store,
SnapshotDeletionPolicy deletionPolicy, Translog translog, MergePolicyProvider mergePolicyProvider,
MergeSchedulerProvider mergeScheduler, AnalysisService analysisService, SimilarityService similarityService,
CodecService codecService) throws EngineException {
super(shardId, indexSettings, threadPool, indexSettingsService, indexingService, warmer, store,
deletionPolicy, translog, mergePolicyProvider, mergeScheduler, analysisService, similarityService, codecService);
final long seed = indexSettings.getAsLong(ElasticsearchTestCase.INDEX_SEED_SETTING, 0l);
if (logger.isTraceEnabled()){
logger.trace("Using [{}] for shard [{}] seed: [{}]", this.getClass().getName(), shardId, seed);
}
random = new Random(seed);
}
public void close() throws ElasticSearchException {
try {
super.close();
} finally {
if (logger.isDebugEnabled()) {
// log debug if we have pending searchers
for (Entry<MockRobinEngine.AssertingSearcher, RuntimeException> entry : MockRobinEngine.INFLIGHT_ENGINE_SEARCHERS.entrySet()) {
logger.debug("Unreleased Searchers instance for shard [{}]", entry.getValue(), entry.getKey().shardId);
}
}
}
}
@Override
protected Searcher newSearcher(IndexSearcher searcher, SearcherManager manager) throws EngineException {
// this executes basic query checks and asserts that weights are normalized only once etc.
final AssertingIndexSearcher assertingIndexSearcher = new AssertingIndexSearcher(random, searcher.getTopReaderContext());
assertingIndexSearcher.setSimilarity(searcher.getSimilarity());
return new AssertingSearcher(super.newSearcher(assertingIndexSearcher, manager), shardId);
}
public static final class AssertingSearcher implements Searcher {
private final Searcher searcher;
private final ShardId shardId;
public AssertingSearcher(Searcher searcher, ShardId shardId) {
this.searcher = searcher;
this.shardId = shardId;
INFLIGHT_ENGINE_SEARCHERS.put(this, new RuntimeException("Unreleased Searcher"));
}
@Override
public boolean release() throws ElasticSearchException {
RuntimeException remove = INFLIGHT_ENGINE_SEARCHERS.remove(this);
assert remove != null : "Released Searcher more than once";
return searcher.release();
}
@Override
public IndexReader reader() {
return searcher.reader();
}
@Override
public IndexSearcher searcher() {
return searcher.searcher();
}
public ShardId shardId() {
return shardId;
}
}
}