Skip to content

Commit 6a05e73

Browse files
peteralfonsiPeter Alfonsiandrross
authored
[Backport 2.x] [Bugfix] Fix IllegalArgumentException thrown when creating a PIT (#17380)
* [Bugfix] Fix IllegalArgumentException thrown when creating a PIT (#16781) * fix create_pit enum bug Signed-off-by: Peter Alfonsi <[email protected]> * changelog Signed-off-by: Peter Alfonsi <[email protected]> * Fix SearchResponse XContent Signed-off-by: Peter Alfonsi <[email protected]> * Addressed David's comments Signed-off-by: Peter Alfonsi <[email protected]> * rerun gradle Signed-off-by: Peter Alfonsi <[email protected]> * Addressed andrross's comment Signed-off-by: Peter Alfonsi <[email protected]> * Revert "Addressed andrross's comment" This reverts commit 49fec57. Signed-off-by: Peter Alfonsi <[email protected]> * Revert "Addressed David's comments" This reverts commit a41f9be. Signed-off-by: Peter Alfonsi <[email protected]> * Revert "Fix SearchResponse XContent" This reverts commit ea30484. Signed-off-by: Peter Alfonsi <[email protected]> * Revert "fix create_pit enum bug" This reverts commit 0c9110d. Signed-off-by: Peter Alfonsi <[email protected]> * Fix create_pit bug with catch-all search phase name Signed-off-by: Peter Alfonsi <[email protected]> * switch to new optional method Signed-off-by: Peter Alfonsi <[email protected]> * rerun gradle Signed-off-by: Peter Alfonsi <[email protected]> * Update server/src/main/java/org/opensearch/action/search/SearchPhase.java Co-authored-by: Andrew Ross <[email protected]> Signed-off-by: Peter Alfonsi <[email protected]> --------- Signed-off-by: Peter Alfonsi <[email protected]> Signed-off-by: Peter Alfonsi <[email protected]> Co-authored-by: Peter Alfonsi <[email protected]> Co-authored-by: Andrew Ross <[email protected]> (cherry picked from commit 56825f6) Signed-off-by: Peter Alfonsi <[email protected]> * rerun gradle Signed-off-by: Peter Alfonsi <[email protected]> --------- Signed-off-by: Peter Alfonsi <[email protected]> Signed-off-by: Peter Alfonsi <[email protected]> Signed-off-by: Andrew Ross <[email protected]> Co-authored-by: Peter Alfonsi <[email protected]> Co-authored-by: Andrew Ross <[email protected]>
1 parent 9f8ea08 commit 6a05e73

File tree

7 files changed

+115
-43
lines changed

7 files changed

+115
-43
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2525

2626
### Fixed
2727
- Fix case insensitive and escaped query on wildcard ([#16827](https://github.com/opensearch-project/OpenSearch/pull/16827))
28+
- Fix illegal argument exception when creating a PIT ([#16781](https://github.com/opensearch-project/OpenSearch/pull/16781))
2829

2930
### Security
3031

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.io.IOException;
3838
import java.util.Locale;
3939
import java.util.Objects;
40+
import java.util.Optional;
4041

4142
/**
4243
* Base class for all individual search phases like collecting distributed frequencies, fetching documents, querying shards.
@@ -69,11 +70,26 @@ public String getName() {
6970
}
7071

7172
/**
72-
* Returns the SearchPhase name as {@link SearchPhaseName}. Exception will come if SearchPhase name is not defined
73+
* Returns the SearchPhase name as {@link SearchPhaseName}. Exception will come if SearchPhase name is not defined.
74+
* @deprecated Use getSearchPhaseNameOptional() to avoid possible exceptions.
7375
* in {@link SearchPhaseName}
7476
* @return {@link SearchPhaseName}
7577
*/
78+
@Deprecated
7679
public SearchPhaseName getSearchPhaseName() {
7780
return SearchPhaseName.valueOf(name.toUpperCase(Locale.ROOT));
7881
}
82+
83+
/**
84+
* Returns an Optional of the SearchPhase name as {@link SearchPhaseName}. If there's not a matching SearchPhaseName,
85+
* returns an empty Optional.
86+
* @return {@link Optional<SearchPhaseName>}
87+
*/
88+
public Optional<SearchPhaseName> getSearchPhaseNameOptional() {
89+
try {
90+
return Optional.of(SearchPhaseName.valueOf(name.toUpperCase(Locale.ROOT)));
91+
} catch (IllegalArgumentException e) {
92+
return Optional.empty();
93+
}
94+
}
7995
}

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

+8-6
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,22 @@ public long getTookMetric() {
7373

7474
@Override
7575
protected void onPhaseStart(SearchPhaseContext context) {
76-
phaseStatsMap.get(context.getCurrentPhase().getSearchPhaseName()).current.inc();
76+
context.getCurrentPhase().getSearchPhaseNameOptional().ifPresent(name -> phaseStatsMap.get(name).current.inc());
7777
}
7878

7979
@Override
8080
protected void onPhaseEnd(SearchPhaseContext context, SearchRequestContext searchRequestContext) {
81-
StatsHolder phaseStats = phaseStatsMap.get(context.getCurrentPhase().getSearchPhaseName());
82-
phaseStats.current.dec();
83-
phaseStats.total.inc();
84-
phaseStats.timing.inc(TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - context.getCurrentPhase().getStartTimeInNanos()));
81+
context.getCurrentPhase().getSearchPhaseNameOptional().ifPresent(name -> {
82+
StatsHolder phaseStats = phaseStatsMap.get(name);
83+
phaseStats.current.dec();
84+
phaseStats.total.inc();
85+
phaseStats.timing.inc(TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - context.getCurrentPhase().getStartTimeInNanos()));
86+
});
8587
}
8688

8789
@Override
8890
protected void onPhaseFailure(SearchPhaseContext context, Throwable cause) {
89-
phaseStatsMap.get(context.getCurrentPhase().getSearchPhaseName()).current.dec();
91+
context.getCurrentPhase().getSearchPhaseNameOptional().ifPresent(name -> phaseStatsMap.get(name).current.dec());
9092
}
9193

9294
@Override

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

+28-25
Original file line numberDiff line numberDiff line change
@@ -399,29 +399,29 @@ public void testOnPhaseFailureAndVerifyListeners() {
399399
final List<SearchRequestOperationsListener> requestOperationListeners = List.of(testListener, assertingListener);
400400
SearchQueryThenFetchAsyncAction action = createSearchQueryThenFetchAsyncAction(requestOperationListeners);
401401
action.start();
402-
assertEquals(1, testListener.getPhaseCurrent(action.getSearchPhaseName()));
402+
assertEquals(1, testListener.getPhaseCurrent(action.getSearchPhaseNameOptional().get()));
403403
action.onPhaseFailure(new SearchPhase("test") {
404404
@Override
405405
public void run() {
406406

407407
}
408408
}, "message", null);
409-
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseName()));
410-
assertEquals(0, testListener.getPhaseTotal(action.getSearchPhaseName()));
409+
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseNameOptional().get()));
410+
assertEquals(0, testListener.getPhaseTotal(action.getSearchPhaseNameOptional().get()));
411411

412412
SearchDfsQueryThenFetchAsyncAction searchDfsQueryThenFetchAsyncAction = createSearchDfsQueryThenFetchAsyncAction(
413413
requestOperationListeners
414414
);
415415
searchDfsQueryThenFetchAsyncAction.start();
416-
assertEquals(1, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()));
416+
assertEquals(1, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseNameOptional().get()));
417417
searchDfsQueryThenFetchAsyncAction.onPhaseFailure(new SearchPhase("test") {
418418
@Override
419419
public void run() {
420420

421421
}
422422
}, "message", null);
423-
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseName()));
424-
assertEquals(0, testListener.getPhaseTotal(action.getSearchPhaseName()));
423+
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseNameOptional().get()));
424+
assertEquals(0, testListener.getPhaseTotal(action.getSearchPhaseNameOptional().get()));
425425

