Fixed date math expression support in multi get requests. (#20659)
Date math index/alias expressions in mget will now be resolved to a concrete single index instead of failing the mget item with an `IndexNotFoundException`. Added also an integration test to verify multi index aliases do not fail the entire mget request. Closes #17957
This commit is contained in:
parent
c92b550df2
commit
95b6f85c87
|
@ -64,16 +64,11 @@ public class TransportMultiGetAction extends HandledTransportAction<MultiGetRequ
|
||||||
for (int i = 0; i < request.items.size(); i++) {
|
for (int i = 0; i < request.items.size(); i++) {
|
||||||
MultiGetRequest.Item item = request.items.get(i);
|
MultiGetRequest.Item item = request.items.get(i);
|
||||||
|
|
||||||
if (!clusterState.metaData().hasConcreteIndex(item.index())) {
|
|
||||||
responses.set(i, newItemFailure(item.index(), item.type(), item.id(), new IndexNotFoundException(item.index())));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String concreteSingleIndex;
|
String concreteSingleIndex;
|
||||||
try {
|
try {
|
||||||
item.routing(clusterState.metaData().resolveIndexRouting(item.parent(), item.routing(), item.index()));
|
|
||||||
concreteSingleIndex = indexNameExpressionResolver.concreteSingleIndex(clusterState, item).getName();
|
concreteSingleIndex = indexNameExpressionResolver.concreteSingleIndex(clusterState, item).getName();
|
||||||
|
|
||||||
|
item.routing(clusterState.metaData().resolveIndexRouting(item.parent(), item.routing(), concreteSingleIndex));
|
||||||
if ((item.routing() == null) && (clusterState.getMetaData().routingRequired(concreteSingleIndex, item.type()))) {
|
if ((item.routing() == null) && (clusterState.getMetaData().routingRequired(concreteSingleIndex, item.type()))) {
|
||||||
String message = "routing is required for [" + concreteSingleIndex + "]/[" + item.type() + "]/[" + item.id() + "]";
|
String message = "routing is required for [" + concreteSingleIndex + "]/[" + item.type() + "]/[" + item.id() + "]";
|
||||||
responses.set(i, newItemFailure(concreteSingleIndex, item.type(), item.id(), new IllegalArgumentException(message)));
|
responses.set(i, newItemFailure(concreteSingleIndex, item.type(), item.id(), new IllegalArgumentException(message)));
|
||||||
|
|
|
@ -24,6 +24,7 @@ import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse;
|
||||||
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
|
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
|
||||||
import org.elasticsearch.action.delete.DeleteResponse;
|
import org.elasticsearch.action.delete.DeleteResponse;
|
||||||
import org.elasticsearch.action.get.GetResponse;
|
import org.elasticsearch.action.get.GetResponse;
|
||||||
|
import org.elasticsearch.action.get.MultiGetResponse;
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
import org.elasticsearch.cluster.ClusterState;
|
import org.elasticsearch.cluster.ClusterState;
|
||||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||||
|
@ -77,6 +78,17 @@ public class DateMathIndexExpressionsIntegrationIT extends ESIntegTestCase {
|
||||||
assertThat(getResponse.isExists(), is(true));
|
assertThat(getResponse.isExists(), is(true));
|
||||||
assertThat(getResponse.getId(), equalTo("3"));
|
assertThat(getResponse.getId(), equalTo("3"));
|
||||||
|
|
||||||
|
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
||||||
|
.add(dateMathExp1, "type", "1")
|
||||||
|
.add(dateMathExp2, "type", "2")
|
||||||
|
.add(dateMathExp3, "type", "3").get();
|
||||||
|
assertThat(mgetResponse.getResponses()[0].getResponse().isExists(), is(true));
|
||||||
|
assertThat(mgetResponse.getResponses()[0].getResponse().getId(), equalTo("1"));
|
||||||
|
assertThat(mgetResponse.getResponses()[1].getResponse().isExists(), is(true));
|
||||||
|
assertThat(mgetResponse.getResponses()[1].getResponse().getId(), equalTo("2"));
|
||||||
|
assertThat(mgetResponse.getResponses()[2].getResponse().isExists(), is(true));
|
||||||
|
assertThat(mgetResponse.getResponses()[2].getResponse().getId(), equalTo("3"));
|
||||||
|
|
||||||
IndicesStatsResponse indicesStatsResponse = client().admin().indices().prepareStats(dateMathExp1, dateMathExp2, dateMathExp3).get();
|
IndicesStatsResponse indicesStatsResponse = client().admin().indices().prepareStats(dateMathExp1, dateMathExp2, dateMathExp3).get();
|
||||||
assertThat(indicesStatsResponse.getIndex(index1), notNullValue());
|
assertThat(indicesStatsResponse.getIndex(index1), notNullValue());
|
||||||
assertThat(indicesStatsResponse.getIndex(index2), notNullValue());
|
assertThat(indicesStatsResponse.getIndex(index2), notNullValue());
|
||||||
|
|
|
@ -36,12 +36,14 @@ import java.util.Map;
|
||||||
import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE;
|
import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE;
|
||||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.hasKey;
|
import static org.hamcrest.Matchers.hasKey;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.nullValue;
|
import static org.hamcrest.Matchers.nullValue;
|
||||||
|
|
||||||
public class SimpleMgetIT extends ESIntegTestCase {
|
public class SimpleMgetIT extends ESIntegTestCase {
|
||||||
|
|
||||||
public void testThatMgetShouldWorkWithOneIndexMissing() throws IOException {
|
public void testThatMgetShouldWorkWithOneIndexMissing() throws IOException {
|
||||||
createIndex("test");
|
createIndex("test");
|
||||||
|
|
||||||
|
@ -51,7 +53,7 @@ public class SimpleMgetIT extends ESIntegTestCase {
|
||||||
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
||||||
.add(new MultiGetRequest.Item("test", "test", "1"))
|
.add(new MultiGetRequest.Item("test", "test", "1"))
|
||||||
.add(new MultiGetRequest.Item("nonExistingIndex", "test", "1"))
|
.add(new MultiGetRequest.Item("nonExistingIndex", "test", "1"))
|
||||||
.execute().actionGet();
|
.get();
|
||||||
assertThat(mgetResponse.getResponses().length, is(2));
|
assertThat(mgetResponse.getResponses().length, is(2));
|
||||||
|
|
||||||
assertThat(mgetResponse.getResponses()[0].getIndex(), is("test"));
|
assertThat(mgetResponse.getResponses()[0].getIndex(), is("test"));
|
||||||
|
@ -63,18 +65,44 @@ public class SimpleMgetIT extends ESIntegTestCase {
|
||||||
assertThat(((ElasticsearchException) mgetResponse.getResponses()[1].getFailure().getFailure()).getIndex().getName(),
|
assertThat(((ElasticsearchException) mgetResponse.getResponses()[1].getFailure().getFailure()).getIndex().getName(),
|
||||||
is("nonExistingIndex"));
|
is("nonExistingIndex"));
|
||||||
|
|
||||||
|
|
||||||
mgetResponse = client().prepareMultiGet()
|
mgetResponse = client().prepareMultiGet()
|
||||||
.add(new MultiGetRequest.Item("nonExistingIndex", "test", "1"))
|
.add(new MultiGetRequest.Item("nonExistingIndex", "test", "1"))
|
||||||
.execute().actionGet();
|
.get();
|
||||||
assertThat(mgetResponse.getResponses().length, is(1));
|
assertThat(mgetResponse.getResponses().length, is(1));
|
||||||
assertThat(mgetResponse.getResponses()[0].getIndex(), is("nonExistingIndex"));
|
assertThat(mgetResponse.getResponses()[0].getIndex(), is("nonExistingIndex"));
|
||||||
assertThat(mgetResponse.getResponses()[0].isFailed(), is(true));
|
assertThat(mgetResponse.getResponses()[0].isFailed(), is(true));
|
||||||
assertThat(mgetResponse.getResponses()[0].getFailure().getMessage(), is("no such index"));
|
assertThat(mgetResponse.getResponses()[0].getFailure().getMessage(), is("no such index"));
|
||||||
assertThat(((ElasticsearchException) mgetResponse.getResponses()[0].getFailure().getFailure()).getIndex().getName(),
|
assertThat(((ElasticsearchException) mgetResponse.getResponses()[0].getFailure().getFailure()).getIndex().getName(),
|
||||||
is("nonExistingIndex"));
|
is("nonExistingIndex"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testThatMgetShouldWorkWithMultiIndexAlias() throws IOException {
|
||||||
|
assertAcked(prepareCreate("test").addAlias(new Alias("multiIndexAlias")));
|
||||||
|
assertAcked(prepareCreate("test2").addAlias(new Alias("multiIndexAlias")));
|
||||||
|
|
||||||
|
client().prepareIndex("test", "test", "1").setSource(jsonBuilder().startObject().field("foo", "bar").endObject())
|
||||||
|
.setRefreshPolicy(IMMEDIATE).get();
|
||||||
|
|
||||||
|
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
||||||
|
.add(new MultiGetRequest.Item("test", "test", "1"))
|
||||||
|
.add(new MultiGetRequest.Item("multiIndexAlias", "test", "1"))
|
||||||
|
.get();
|
||||||
|
assertThat(mgetResponse.getResponses().length, is(2));
|
||||||
|
|
||||||
|
assertThat(mgetResponse.getResponses()[0].getIndex(), is("test"));
|
||||||
|
assertThat(mgetResponse.getResponses()[0].isFailed(), is(false));
|
||||||
|
|
||||||
|
assertThat(mgetResponse.getResponses()[1].getIndex(), is("multiIndexAlias"));
|
||||||
|
assertThat(mgetResponse.getResponses()[1].isFailed(), is(true));
|
||||||
|
assertThat(mgetResponse.getResponses()[1].getFailure().getMessage(), containsString("more than one indices"));
|
||||||
|
|
||||||
|
mgetResponse = client().prepareMultiGet()
|
||||||
|
.add(new MultiGetRequest.Item("multiIndexAlias", "test", "1"))
|
||||||
|
.get();
|
||||||
|
assertThat(mgetResponse.getResponses().length, is(1));
|
||||||
|
assertThat(mgetResponse.getResponses()[0].getIndex(), is("multiIndexAlias"));
|
||||||
|
assertThat(mgetResponse.getResponses()[0].isFailed(), is(true));
|
||||||
|
assertThat(mgetResponse.getResponses()[0].getFailure().getMessage(), containsString("more than one indices"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testThatParentPerDocumentIsSupported() throws Exception {
|
public void testThatParentPerDocumentIsSupported() throws Exception {
|
||||||
|
@ -95,7 +123,7 @@ public class SimpleMgetIT extends ESIntegTestCase {
|
||||||
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
||||||
.add(new MultiGetRequest.Item(indexOrAlias(), "test", "1").parent("4"))
|
.add(new MultiGetRequest.Item(indexOrAlias(), "test", "1").parent("4"))
|
||||||
.add(new MultiGetRequest.Item(indexOrAlias(), "test", "1"))
|
.add(new MultiGetRequest.Item(indexOrAlias(), "test", "1"))
|
||||||
.execute().actionGet();
|
.get();
|
||||||
|
|
||||||
assertThat(mgetResponse.getResponses().length, is(2));
|
assertThat(mgetResponse.getResponses().length, is(2));
|
||||||
assertThat(mgetResponse.getResponses()[0].isFailed(), is(false));
|
assertThat(mgetResponse.getResponses()[0].isFailed(), is(false));
|
||||||
|
@ -163,7 +191,7 @@ public class SimpleMgetIT extends ESIntegTestCase {
|
||||||
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
MultiGetResponse mgetResponse = client().prepareMultiGet()
|
||||||
.add(new MultiGetRequest.Item(indexOrAlias(), "test", id).routing(routingOtherShard))
|
.add(new MultiGetRequest.Item(indexOrAlias(), "test", id).routing(routingOtherShard))
|
||||||
.add(new MultiGetRequest.Item(indexOrAlias(), "test", id))
|
.add(new MultiGetRequest.Item(indexOrAlias(), "test", id))
|
||||||
.execute().actionGet();
|
.get();
|
||||||
|
|
||||||
assertThat(mgetResponse.getResponses().length, is(2));
|
assertThat(mgetResponse.getResponses().length, is(2));
|
||||||
assertThat(mgetResponse.getResponses()[0].isFailed(), is(false));
|
assertThat(mgetResponse.getResponses()[0].isFailed(), is(false));
|
||||||
|
|
Loading…
Reference in New Issue