diff --git a/x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchErrorTraceIT.java b/x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchErrorTraceIT.java index 2996289d87012..e5be163e2c289 100644 --- a/x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchErrorTraceIT.java +++ b/x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchErrorTraceIT.java @@ -7,6 +7,8 @@ package org.elasticsearch.xpack.search; +import org.apache.http.HttpEntity; +import org.apache.http.util.EntityUtils; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; import org.elasticsearch.client.Request; @@ -16,7 +18,6 @@ import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.ErrorTraceHelper; import org.elasticsearch.search.SearchService; -import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.MockLog; import org.elasticsearch.test.junit.annotations.TestLogging; import org.elasticsearch.test.transport.MockTransportService; @@ -31,7 +32,7 @@ reason = "testing debug log output to identify race condition", value = "org.elasticsearch.xpack.search.MutableSearchResponse:DEBUG,org.elasticsearch.xpack.search.AsyncSearchTask:DEBUG" ) -public class AsyncSearchErrorTraceIT extends ESIntegTestCase { +public class AsyncSearchErrorTraceIT extends AsyncSearchIntegTestCase { @Override protected boolean addMockHttpTransport() { @@ -77,10 +78,15 @@ public void testAsyncSearchFailingQueryErrorTraceDefault() throws Exception { createAsyncRequest.addParameter("wait_for_completion_timeout", "0ms"); ErrorTraceHelper.expectStackTraceCleared(internalCluster()); Map createAsyncResponseEntity = performRequestAndGetResponseEntity(createAsyncRequest); - if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { - String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); - Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); - awaitAsyncRequestDoneRunning(getAsyncRequest); + + try { + if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { + String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); + Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); + awaitAsyncRequestDoneRunning(getAsyncRequest); + } + } finally { + deleteAsyncSearchIfPresent(createAsyncResponseEntity); } } @@ -103,11 +109,16 @@ public void testAsyncSearchFailingQueryErrorTraceTrue() throws Exception { createAsyncRequest.addParameter("wait_for_completion_timeout", "0ms"); ErrorTraceHelper.expectStackTraceObserved(internalCluster()); Map createAsyncResponseEntity = performRequestAndGetResponseEntity(createAsyncRequest); - if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { - String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); - Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); - getAsyncRequest.addParameter("error_trace", "true"); - awaitAsyncRequestDoneRunning(getAsyncRequest); + + try { + if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { + String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); + Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); + getAsyncRequest.addParameter("error_trace", "true"); + awaitAsyncRequestDoneRunning(getAsyncRequest); + } + } finally { + deleteAsyncSearchIfPresent(createAsyncResponseEntity); } } @@ -130,11 +141,16 @@ public void testAsyncSearchFailingQueryErrorTraceFalse() throws Exception { createAsyncRequest.addParameter("wait_for_completion_timeout", "0ms"); ErrorTraceHelper.expectStackTraceCleared(internalCluster()); Map createAsyncResponseEntity = performRequestAndGetResponseEntity(createAsyncRequest); - if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { - String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); - Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); - getAsyncRequest.addParameter("error_trace", "false"); - awaitAsyncRequestDoneRunning(getAsyncRequest); + + try { + if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { + String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); + Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); + getAsyncRequest.addParameter("error_trace", "false"); + awaitAsyncRequestDoneRunning(getAsyncRequest); + } + } finally { + deleteAsyncSearchIfPresent(createAsyncResponseEntity); } } @@ -169,19 +185,24 @@ public void testDataNodeLogsStackTrace() throws Exception { try (var mockLog = MockLog.capture(SearchService.class)) { ErrorTraceHelper.addSeenLoggingExpectations(numShards, mockLog, errorTriggeringIndex); Map createAsyncResponseEntity = performRequestAndGetResponseEntity(createAsyncRequest); - if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { - String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); - Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); - // Use the same value of error_trace as the search request - if (errorTraceValue == 0) { - getAsyncRequest.addParameter("error_trace", "true"); - } else if (errorTraceValue == 1) { - getAsyncRequest.addParameter("error_trace", "false"); - } // else empty - awaitAsyncRequestDoneRunning(getAsyncRequest); - } - mockLog.assertAllExpectationsMatched(); + try { + if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { + String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); + Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); + // Use the same value of error_trace as the search request + if (errorTraceValue == 0) { + getAsyncRequest.addParameter("error_trace", "true"); + } else if (errorTraceValue == 1) { + getAsyncRequest.addParameter("error_trace", "false"); + } // else empty + awaitAsyncRequestDoneRunning(getAsyncRequest); + } + + mockLog.assertAllExpectationsMatched(); + } finally { + deleteAsyncSearchIfPresent(createAsyncResponseEntity); + } } } @@ -204,11 +225,16 @@ public void testAsyncSearchFailingQueryErrorTraceFalseOnSubmitAndTrueOnGet() thr createAsyncSearchRequest.addParameter("wait_for_completion_timeout", "0ms"); ErrorTraceHelper.expectStackTraceCleared(internalCluster()); Map createAsyncResponseEntity = performRequestAndGetResponseEntity(createAsyncSearchRequest); - if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { - String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); - Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); - getAsyncRequest.addParameter("error_trace", "true"); - awaitAsyncRequestDoneRunning(getAsyncRequest); + + try { + if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { + String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); + Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); + getAsyncRequest.addParameter("error_trace", "true"); + awaitAsyncRequestDoneRunning(getAsyncRequest); + } + } finally { + deleteAsyncSearchIfPresent(createAsyncResponseEntity); } } @@ -231,11 +257,15 @@ public void testAsyncSearchFailingQueryErrorTraceTrueOnSubmitAndFalseOnGet() thr createAsyncSearchRequest.addParameter("wait_for_completion_timeout", "0ms"); ErrorTraceHelper.expectStackTraceObserved(internalCluster()); Map createAsyncResponseEntity = performRequestAndGetResponseEntity(createAsyncSearchRequest); - if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { - String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); - Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); - getAsyncRequest.addParameter("error_trace", "false"); - awaitAsyncRequestDoneRunning(getAsyncRequest); + try { + if (Boolean.TRUE.equals(createAsyncResponseEntity.get("is_running"))) { + String asyncExecutionId = (String) createAsyncResponseEntity.get("id"); + Request getAsyncRequest = new Request("GET", "/_async_search/" + asyncExecutionId); + getAsyncRequest.addParameter("error_trace", "false"); + awaitAsyncRequestDoneRunning(getAsyncRequest); + } + } finally { + deleteAsyncSearchIfPresent(createAsyncResponseEntity); } } @@ -245,6 +275,26 @@ private Map performRequestAndGetResponseEntity(Request r) throws return XContentHelper.convertToMap(entityContentType.xContent(), response.getEntity().getContent(), false); } + private void deleteAsyncSearchIfPresent(Map map) throws IOException { + String id = (String) map.get("id"); + if (id == null) { + return; + } + + // Make sure the .async-search system index is green before deleting it + try { + ensureGreen(".async-search"); + } catch (Exception ignore) { + // the index may not exist + } + + Response response = getRestClient().performRequest(new Request("DELETE", "/_async_search/" + id)); + HttpEntity entity = response.getEntity(); + if (entity != null) { + EntityUtils.consumeQuietly(entity); + } + } + private void awaitAsyncRequestDoneRunning(Request getAsyncRequest) throws Exception { assertBusy(() -> { Map getAsyncResponseEntity = performRequestAndGetResponseEntity(getAsyncRequest);