426426
FetchSearchPhase fetchPhase = createFetchSearchPhase();
427427
ShardId shardId = new ShardId(randomAlphaOfLengthBetween(5, 10), randomAlphaOfLength(10), randomInt());
@@ -430,15 +430,15 @@ public void run() {
430430
action.skipShard(searchShardIterator);
431431
action.start();
432432
action.executeNextPhase(action, fetchPhase);
433-
assertEquals(1, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseName()));
433+
assertEquals(1, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseNameOptional().get()));
434434
action.onPhaseFailure(new SearchPhase("test") {
435435
@Override
436436
public void run() {
437437

438438
}
439439
}, "message", null);
440-
assertEquals(0, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseName()));
441-
assertEquals(0, testListener.getPhaseTotal(fetchPhase.getSearchPhaseName()));
440+
assertEquals(0, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseNameOptional().get()));
441+
assertEquals(0, testListener.getPhaseTotal(fetchPhase.getSearchPhaseNameOptional().get()));
442442
}
443443

444444
public void testOnPhaseFailure() {
@@ -722,7 +722,7 @@ public void testOnPhaseListenersWithQueryAndThenFetchType() throws InterruptedEx
722722
action.start();
723723

724724
// Verify queryPhase current metric
725-
assertEquals(1, testListener.getPhaseCurrent(action.getSearchPhaseName()));
725+
assertEquals(1, testListener.getPhaseCurrent(action.getSearchPhaseNameOptional().get()));
726726
TimeUnit.MILLISECONDS.sleep(delay);
727727

728728
FetchSearchPhase fetchPhase = createFetchSearchPhase();
@@ -733,31 +733,31 @@ public void testOnPhaseListenersWithQueryAndThenFetchType() throws InterruptedEx
733733
action.executeNextPhase(action, fetchPhase);
734734

735735
// Verify queryPhase total, current and latency metrics
736-
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseName()));
737-
assertThat(testListener.getPhaseMetric(action.getSearchPhaseName()), greaterThanOrEqualTo(delay));
738-
assertEquals(1, testListener.getPhaseTotal(action.getSearchPhaseName()));
736+
assertEquals(0, testListener.getPhaseCurrent(action.getSearchPhaseNameOptional().get()));
737+
assertThat(testListener.getPhaseMetric(action.getSearchPhaseNameOptional().get()), greaterThanOrEqualTo(delay));
738+
assertEquals(1, testListener.getPhaseTotal(action.getSearchPhaseNameOptional().get()));
739739

