Skip to content

Commit da314c2

Browse files
Dry up search error trace ITs (elastic#122138) (elastic#126528)
This logic will need a bit of adjustment for bulk query execution. Lets dry it up before so we don't have to copy and paste the fix which will be a couple lines.
1 parent a4e9729 commit da314c2

File tree

3 files changed

+60
-74
lines changed

3 files changed

+60
-74
lines changed

qa/smoke-test-http/src/internalClusterTest/java/org/elasticsearch/http/SearchErrorTraceIT.java

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,52 +13,43 @@
1313
import org.apache.http.nio.entity.NByteArrayEntity;
1414
import org.apache.logging.log4j.Level;
1515
import org.apache.logging.log4j.core.config.Configurator;
16-
import org.elasticsearch.ExceptionsHelper;
1716
import org.elasticsearch.action.search.MultiSearchRequest;
1817
import org.elasticsearch.action.search.SearchRequest;
1918
import org.elasticsearch.client.Request;
19+
import org.elasticsearch.common.util.CollectionUtils;
20+
import org.elasticsearch.plugins.Plugin;
2021
import org.elasticsearch.search.ErrorTraceHelper;
2122
import org.elasticsearch.search.SearchService;
2223
import org.elasticsearch.search.builder.SearchSourceBuilder;
2324
import org.elasticsearch.test.MockLog;
24-
import org.elasticsearch.transport.TransportMessageListener;
25-
import org.elasticsearch.transport.TransportService;
25+
import org.elasticsearch.test.transport.MockTransportService;
2626
import org.elasticsearch.xcontent.XContentType;
2727
import org.junit.Before;
2828
import org.junit.BeforeClass;
2929

3030
import java.io.IOException;
3131
import java.nio.charset.Charset;
32-
import java.util.Optional;
33-
import java.util.concurrent.atomic.AtomicBoolean;
32+
import java.util.Collection;
33+
import java.util.function.BooleanSupplier;
3434

3535
import static org.elasticsearch.index.query.QueryBuilders.simpleQueryStringQuery;
3636

3737
public class SearchErrorTraceIT extends HttpSmokeTestCase {
38-
private AtomicBoolean hasStackTrace;
38+
private BooleanSupplier hasStackTrace;
39+
40+
@Override
41+
protected Collection<Class<? extends Plugin>> nodePlugins() {
42+
return CollectionUtils.appendToCopyNoNullElements(super.nodePlugins(), MockTransportService.TestPlugin.class);
43+
}
3944

4045
@BeforeClass
4146
public static void setDebugLogLevel() {
4247
Configurator.setLevel(SearchService.class, Level.DEBUG);
4348
}
4449

4550
@Before
46-
private void setupMessageListener() {
47-
internalCluster().getDataNodeInstances(TransportService.class).forEach(ts -> {
48-
ts.addMessageListener(new TransportMessageListener() {
49-
@Override
50-
public void onResponseSent(long requestId, String action, Exception error) {
51-
TransportMessageListener.super.onResponseSent(requestId, action, error);
52-
if (action.startsWith("indices:data/read/search")) {
53-
Optional<Throwable> throwable = ExceptionsHelper.unwrapCausesAndSuppressed(
54-
error,
55-
t -> t.getStackTrace().length > 0
56-
);
57-
hasStackTrace.set(throwable.isPresent());
58-
}
59-
}
60-
});
61-
});
51+
public void setupMessageListener() {
52+
hasStackTrace = ErrorTraceHelper.setupErrorTraceListener(internalCluster());
6253
}
6354

6455
private void setupIndexWithDocs() {
@@ -72,7 +63,6 @@ private void setupIndexWithDocs() {
7263
}
7364

7465
public void testSearchFailingQueryErrorTraceDefault() throws IOException {
75-
hasStackTrace = new AtomicBoolean();
7666
setupIndexWithDocs();
7767

7868
Request searchRequest = new Request("POST", "/_search");
@@ -87,11 +77,10 @@ public void testSearchFailingQueryErrorTraceDefault() throws IOException {
8777
}
8878
""");
8979
getRestClient().performRequest(searchRequest);
90-
assertFalse(hasStackTrace.get());
80+
assertFalse(hasStackTrace.getAsBoolean());
9181
}
9282

9383
public void testSearchFailingQueryErrorTraceTrue() throws IOException {
94-
hasStackTrace = new AtomicBoolean();
9584
setupIndexWithDocs();
9685

9786
Request searchRequest = new Request("POST", "/_search");
@@ -107,11 +96,10 @@ public void testSearchFailingQueryErrorTraceTrue() throws IOException {
10796
""");
10897
searchRequest.addParameter("error_trace", "true");
10998
getRestClient().performRequest(searchRequest);
110-
assertTrue(hasStackTrace.get());
99+
assertTrue(hasStackTrace.getAsBoolean());
111100
}
112101

113102
public void testSearchFailingQueryErrorTraceFalse() throws IOException {
114-
hasStackTrace = new AtomicBoolean();
115103
setupIndexWithDocs();
116104

117105
Request searchRequest = new Request("POST", "/_search");
@@ -127,11 +115,10 @@ public void testSearchFailingQueryErrorTraceFalse() throws IOException {
127115
""");
128116
searchRequest.addParameter("error_trace", "false");
129117
getRestClient().performRequest(searchRequest);
130-
assertFalse(hasStackTrace.get());
118+
assertFalse(hasStackTrace.getAsBoolean());
131119
}
132120

133121
public void testDataNodeDoesNotLogStackTraceWhenErrorTraceTrue() throws IOException {
134-
hasStackTrace = new AtomicBoolean();
135122
setupIndexWithDocs();
136123

137124
Request searchRequest = new Request("POST", "/_search");
@@ -158,7 +145,6 @@ public void testDataNodeDoesNotLogStackTraceWhenErrorTraceTrue() throws IOExcept
158145
}
159146

160147
public void testDataNodeLogsStackTraceWhenErrorTraceFalseOrEmpty() throws IOException {
161-
hasStackTrace = new AtomicBoolean();
162148
setupIndexWithDocs();
163149

164150
Request searchRequest = new Request("POST", "/_search");
@@ -188,7 +174,6 @@ public void testDataNodeLogsStackTraceWhenErrorTraceFalseOrEmpty() throws IOExce
188174
}
189175

190176
public void testMultiSearchFailingQueryErrorTraceDefault() throws IOException {
191-
hasStackTrace = new AtomicBoolean();
192177
setupIndexWithDocs();
193178

194179
XContentType contentType = XContentType.JSON;
@@ -201,11 +186,10 @@ public void testMultiSearchFailingQueryErrorTraceDefault() throws IOException {
201186
new NByteArrayEntity(requestBody, ContentType.create(contentType.mediaTypeWithoutParameters(), (Charset) null))
202187
);
203188
getRestClient().performRequest(searchRequest);
204-
assertFalse(hasStackTrace.get());
189+
assertFalse(hasStackTrace.getAsBoolean());
205190
}
206191

207192
public void testMultiSearchFailingQueryErrorTraceTrue() throws IOException {
208-
hasStackTrace = new AtomicBoolean();
209193
setupIndexWithDocs();
210194

211195
XContentType contentType = XContentType.JSON;
@@ -219,11 +203,10 @@ public void testMultiSearchFailingQueryErrorTraceTrue() throws IOException {
219203
);
220204
searchRequest.addParameter("error_trace", "true");
221205
getRestClient().performRequest(searchRequest);
222-
assertTrue(hasStackTrace.get());
206+
assertTrue(hasStackTrace.getAsBoolean());
223207
}
224208

225209
public void testMultiSearchFailingQueryErrorTraceFalse() throws IOException {
226-
hasStackTrace = new AtomicBoolean();
227210
setupIndexWithDocs();
228211

229212
XContentType contentType = XContentType.JSON;
@@ -238,11 +221,10 @@ public void testMultiSearchFailingQueryErrorTraceFalse() throws IOException {
238221
searchRequest.addParameter("error_trace", "false");
239222
getRestClient().performRequest(searchRequest);
240223

241-
assertFalse(hasStackTrace.get());
224+
assertFalse(hasStackTrace.getAsBoolean());
242225
}
243226

244227
public void testDataNodeDoesNotLogStackTraceWhenErrorTraceTrueMultiSearch() throws IOException {
245-
hasStackTrace = new AtomicBoolean();
246228
setupIndexWithDocs();
247229

248230
XContentType contentType = XContentType.JSON;
@@ -268,7 +250,6 @@ public void testDataNodeDoesNotLogStackTraceWhenErrorTraceTrueMultiSearch() thro
268250
}
269251

270252
public void testDataNodeLogsStackTraceWhenErrorTraceFalseOrEmptyMultiSearch() throws IOException {
271-
hasStackTrace = new AtomicBoolean();
272253
setupIndexWithDocs();
273254

274255
XContentType contentType = XContentType.JSON;

test/framework/src/main/java/org/elasticsearch/search/ErrorTraceHelper.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,51 @@
1010
package org.elasticsearch.search;
1111

1212
import org.apache.logging.log4j.Level;
13+
import org.elasticsearch.ExceptionsHelper;
1314
import org.elasticsearch.index.query.QueryShardException;
1415
import org.elasticsearch.test.ESIntegTestCase;
16+
import org.elasticsearch.test.InternalTestCluster;
1517
import org.elasticsearch.test.MockLog;
18+
import org.elasticsearch.test.transport.MockTransportService;
19+
import org.elasticsearch.transport.TransportMessageListener;
20+
import org.elasticsearch.transport.TransportService;
1621

1722
import java.util.Arrays;
23+
import java.util.Optional;
24+
import java.util.concurrent.atomic.AtomicBoolean;
25+
import java.util.function.BooleanSupplier;
1826
import java.util.stream.Collectors;
1927

2028
import static org.elasticsearch.common.Strings.format;
2129
import static org.elasticsearch.test.ESIntegTestCase.getNodeId;
2230
import static org.elasticsearch.test.ESIntegTestCase.internalCluster;
31+
import static org.elasticsearch.test.ESTestCase.asInstanceOf;
2332

2433
/**
2534
* Utilities around testing the `error_trace` message header in search.
2635
*/
2736
public enum ErrorTraceHelper {
2837
;
2938

39+
public static BooleanSupplier setupErrorTraceListener(InternalTestCluster internalCluster) {
40+
final AtomicBoolean transportMessageHasStackTrace = new AtomicBoolean(false);
41+
internalCluster.getDataNodeInstances(TransportService.class)
42+
.forEach(ts -> asInstanceOf(MockTransportService.class, ts).addMessageListener(new TransportMessageListener() {
43+
@Override
44+
public void onResponseSent(long requestId, String action, Exception error) {
45+
TransportMessageListener.super.onResponseSent(requestId, action, error);
46+
if (action.startsWith("indices:data/read/search")) {
47+
Optional<Throwable> throwable = ExceptionsHelper.unwrapCausesAndSuppressed(
48+
error,
49+
t -> t.getStackTrace().length > 0
50+
);
51+
transportMessageHasStackTrace.set(throwable.isPresent());
52+
}
53+
}
54+
}));
55+
return transportMessageHasStackTrace::get;
56+
}
57+
3058
/**
3159
* Adds expectations for debug logging of a message and exception on each shard of the given index.
3260
*

x-pack/plugin/async-search/src/internalClusterTest/java/org/elasticsearch/xpack/search/AsyncSearchErrorTraceIT.java

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,25 @@
99

1010
import org.apache.logging.log4j.Level;
1111
import org.apache.logging.log4j.core.config.Configurator;
12-
import org.elasticsearch.ExceptionsHelper;
1312
import org.elasticsearch.client.Request;
1413
import org.elasticsearch.client.Response;
14+
import org.elasticsearch.common.util.CollectionUtils;
1515
import org.elasticsearch.common.xcontent.XContentHelper;
1616
import org.elasticsearch.core.TimeValue;
1717
import org.elasticsearch.plugins.Plugin;
1818
import org.elasticsearch.search.ErrorTraceHelper;
1919
import org.elasticsearch.search.SearchService;
2020
import org.elasticsearch.test.ESIntegTestCase;
2121
import org.elasticsearch.test.MockLog;
22-
import org.elasticsearch.transport.TransportMessageListener;
23-
import org.elasticsearch.transport.TransportService;
22+
import org.elasticsearch.test.transport.MockTransportService;
2423
import org.elasticsearch.xcontent.XContentType;
2524
import org.junit.Before;
2625
import org.junit.BeforeClass;
2726

2827
import java.io.IOException;
2928
import java.util.Collection;
30-
import java.util.List;
3129
import java.util.Map;
32-
import java.util.Optional;
33-
import java.util.concurrent.atomic.AtomicBoolean;
30+
import java.util.function.BooleanSupplier;
3431

3532
public class AsyncSearchErrorTraceIT extends ESIntegTestCase {
3633

@@ -40,34 +37,21 @@ protected boolean addMockHttpTransport() {
4037
}
4138

4239
@Override
40+
@SuppressWarnings("unchecked")
4341
protected Collection<Class<? extends Plugin>> nodePlugins() {
44-
return List.of(AsyncSearch.class);
42+
return CollectionUtils.appendToCopyNoNullElements(super.nodePlugins(), AsyncSearch.class, MockTransportService.TestPlugin.class);
4543
}
4644

47-
private AtomicBoolean transportMessageHasStackTrace;
45+
private BooleanSupplier transportMessageHasStackTrace;
4846

4947
@BeforeClass
5048
public static void setDebugLogLevel() {
5149
Configurator.setLevel(SearchService.class, Level.DEBUG);
5250
}
5351

5452
@Before
55-
private void setupMessageListener() {
56-
internalCluster().getDataNodeInstances(TransportService.class).forEach(ts -> {
57-
ts.addMessageListener(new TransportMessageListener() {
58-
@Override
59-
public void onResponseSent(long requestId, String action, Exception error) {
60-
TransportMessageListener.super.onResponseSent(requestId, action, error);
61-
if (action.startsWith("indices:data/read/search")) {
62-
Optional<Throwable> throwable = ExceptionsHelper.unwrapCausesAndSuppressed(
63-
error,
64-
t -> t.getStackTrace().length > 0
65-
);
66-
transportMessageHasStackTrace.set(throwable.isPresent());
67-
}
68-
}
69-
});
70-
});
53+
public void setupMessageListener() {
54+
transportMessageHasStackTrace = ErrorTraceHelper.setupErrorTraceListener(internalCluster());
7155
}
7256

7357
private void setupIndexWithDocs() {
@@ -81,7 +65,6 @@ private void setupIndexWithDocs() {
8165
}
8266

8367
public void testAsyncSearchFailingQueryErrorTraceDefault() throws IOException, InterruptedException {
84-
transportMessageHasStackTrace = new AtomicBoolean();
8568
setupIndexWithDocs();
8669

8770
Request searchRequest = new Request("POST", "/_async_search");
@@ -104,11 +87,10 @@ public void testAsyncSearchFailingQueryErrorTraceDefault() throws IOException, I
10487
responseEntity = performRequestAndGetResponseEntityAfterDelay(request, TimeValue.timeValueSeconds(1L));
10588
}
10689
// check that the stack trace was not sent from the data node to the coordinating node
107-
assertFalse(transportMessageHasStackTrace.get());
90+
assertFalse(transportMessageHasStackTrace.getAsBoolean());
10891
}
10992

11093
public void testAsyncSearchFailingQueryErrorTraceTrue() throws IOException, InterruptedException {
111-
transportMessageHasStackTrace = new AtomicBoolean();
11294
setupIndexWithDocs();
11395

11496
Request searchRequest = new Request("POST", "/_async_search");
@@ -133,11 +115,10 @@ public void testAsyncSearchFailingQueryErrorTraceTrue() throws IOException, Inte
133115
responseEntity = performRequestAndGetResponseEntityAfterDelay(request, TimeValue.timeValueSeconds(1L));
134116
}
135117
// check that the stack trace was sent from the data node to the coordinating node
136-
assertTrue(transportMessageHasStackTrace.get());
118+
assertTrue(transportMessageHasStackTrace.getAsBoolean());
137119
}
138120

139121
public void testAsyncSearchFailingQueryErrorTraceFalse() throws IOException, InterruptedException {
140-
transportMessageHasStackTrace = new AtomicBoolean();
141122
setupIndexWithDocs();
142123

143124
Request searchRequest = new Request("POST", "/_async_search");
@@ -162,11 +143,10 @@ public void testAsyncSearchFailingQueryErrorTraceFalse() throws IOException, Int
162143
responseEntity = performRequestAndGetResponseEntityAfterDelay(request, TimeValue.timeValueSeconds(1L));
163144
}
164145
// check that the stack trace was not sent from the data node to the coordinating node
165-
assertFalse(transportMessageHasStackTrace.get());
146+
assertFalse(transportMessageHasStackTrace.getAsBoolean());
166147
}
167148

168149
public void testDataNodeDoesNotLogStackTraceWhenErrorTraceTrue() throws IOException, InterruptedException {
169-
transportMessageHasStackTrace = new AtomicBoolean();
170150
setupIndexWithDocs();
171151

172152
Request searchRequest = new Request("POST", "/_async_search");
@@ -203,7 +183,6 @@ public void testDataNodeDoesNotLogStackTraceWhenErrorTraceTrue() throws IOExcept
203183
}
204184

205185
public void testDataNodeLogsStackTraceWhenErrorTraceFalseOrEmpty() throws IOException, InterruptedException {
206-
transportMessageHasStackTrace = new AtomicBoolean();
207186
setupIndexWithDocs();
208187

209188
// error_trace defaults to false so we can test both cases with some randomization
@@ -247,7 +226,6 @@ public void testDataNodeLogsStackTraceWhenErrorTraceFalseOrEmpty() throws IOExce
247226
}
248227

249228
public void testAsyncSearchFailingQueryErrorTraceFalseOnSubmitAndTrueOnGet() throws IOException, InterruptedException {
250-
transportMessageHasStackTrace = new AtomicBoolean();
251229
setupIndexWithDocs();
252230

253231
Request searchRequest = new Request("POST", "/_async_search");
@@ -272,11 +250,10 @@ public void testAsyncSearchFailingQueryErrorTraceFalseOnSubmitAndTrueOnGet() thr
272250
responseEntity = performRequestAndGetResponseEntityAfterDelay(request, TimeValue.timeValueSeconds(1L));
273251
}
274252
// check that the stack trace was not sent from the data node to the coordinating node
275-
assertFalse(transportMessageHasStackTrace.get());
253+
assertFalse(transportMessageHasStackTrace.getAsBoolean());
276254
}
277255

278256
public void testAsyncSearchFailingQueryErrorTraceTrueOnSubmitAndFalseOnGet() throws IOException, InterruptedException {
279-
transportMessageHasStackTrace = new AtomicBoolean();
280257
setupIndexWithDocs();
281258

282259
Request searchRequest = new Request("POST", "/_async_search");
@@ -301,7 +278,7 @@ public void testAsyncSearchFailingQueryErrorTraceTrueOnSubmitAndFalseOnGet() thr
301278
responseEntity = performRequestAndGetResponseEntityAfterDelay(request, TimeValue.timeValueSeconds(1L));
302279
}
303280
// check that the stack trace was sent from the data node to the coordinating node
304-
assertTrue(transportMessageHasStackTrace.get());
281+
assertTrue(transportMessageHasStackTrace.getAsBoolean());
305282
}
306283

307284
private Map<String, Object> performRequestAndGetResponseEntityAfterDelay(Request r, TimeValue sleep) throws IOException,

0 commit comments

Comments
 (0)