Skip to content

Commit 88eefb9

Browse files
Early terminate the slices for concurrent search if CircuitBreakingException is thrown
Signed-off-by: Neetika Singhal <neetiks@amazon.com>
1 parent 16d457d commit 88eefb9

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

server/src/main/java/org/opensearch/search/internal/ContextIndexSearcher.java

+18
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import org.opensearch.common.annotation.PublicApi;
6868
import org.opensearch.common.lease.Releasable;
6969
import org.opensearch.common.lucene.search.TopDocsAndMaxScore;
70+
import org.opensearch.core.common.breaker.CircuitBreakingException;
7071
import org.opensearch.search.DocValueFormat;
7172
import org.opensearch.search.SearchService;
7273
import org.opensearch.search.dfs.AggregatedDfs;
@@ -269,6 +270,11 @@ public void search(
269270

270271
@Override
271272
protected void search(List<LeafReaderContext> leaves, Weight weight, Collector collector) throws IOException {
273+
274+
if (searchContext.isCircuitBreakerTripped()) {
275+
return;
276+
}
277+
272278
// Time series based workload by default traverses segments in desc order i.e. latest to the oldest order.
273279
// This is actually beneficial for search queries to start search on latest segments first for time series workload.
274280
// That can slow down ASC order queries on timestamp workload. So to avoid that slowdown, we will reverse leaf
@@ -297,6 +303,9 @@ private void searchLeaf(LeafReaderContext ctx, Weight weight, Collector collecto
297303
if (canMatch(ctx) == false) {
298304
return;
299305
}
306+
if (searchContext.isCircuitBreakerTripped()) {
307+
return;
308+
}
300309

301310
final LeafCollector leafCollector;
302311
try {
@@ -315,6 +324,9 @@ private void searchLeaf(LeafReaderContext ctx, Weight weight, Collector collecto
315324
} catch (QueryPhase.TimeExceededException e) {
316325
searchContext.setSearchTimedOut(true);
317326
return;
327+
} catch (CircuitBreakingException e) {
328+
searchContext.setCircuitBreakerTripped(true);
329+
return;
318330
}
319331
// catch early terminated exception and rethrow?
320332
Bits liveDocs = ctx.reader().getLiveDocs();
@@ -330,6 +342,9 @@ private void searchLeaf(LeafReaderContext ctx, Weight weight, Collector collecto
330342
} catch (QueryPhase.TimeExceededException e) {
331343
searchContext.setSearchTimedOut(true);
332344
return;
345+
} catch (CircuitBreakingException e) {
346+
searchContext.setCircuitBreakerTripped(true);
347+
return;
333348
}
334349
}
335350
} else {
@@ -349,6 +364,9 @@ private void searchLeaf(LeafReaderContext ctx, Weight weight, Collector collecto
349364
} catch (QueryPhase.TimeExceededException e) {
350365
searchContext.setSearchTimedOut(true);
351366
return;
367+
} catch (CircuitBreakingException e) {
368+
searchContext.setCircuitBreakerTripped(true);
369+
return;
352370
}
353371
}
354372
}

server/src/main/java/org/opensearch/search/internal/SearchContext.java

+9
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ public List<Aggregator> toAggregators(Collection<Collector> collectors) {
122122
private InnerHitsContext innerHitsContext;
123123

124124
private volatile boolean searchTimedOut;
125+
private volatile boolean circuitBreakerTripped;
125126

126127
protected SearchContext() {}
127128

@@ -139,6 +140,14 @@ public void setSearchTimedOut(boolean searchTimedOut) {
139140
this.searchTimedOut = searchTimedOut;
140141
}
141142

143+
public boolean isCircuitBreakerTripped() {
144+
return circuitBreakerTripped;
145+
}
146+
147+
public void setCircuitBreakerTripped(boolean circuitBreakerTripped) {
148+
this.circuitBreakerTripped = circuitBreakerTripped;
149+
}
150+
142151
@Override
143152
public final void close() {
144153
if (closed.compareAndSet(false, true)) {

0 commit comments

Comments
 (0)