740740
// Verify fetchPhase current metric
741-
assertEquals(1, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseName()));
741+
assertEquals(1, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseNameOptional().get()));
742742
TimeUnit.MILLISECONDS.sleep(delay);
743743

744744
ExpandSearchPhase expandPhase = createExpandSearchPhase();
745745
action.executeNextPhase(fetchPhase, expandPhase);
746746
TimeUnit.MILLISECONDS.sleep(delay);
747747

748748
// Verify fetchPhase total, current and latency metrics
749-
assertThat(testListener.getPhaseMetric(fetchPhase.getSearchPhaseName()), greaterThanOrEqualTo(delay));
750-
assertEquals(1, testListener.getPhaseTotal(fetchPhase.getSearchPhaseName()));
751-
assertEquals(0, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseName()));
749+
assertThat(testListener.getPhaseMetric(fetchPhase.getSearchPhaseNameOptional().get()), greaterThanOrEqualTo(delay));
750+
assertEquals(1, testListener.getPhaseTotal(fetchPhase.getSearchPhaseNameOptional().get()));
751+
assertEquals(0, testListener.getPhaseCurrent(fetchPhase.getSearchPhaseNameOptional().get()));
752752

753-
assertEquals(1, testListener.getPhaseCurrent(expandPhase.getSearchPhaseName()));
753+
assertEquals(1, testListener.getPhaseCurrent(expandPhase.getSearchPhaseNameOptional().get()));
754754

