@@ -1264,18 +1264,18 @@ private ReaderContext findReaderContext(ShardSearchContextId id, TransportReques
12641264 }
12651265
12661266 final ReaderContext createOrGetReaderContext (ShardSearchRequest request ) {
1267+ ShardSearchContextId readerId = request .readerId ();
12671268 if (request .readerId () != null ) {
12681269 try {
1269- return findReaderContext (request . readerId () , request );
1270+ return findReaderContext (readerId , request );
12701271 } catch (SearchContextMissingException e ) {
1271- final String searcherId = request .readerId ().getSearcherId ();
1272- if (searcherId == null ) {
1272+ if (readerId .isRetryable () == false ) {
12731273 throw e ;
12741274 }
12751275 final IndexService indexService = indicesService .indexServiceSafe (request .shardId ().getIndex ());
12761276 final IndexShard shard = indexService .getShard (request .shardId ().id ());
12771277 final Engine .SearcherSupplier searcherSupplier = shard .acquireSearcherSupplier ();
1278- if (searcherId . equals (searcherSupplier .getSearcherId ()) == false ) {
1278+ if (readerId . sameSearcherIdsAs (searcherSupplier .getSearcherId ()) == false ) {
12791279 searcherSupplier .close ();
12801280 throw e ;
12811281 }
@@ -1298,8 +1298,8 @@ final ReaderContext createAndPutReaderContext(
12981298 ReaderContext readerContext = null ;
12991299 Releasable decreaseScrollContexts = null ;
13001300 try {
1301- final ShardSearchContextId id = new ShardSearchContextId (sessionId , idGenerator .incrementAndGet ());
13021301 if (request .scroll () != null ) {
1302+ final ShardSearchContextId id = new ShardSearchContextId (sessionId , idGenerator .incrementAndGet ());
13031303 decreaseScrollContexts = openScrollContexts ::decrementAndGet ;
13041304 if (openScrollContexts .incrementAndGet () > maxOpenScrollContext ) {
13051305 throw new TooManyScrollContextsException (maxOpenScrollContext , MAX_OPEN_SCROLL_CONTEXT .getKey ());
@@ -1308,6 +1308,7 @@ final ReaderContext createAndPutReaderContext(
13081308 readerContext .addOnClose (decreaseScrollContexts );
13091309 decreaseScrollContexts = null ;
13101310 } else {
1311+ final ShardSearchContextId id = new ShardSearchContextId (sessionId , idGenerator .incrementAndGet (), reader .getSearcherId ());
13111312 readerContext = new ReaderContext (id , indexService , shard , reader , keepAliveInMillis , true );
13121313 }
13131314 reader = null ;
@@ -1399,7 +1400,7 @@ public SearchContext createSearchContext(ShardSearchRequest request, TimeValue t
13991400 final IndexService indexService = indicesService .indexServiceSafe (request .shardId ().getIndex ());
14001401 final IndexShard indexShard = indexService .getShard (request .shardId ().getId ());
14011402 final Engine .SearcherSupplier reader = indexShard .acquireSearcherSupplier ();
1402- final ShardSearchContextId id = new ShardSearchContextId (sessionId , idGenerator .incrementAndGet ());
1403+ final ShardSearchContextId id = new ShardSearchContextId (sessionId , idGenerator .incrementAndGet (), reader . getSearcherId () );
14031404 try (ReaderContext readerContext = new ReaderContext (id , indexService , indexShard , reader , -1L , true )) {
14041405 DefaultSearchContext searchContext = createSearchContext (readerContext , request , timeout , ResultsType .NONE );
14051406 searchContext .addReleasable (readerContext .markAsUsed (0L ));
@@ -2037,8 +2038,7 @@ static CanMatchShardResponse canMatch(CanMatchContext canMatchContext, boolean c
20372038 }
20382039 searcher = readerContext .acquireSearcher (Engine .CAN_MATCH_SEARCH_SOURCE );
20392040 } catch (SearchContextMissingException e ) {
2040- final String searcherId = canMatchContext .request .readerId ().getSearcherId ();
2041- if (searcherId == null ) {
2041+ if (canMatchContext .request .readerId ().isRetryable () == false ) {
20422042 return new CanMatchShardResponse (true , null );
20432043 }
20442044 if (queryStillMatchesAfterRewrite (
@@ -2048,7 +2048,7 @@ static CanMatchShardResponse canMatch(CanMatchContext canMatchContext, boolean c
20482048 return new CanMatchShardResponse (false , null );
20492049 }
20502050 final Engine .SearcherSupplier searcherSupplier = canMatchContext .getShard ().acquireSearcherSupplier ();
2051- if (searcherId . equals (searcherSupplier .getSearcherId ()) == false ) {
2051+ if (canMatchContext . request . readerId (). sameSearcherIdsAs (searcherSupplier .getSearcherId ()) == false ) {
20522052 searcherSupplier .close ();
20532053 return new CanMatchShardResponse (true , null );
20542054 }
0 commit comments