Skip to content

Commit 71d23a0

Browse files
drempapisSamiul-TheSoccerFan
authored andcommitted
backport changes to 9.1 (elastic#128827)
1 parent f4924e4 commit 71d23a0

File tree

3 files changed

+87
-16
lines changed

3 files changed

+87
-16
lines changed

server/src/internalClusterTest/java/org/elasticsearch/action/search/PointInTimeIT.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.elasticsearch.ExceptionsHelper;
1414
import org.elasticsearch.action.NoShardAvailableActionException;
1515
import org.elasticsearch.action.admin.cluster.reroute.ClusterRerouteUtils;
16+
import org.elasticsearch.action.admin.indices.alias.Alias;
1617
import org.elasticsearch.action.admin.indices.stats.CommonStats;
1718
import org.elasticsearch.action.admin.indices.stats.ShardStats;
1819
import org.elasticsearch.action.support.IndicesOptions;
@@ -126,6 +127,42 @@ public void testBasic() {
126127
}
127128
}
128129

130+
public void testIndexWithFilteredAlias() {
131+
String indexName = "index_1";
132+
String alias = "alias_1";
133+
assertAcked(
134+
indicesAdmin().prepareCreate(indexName)
135+
.setSettings(indexSettings(10, 0))
136+
.addAlias(new Alias(alias).filter("{\"term\":{\"tag\":\"a\"}}"))
137+
);
138+
139+
int numDocs = randomIntBetween(50, 150);
140+
int countTagA = 0;
141+
for (int i = 0; i < numDocs; i++) {
142+
boolean isA = randomBoolean();
143+
if (isA) countTagA++;
144+
prepareIndex(indexName).setId(Integer.toString(i)).setSource("tag", isA ? "a" : "b").get();
145+
}
146+
147+
refresh(indexName);
148+
BytesReference pitId = openPointInTime(new String[] { alias }, TimeValue.timeValueMinutes(1)).getPointInTimeId();
149+
150+
try {
151+
int finalCountTagA = countTagA;
152+
assertResponse(
153+
prepareSearch().setPointInTime(new PointInTimeBuilder(pitId).setKeepAlive(TimeValue.timeValueMinutes(1)))
154+
.setSize(0)
155+
.setQuery(new MatchAllQueryBuilder()),
156+
resp1 -> {
157+
assertThat(resp1.pointInTimeId(), equalTo(pitId));
158+
assertHitCount(resp1, finalCountTagA);
159+
}
160+
);
161+
} finally {
162+
closePointInTime(pitId);
163+
}
164+
}
165+
129166
public void testMultipleIndices() {
130167
int numIndices = randomIntBetween(1, 5);
131168
for (int i = 1; i <= numIndices; i++) {

server/src/main/java/org/elasticsearch/action/search/SearchQueryThenFetchAsyncAction.java

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,14 @@ private static ShardSearchRequest tryRewriteWithUpdatedSortValue(
394394
return request;
395395
}
396396

397-
private static boolean isPartOfPIT(SearchRequest request, ShardSearchContextId contextId) {
397+
private static boolean isPartOfPIT(
398+
SearchRequest request,
399+
ShardSearchContextId contextId,
400+
NamedWriteableRegistry namedWriteableRegistry
401+
) {
398402
final PointInTimeBuilder pointInTimeBuilder = request.pointInTimeBuilder();
399403
if (pointInTimeBuilder != null) {
400-
return request.pointInTimeBuilder().getSearchContextId(null).contains(contextId);
404+
return request.pointInTimeBuilder().getSearchContextId(namedWriteableRegistry).contains(contextId);
401405
} else {
402406
return false;
403407
}
@@ -551,7 +555,8 @@ private void onNodeQueryFailure(Exception e, NodeQueryRequest request, CanMatchP
551555
static void registerNodeSearchAction(
552556
SearchTransportService searchTransportService,
553557
SearchService searchService,
554-
SearchPhaseController searchPhaseController
558+
SearchPhaseController searchPhaseController,
559+
NamedWriteableRegistry namedWriteableRegistry
555560
) {
556561
var transportService = searchTransportService.transportService();
557562
var threadPool = transportService.getThreadPool();
@@ -581,7 +586,8 @@ static void registerNodeSearchAction(
581586
request,
582587
cancellableTask,
583588
channel,
584-
dependencies
589+
dependencies,
590+
namedWriteableRegistry
585591
);
586592
// TODO: log activating or otherwise limiting parallelism might be helpful here
587593
for (int i = 0; i < workers; i++) {
@@ -592,12 +598,17 @@ static void registerNodeSearchAction(
592598
TransportActionProxy.registerProxyAction(transportService, NODE_SEARCH_ACTION_NAME, true, NodeQueryResponse::new);
593599
}
594600

595-
private static void releaseLocalContext(SearchService searchService, NodeQueryRequest request, SearchPhaseResult result) {
601+
private static void releaseLocalContext(
602+
SearchService searchService,
603+
NodeQueryRequest request,
604+
SearchPhaseResult result,
605+
NamedWriteableRegistry namedWriteableRegistry
606+
) {
596607
var phaseResult = result.queryResult() != null ? result.queryResult() : result.rankFeatureResult();
597608
if (phaseResult != null
598609
&& phaseResult.hasSearchContext()
599610
&& request.searchRequest.scroll() == null
600-
&& isPartOfPIT(request.searchRequest, phaseResult.getContextId()) == false) {
611+
&& isPartOfPIT(request.searchRequest, phaseResult.getContextId(), namedWriteableRegistry) == false) {
601612
searchService.freeReaderContext(phaseResult.getContextId());
602613
}
603614
}
@@ -741,13 +752,15 @@ private static final class QueryPerNodeState {
741752
private final CountDown countDown;
742753
private final TransportChannel channel;
743754
private volatile BottomSortValuesCollector bottomSortCollector;
755+
private final NamedWriteableRegistry namedWriteableRegistry;
744756

745757
private QueryPerNodeState(
746758
QueryPhaseResultConsumer queryPhaseResultConsumer,
747759
NodeQueryRequest searchRequest,
748760
CancellableTask task,
749761
TransportChannel channel,
750-
Dependencies dependencies
762+
Dependencies dependencies,
763+
NamedWriteableRegistry namedWriteableRegistry
751764
) {
752765
this.queryPhaseResultConsumer = queryPhaseResultConsumer;
753766
this.searchRequest = searchRequest;
@@ -757,6 +770,7 @@ private QueryPerNodeState(
757770
this.countDown = new CountDown(queryPhaseResultConsumer.getNumShards());
758771
this.channel = channel;
759772
this.dependencies = dependencies;
773+
this.namedWriteableRegistry = namedWriteableRegistry;
760774
}
761775

762776
void onShardDone() {
@@ -769,7 +783,7 @@ void onShardDone() {
769783
try (queryPhaseResultConsumer) {
770784
var failure = queryPhaseResultConsumer.failure.get();
771785
if (failure != null) {
772-
handleMergeFailure(failure, channelListener);
786+
handleMergeFailure(failure, channelListener, namedWriteableRegistry);
773787
return;
774788
}
775789
final QueryPhaseResultConsumer.MergeResult mergeResult;
@@ -779,7 +793,7 @@ void onShardDone() {
779793
EMPTY_PARTIAL_MERGE_RESULT
780794
);
781795
} catch (Exception e) {
782-
handleMergeFailure(e, channelListener);
796+
handleMergeFailure(e, channelListener, namedWriteableRegistry);
783797
return;
784798
}
785799
// translate shard indices to those on the coordinator so that it can interpret the merge result without adjustments,
@@ -804,14 +818,14 @@ void onShardDone() {
804818
NodeQueryResponse.writePerShardException(out, failures.remove(i));
805819
} else {
806820
// free context id and remove it from the result right away in case we don't need it anymore
807-
maybeFreeContext(result, relevantShardIndices);
821+
maybeFreeContext(result, relevantShardIndices, namedWriteableRegistry);
808822
NodeQueryResponse.writePerShardResult(out, result);
809823
}
810824
}
811825
NodeQueryResponse.writeMergeResult(out, mergeResult, queryPhaseResultConsumer.topDocsStats);
812826
success = true;
813827
} catch (IOException e) {
814-
handleMergeFailure(e, channelListener);
828+
handleMergeFailure(e, channelListener, namedWriteableRegistry);
815829
return;
816830
}
817831
} finally {
@@ -822,23 +836,38 @@ void onShardDone() {
822836
ActionListener.respondAndRelease(channelListener, new BytesTransportResponse(out.moveToBytesReference()));
823837
}
824838

825-
private void maybeFreeContext(SearchPhaseResult result, BitSet relevantShardIndices) {
839+
private void maybeFreeContext(
840+
SearchPhaseResult result,
841+
BitSet relevantShardIndices,
842+
NamedWriteableRegistry namedWriteableRegistry
843+
) {
826844
if (result instanceof QuerySearchResult q
827845
&& q.getContextId() != null
828846
&& relevantShardIndices.get(q.getShardIndex()) == false
829847
&& q.hasSuggestHits() == false
830848
&& q.getRankShardResult() == null
831849
&& searchRequest.searchRequest.scroll() == null
832-
&& isPartOfPIT(searchRequest.searchRequest, q.getContextId()) == false) {
850+
&& isPartOfPIT(searchRequest.searchRequest, q.getContextId(), namedWriteableRegistry) == false) {
833851
if (dependencies.searchService.freeReaderContext(q.getContextId())) {
834852
q.clearContextId();
835853
}
836854
}
837855
}
838856

839-
private void handleMergeFailure(Exception e, ChannelActionListener<TransportResponse> channelListener) {
857+
private void handleMergeFailure(
858+
Exception e,
859+
ChannelActionListener<TransportResponse> channelListener,
860+
NamedWriteableRegistry namedWriteableRegistry
861+
) {
840862
queryPhaseResultConsumer.getSuccessfulResults()
841-
.forEach(searchPhaseResult -> releaseLocalContext(dependencies.searchService, searchRequest, searchPhaseResult));
863+
.forEach(
864+
searchPhaseResult -> releaseLocalContext(
865+
dependencies.searchService,
866+
searchRequest,
867+
searchPhaseResult,
868+
namedWriteableRegistry
869+
)
870+
);
842871
channelListener.onFailure(e);
843872
}
844873

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,12 @@ public TransportSearchAction(
194194
this.searchTransportService = searchTransportService;
195195
this.remoteClusterService = searchTransportService.getRemoteClusterService();
196196
SearchTransportService.registerRequestHandler(transportService, searchService);
197-
SearchQueryThenFetchAsyncAction.registerNodeSearchAction(searchTransportService, searchService, searchPhaseController);
197+
SearchQueryThenFetchAsyncAction.registerNodeSearchAction(
198+
searchTransportService,
199+
searchService,
200+
searchPhaseController,
201+
namedWriteableRegistry
202+
);
198203
this.clusterService = clusterService;
199204
this.transportService = transportService;
200205
this.searchService = searchService;

0 commit comments

Comments
 (0)