755755
action.executeNextPhase(expandPhase, fetchPhase);
756756
action.onPhaseDone(); /* finish phase since we don't have reponse being sent */
757757

758-
assertThat(testListener.getPhaseMetric(expandPhase.getSearchPhaseName()), greaterThanOrEqualTo(delay));
759-
assertEquals(1, testListener.getPhaseTotal(expandPhase.getSearchPhaseName()));
760-
assertEquals(0, testListener.getPhaseCurrent(expandPhase.getSearchPhaseName()));
758+
assertThat(testListener.getPhaseMetric(expandPhase.getSearchPhaseNameOptional().get()), greaterThanOrEqualTo(delay));
759+
assertEquals(1, testListener.getPhaseTotal(expandPhase.getSearchPhaseNameOptional().get()));
760+
assertEquals(0, testListener.getPhaseCurrent(expandPhase.getSearchPhaseNameOptional().get()));
761761
}
762762

763763
public void testOnPhaseListenersWithDfsType() throws InterruptedException {
@@ -772,7 +772,7 @@ public void testOnPhaseListenersWithDfsType() throws InterruptedException {
772772

773773
FetchSearchPhase fetchPhase = createFetchSearchPhase();
774774
searchDfsQueryThenFetchAsyncAction.start();
775-
assertEquals(1, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()));
775+
assertEquals(1, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseNameOptional().get()));
776776
TimeUnit.MILLISECONDS.sleep(delay);
777777
ShardId shardId = new ShardId(randomAlphaOfLengthBetween(5, 10), randomAlphaOfLength(10), randomInt());
778778
SearchShardIterator searchShardIterator = new SearchShardIterator(null, shardId, Collections.emptyList(), OriginalIndices.NONE);
@@ -786,9 +786,12 @@ public void testOnPhaseListenersWithDfsType() throws InterruptedException {
786786
null
787787
); /* finalizing the fetch phase since we do adhoc phase lifecycle calls */
788788

789-
assertThat(testListener.getPhaseMetric(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()), greaterThanOrEqualTo(delay));
790-
assertEquals(1, testListener.getPhaseTotal(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()));
791-
assertEquals(0, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseName()));
789+
assertThat(
790+
testListener.getPhaseMetric(searchDfsQueryThenFetchAsyncAction.getSearchPhaseNameOptional().get()),
791+
greaterThanOrEqualTo(delay)
792+
);
793+
assertEquals(1, testListener.getPhaseTotal(searchDfsQueryThenFetchAsyncAction.getSearchPhaseNameOptional().get()));
794+
assertEquals(0, testListener.getPhaseCurrent(searchDfsQueryThenFetchAsyncAction.getSearchPhaseNameOptional().get()));
792795
}
793796

794797
private SearchDfsQueryThenFetchAsyncAction createSearchDfsQueryThenFetchAsyncAction(

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

+6-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.HashMap;
1515
import java.util.List;
1616
import java.util.Map;
17+
import java.util.Optional;
1718

1819
import static org.mockito.Mockito.mock;
1920
import static org.mockito.Mockito.when;
@@ -30,18 +31,18 @@ public void testListenersAreExecuted() {
3031

3132
@Override
3233
public void onPhaseStart(SearchPhaseContext context) {
33-
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseName()).current.inc();
34+
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseNameOptional().get()).current.inc();
3435
}
3536

3637
@Override
3738
public void onPhaseEnd(SearchPhaseContext context, SearchRequestContext searchRequestContext) {
38-
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseName()).current.dec();
39-
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseName()).total.inc();
39+
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseNameOptional().get()).current.dec();
40+
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseNameOptional().get()).total.inc();
4041
}
4142

