Skip to content

Commit 3a951e5

Browse files
authored
[Bug] Check phase name before SearchRequestOperationsListener onPhaseStart (#12094) (#12094)
Signed-off-by: David Zane <davizane@amazon.com> (cherry picked from commit fb2c5f2)
1 parent de636c1 commit 3a951e5

File tree

5 files changed

+62
-11
lines changed

5 files changed

+62
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
159159
- Fix memory leak issue in ReorganizingLongHash ([#11953](https://github.com/opensearch-project/OpenSearch/issues/11953))
160160
- Prevent setting remote_snapshot store type on index creation ([#11867](https://github.com/opensearch-project/OpenSearch/pull/11867))
161161
- [BUG] Fix remote shards balancer when filtering throttled nodes ([#11724](https://github.com/opensearch-project/OpenSearch/pull/11724))
162+
- [Bug] Check phase name before SearchRequestOperationsListener onPhaseStart ([#12094](https://github.com/opensearch-project/OpenSearch/pull/12094))
162163

163164
### Security
164165

server/src/main/java/org/opensearch/action/search/AbstractSearchAsyncAction.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -432,16 +432,18 @@ public final void executeNextPhase(SearchPhase currentPhase, SearchPhase nextPha
432432
}
433433

434434
private void onPhaseEnd(SearchRequestContext searchRequestContext) {
435-
if (getCurrentPhase() != null) {
435+
if (getCurrentPhase() != null && SearchPhaseName.isValidName(getName())) {
436436
long tookInNanos = System.nanoTime() - getCurrentPhase().getStartTimeInNanos();
437437
searchRequestContext.updatePhaseTookMap(getCurrentPhase().getName(), TimeUnit.NANOSECONDS.toMillis(tookInNanos));
438+
this.searchRequestContext.getSearchRequestOperationsListener().onPhaseEnd(this, searchRequestContext);
438439
}
439-
this.searchRequestContext.getSearchRequestOperationsListener().onPhaseEnd(this, searchRequestContext);
440440
}
441441

442-
private void onPhaseStart(SearchPhase phase) {
442+
void onPhaseStart(SearchPhase phase) {
443443
setCurrentPhase(phase);
444-
this.searchRequestContext.getSearchRequestOperationsListener().onPhaseStart(this);
444+
if (SearchPhaseName.isValidName(phase.getName())) {
445+
this.searchRequestContext.getSearchRequestOperationsListener().onPhaseStart(this);
446+
}
445447
}
446448

447449
private void onRequestEnd(SearchRequestContext searchRequestContext) {
@@ -714,7 +716,9 @@ public void sendSearchResponse(InternalSearchResponse internalSearchResponse, At
714716

715717
@Override
716718
public final void onPhaseFailure(SearchPhase phase, String msg, Throwable cause) {
717-
this.searchRequestContext.getSearchRequestOperationsListener().onPhaseFailure(this);
719+
if (SearchPhaseName.isValidName(phase.getName())) {
720+
this.searchRequestContext.getSearchRequestOperationsListener().onPhaseFailure(this);
721+
}
718722
raisePhaseFailure(new SearchPhaseExecutionException(phase.getName(), msg, cause, buildShardFailures()));
719723
}
720724

server/src/main/java/org/opensearch/action/search/SearchPhaseName.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010

1111
import org.opensearch.common.annotation.PublicApi;
1212

13+
import java.util.HashSet;
14+
import java.util.Set;
15+
1316
/**
1417
* Enum for different Search Phases in OpenSearch
1518
*
@@ -25,6 +28,12 @@ public enum SearchPhaseName {
2528
CAN_MATCH("can_match");
2629

2730
private final String name;
31+
private static final Set<String> PHASE_NAMES = new HashSet<>();
32+
static {
33+
for (SearchPhaseName phaseName : SearchPhaseName.values()) {
34+
PHASE_NAMES.add(phaseName.name);
35+
}
36+
}
2837

2938
SearchPhaseName(final String name) {
3039
this.name = name;
@@ -33,4 +42,8 @@ public enum SearchPhaseName {
3342
public String getName() {
3443
return name;
3544
}
45+
46+
public static boolean isValidName(String phaseName) {
47+
return PHASE_NAMES.contains(phaseName);
48+
}
3649
}

server/src/main/java/org/opensearch/action/search/TransportSearchAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1323,7 +1323,7 @@ private AbstractSearchAsyncAction<? extends SearchPhaseResult> searchAsyncAction
13231323
clusters,
13241324
searchRequestContext
13251325
);
1326-
return new SearchPhase(action.getName()) {
1326+
return new SearchPhase("none") {
13271327
@Override
13281328
public void run() {
13291329
action.start();

server/src/test/java/org/opensearch/action/search/AbstractSearchAsyncActionTests.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import org.opensearch.cluster.routing.GroupShardsIterator;
3939
import org.opensearch.common.UUIDs;
4040
import org.opensearch.common.collect.Tuple;
41+
import org.opensearch.common.settings.ClusterSettings;
42+
import org.opensearch.common.settings.Settings;
4143
import org.opensearch.common.util.concurrent.AtomicArray;
4244
import org.opensearch.common.util.concurrent.OpenSearchExecutors;
4345
import org.opensearch.common.util.set.Sets;
@@ -334,7 +336,14 @@ public void testOnPhaseFailureAndVerifyListeners() {
334336
SearchQueryThenFetchAsyncAction action = createSearchQueryThenFetchAsyncAction(requestOperationListeners);
335337
action.start();
336338
assertEquals(1, testListener.getPhaseCurrent(action.getSearchPhaseName()));
337-
action.onPhaseFailure(new SearchPhase("test") {
339+
action.onPhaseFailure(new SearchPhase("none") {
340+
@Override
341+
public void run() {
342+
343+
}
344+
}, "message", null);
345+
assertEquals(1, testListener.getPhaseCurrent(action.getSearchPhaseName()));
346+
action.onPhaseFailure(new SearchPhase(action.getName()) {
338347
@Override
339348
public void run() {
340349

@@ -348,14 +357,14 @@ public void run() {
348357
);
349358
searchDfsQueryThenFetchAsyncAction.start();
350359
assertEquals(1, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()));
351-
searchDfsQueryThenFetchAsyncAction.onPhaseFailure(new SearchPhase("test") {
360+
searchDfsQueryThenFetchAsyncAction.onPhaseFailure(new SearchPhase(searchDfsQueryThenFetchAsyncAction.getName()) {
352361
@Override
353362
public void run() {
354363

355364
}
356365
}, "message", null);
357-
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseName()));
358-
assertEquals(0, testListener.getPhaseTotal(action.getSearchPhaseName()));
366+
assertEquals(0, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()));
367+
assertEquals(0, testListener.getPhaseTotal(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()));
359368

360369
FetchSearchPhase fetchPhase = createFetchSearchPhase();
361370
ShardId shardId = new ShardId(randomAlphaOfLengthBetween(5, 10), randomAlphaOfLength(10), randomInt());
@@ -364,7 +373,7 @@ public void run() {
364373
action.skipShard(searchShardIterator);
365374
action.executeNextPhase(action, fetchPhase);
366375
assertEquals(1, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseName()));
367-
action.onPhaseFailure(new SearchPhase("test") {
376+
action.onPhaseFailure(new SearchPhase(fetchPhase.getName()) {
368377
@Override
369378
public void run() {
370379

@@ -399,6 +408,30 @@ public void run() {
399408
assertEquals(requestIds, releasedContexts);
400409
}
401410

411+
public void testOnPhaseStart() {
412+
ClusterSettings clusterSettings = new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS);
413+
SearchRequestStats testListener = new SearchRequestStats();
414+
415+
final List<SearchRequestOperationsListener> requestOperationListeners = new ArrayList<>(List.of(testListener));
416+
SearchQueryThenFetchAsyncAction action = createSearchQueryThenFetchAsyncAction(requestOperationListeners);
417+
418+
action.onPhaseStart(new SearchPhase("test") {
419+
@Override
420+
public void run() {}
421+
});
422+
action.onPhaseStart(new SearchPhase("none") {
423+
@Override
424+
public void run() {}
425+
});
426+
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseName()));
427+
428+
action.onPhaseStart(new SearchPhase(action.getName()) {
429+
@Override
430+
public void run() {}
431+
});
432+
assertEquals(1, testListener.getPhaseCurrent(action.getSearchPhaseName()));
433+
}
434+
402435
public void testShardNotAvailableWithDisallowPartialFailures() {
403436
SearchRequest searchRequest = new SearchRequest().allowPartialSearchResults(false);
404437
AtomicReference<Exception> exception = new AtomicReference<>();

0 commit comments

Comments
 (0)