4243
@Override
4344
public void onPhaseFailure(SearchPhaseContext context, Throwable cause) {
44-
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseName()).current.dec();
45+
searchPhaseMap.get(context.getCurrentPhase().getSearchPhaseNameOptional().get()).current.dec();
4546
}
4647
};
4748

@@ -61,7 +62,7 @@ public void onPhaseFailure(SearchPhaseContext context, Throwable cause) {
6162

6263
for (SearchPhaseName searchPhaseName : SearchPhaseName.values()) {
6364
when(ctx.getCurrentPhase()).thenReturn(searchPhase);
64-
when(searchPhase.getSearchPhaseName()).thenReturn(searchPhaseName);
65+
when(searchPhase.getSearchPhaseNameOptional()).thenReturn(Optional.of(searchPhaseName));
6566
compositeListener.onPhaseStart(ctx);
6667
assertEquals(totalListeners, searchPhaseMap.get(searchPhaseName).current.count());
6768
}

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

+53-5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.HashMap;
1717
import java.util.List;
1818
import java.util.Map;
19+
import java.util.Optional;
1920
import java.util.concurrent.CountDownLatch;
2021
import java.util.concurrent.Phaser;
2122
import java.util.concurrent.TimeUnit;
@@ -68,7 +69,7 @@ public void testSearchRequestPhaseFailure() {
6869
when(ctx.getCurrentPhase()).thenReturn(mockSearchPhase);
6970

7071
for (SearchPhaseName searchPhaseName : SearchPhaseName.values()) {
71-
when(mockSearchPhase.getSearchPhaseName()).thenReturn(searchPhaseName);
72+
when(mockSearchPhase.getSearchPhaseNameOptional()).thenReturn(Optional.of(searchPhaseName));
7273
testRequestStats.onPhaseStart(ctx);
7374
assertEquals(1, testRequestStats.getPhaseCurrent(searchPhaseName));
7475
testRequestStats.onPhaseFailure(ctx, new Throwable());
@@ -85,7 +86,7 @@ public void testSearchRequestStats() {
8586
when(ctx.getCurrentPhase()).thenReturn(mockSearchPhase);
8687

8788
for (SearchPhaseName searchPhaseName : SearchPhaseName.values()) {
88-
when(mockSearchPhase.getSearchPhaseName()).thenReturn(searchPhaseName);
89+
when(mockSearchPhase.getSearchPhaseNameOptional()).thenReturn(Optional.of(searchPhaseName));
8990
long tookTimeInMillis = randomIntBetween(1, 10);
9091
testRequestStats.onPhaseStart(ctx);
9192
long startTime = System.nanoTime() - TimeUnit.MILLISECONDS.toNanos(tookTimeInMillis);
@@ -116,7 +117,7 @@ public void testSearchRequestStatsOnPhaseStartConcurrently() throws InterruptedE
116117
SearchPhaseContext ctx = mock(SearchPhaseContext.class);
117118
SearchPhase mockSearchPhase = mock(SearchPhase.class);
118119
when(ctx.getCurrentPhase()).thenReturn(mockSearchPhase);
119-
when(mockSearchPhase.getSearchPhaseName()).thenReturn(searchPhaseName);
120+
when(mockSearchPhase.getSearchPhaseNameOptional()).thenReturn(Optional.of(searchPhaseName));
120121
for (int i = 0; i < numTasks; i++) {
121122
threads[i] = new Thread(() -> {
122123
phaser.arriveAndAwaitAdvance();
@@ -145,7 +146,7 @@ public void testSearchRequestStatsOnPhaseEndConcurrently() throws InterruptedExc
145146
SearchPhaseContext ctx = mock(SearchPhaseContext.class);
146147
SearchPhase mockSearchPhase = mock(SearchPhase.class);
147148
when(ctx.getCurrentPhase()).thenReturn(mockSearchPhase);
148-
when(mockSearchPhase.getSearchPhaseName()).thenReturn(searchPhaseName);
149+
when(mockSearchPhase.getSearchPhaseNameOptional()).thenReturn(Optional.of(searchPhaseName));
149150
long tookTimeInMillis = randomIntBetween(1, 10);
150151
long startTime = System.nanoTime() - TimeUnit.MILLISECONDS.toNanos(tookTimeInMillis);
151152
when(mockSearchPhase.getStartTimeInNanos()).thenReturn(startTime);
@@ -188,7 +189,7 @@ public void testSearchRequestStatsOnPhaseFailureConcurrently() throws Interrupte
188189
SearchPhaseContext ctx = mock(SearchPhaseContext.class);
189190
SearchPhase mockSearchPhase = mock(SearchPhase.class);
190191
when(ctx.getCurrentPhase()).thenReturn(mockSearchPhase);
191-
when(mockSearchPhase.getSearchPhaseName()).thenReturn(searchPhaseName);
192+
when(mockSearchPhase.getSearchPhaseNameOptional()).thenReturn(Optional.of(searchPhaseName));
192193
for (int i = 0; i < numTasks; i++) {
193194
threads[i] = new Thread(() -> {
194195
phaser.arriveAndAwaitAdvance();
@@ -205,4 +206,51 @@ public void testSearchRequestStatsOnPhaseFailureConcurrently() throws Interrupte
205206
assertEquals(0, testRequestStats.getPhaseCurrent(searchPhaseName));
206207
}
207208
}
209+
210+
public void testUnrecognizedPhaseNamesAreIgnored() {
211+
// Unrecognized phase names producing an empty optional should not throw any error and no stats should be incremented.
212+
ClusterSettings clusterSettings = new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS);
213+
SearchRequestStats testRequestStats = new SearchRequestStats(clusterSettings);
214+
SearchPhaseContext ctx = mock(SearchPhaseContext.class);
215+
SearchPhase mockSearchPhase = mock(SearchPhase.class);
216+
when(ctx.getCurrentPhase()).thenReturn(mockSearchPhase);
217+
218+
when(mockSearchPhase.getSearchPhaseNameOptional()).thenReturn(Optional.empty());
219+
testRequestStats.onPhaseStart(ctx);
220+
int minTimeNanos = 10;
221+
long startTime = System.nanoTime() - TimeUnit.MILLISECONDS.toNanos(minTimeNanos);
222+
when(mockSearchPhase.getStartTimeInNanos()).thenReturn(startTime);
223+
224+
for (SearchPhaseName name : SearchPhaseName.values()) {
225+
assertEquals(0, testRequestStats.getPhaseCurrent(name));
226+
}
227+
228+
testRequestStats.onPhaseEnd(
229+
ctx,
230+
new SearchRequestContext(
231+
new SearchRequestOperationsListener.CompositeListener(List.of(), LogManager.getLogger()),
232+
new SearchRequest(),
233+
() -> null
234+
)
235+
);
236+
237+
for (SearchPhaseName name : SearchPhaseName.values()) {
238+
assertEquals(0, testRequestStats.getPhaseCurrent(name));
239+
assertEquals(0, testRequestStats.getPhaseTotal(name));
240+
assertEquals(0, testRequestStats.getPhaseMetric(name));
241+
}
242+
}
243+
244+
public void testUnrecognizedSearchPhaseReturnsEmptyOptional() {
245+
// Test search phases with unrecognized names return Optional.empty() when getSearchPhaseNameOptional() is called.
246+
// These may exist, for example, "create_pit".
247+
String unrecognizedName = "unrecognized_name";
248+
SearchPhase dummyPhase = new SearchPhase(unrecognizedName) {
249+
@Override
250+
public void run() {}
251+
};
252+
253+
assertEquals(unrecognizedName, dummyPhase.getName());
254+
assertEquals(Optional.empty(), dummyPhase.getSearchPhaseNameOptional());
255+
}
208256
}

0 commit comments

Comments
 (0)