Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ref count search response bytes #103763

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
188 commits
Select commit Hold shift + click to select a range
6825cb2
Fix more leaked SearchResponse instances in tests
original-brownbear Nov 30, 2023
5474223
save
original-brownbear Dec 2, 2023
277584f
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 2, 2023
b2a9124
clippyh
original-brownbear Dec 2, 2023
55d1f40
fixes
original-brownbear Dec 2, 2023
02319b3
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 3, 2023
c301177
Merge remote-tracking branch 'origin/ref-count-search-response-itself…
original-brownbear Dec 3, 2023
8b42a9c
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 5, 2023
cf9d196
fix ml
original-brownbear Dec 5, 2023
a827020
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 5, 2023
8230777
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 6, 2023
19efcac
fix eql
original-brownbear Dec 6, 2023
00e73bd
Merge remote-tracking branch 'origin/ref-count-search-response-itself…
original-brownbear Dec 6, 2023
b4da0b6
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 6, 2023
f234e75
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 6, 2023
d78047a
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 6, 2023
2f54229
fixe
original-brownbear Dec 6, 2023
a78f555
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 6, 2023
a064f6d
fix
original-brownbear Dec 6, 2023
a250db6
ix
original-brownbear Dec 6, 2023
a64e6a6
ix
original-brownbear Dec 6, 2023
2506dc1
retain ref async
original-brownbear Dec 6, 2023
66e110e
Fix SearchResponse leaks in searchable snapshot test and production code
original-brownbear Dec 7, 2023
92417b2
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 7, 2023
1f531e2
Merge branch 'main' into fix-leaks-searchable-snapshots
elasticmachine Dec 7, 2023
7320701
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 7, 2023
24a3614
Merge remote-tracking branch 'elastic/main' into fix-leaks-searchable…
original-brownbear Dec 7, 2023
dab8843
Merge remote-tracking branch 'elastic/main' into fix-leaks-searchable…
original-brownbear Dec 9, 2023
cb5eff3
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 9, 2023
a53459e
Merge branch 'fix-leaks-searchable-snapshots' into ref-count-search-r…
original-brownbear Dec 9, 2023
84aee6d
bck
original-brownbear Dec 9, 2023
90472a3
fix ls
original-brownbear Dec 9, 2023
f0b79cb
fix security
original-brownbear Dec 9, 2023
1ec52e0
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 9, 2023
6842d53
fix enrich
original-brownbear Dec 9, 2023
59010e8
fix monitoring
original-brownbear Dec 10, 2023
a0afff4
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 10, 2023
ba8de91
fix test
original-brownbear Dec 10, 2023
6467f0e
fix test
original-brownbear Dec 10, 2023
9176a82
fix test
original-brownbear Dec 10, 2023
2e08c60
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 10, 2023
9da76aa
fix test
original-brownbear Dec 10, 2023
3e1fd3a
fail less hard
original-brownbear Dec 10, 2023
f4d4c35
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 11, 2023
e5d09a4
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 11, 2023
a4d3471
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 11, 2023
33f958d
Merge remote-tracking branch 'origin/ref-count-search-response-itself…
original-brownbear Dec 13, 2023
af4bd8d
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 13, 2023
b354343
test fixes
original-brownbear Dec 13, 2023
f0c4b9f
watcher
original-brownbear Dec 13, 2023
58e3bad
fix analytics
original-brownbear Dec 13, 2023
9a51436
fix rollup
original-brownbear Dec 13, 2023
dcbb701
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 13, 2023
8fb5b95
closer
original-brownbear Dec 17, 2023
0758040
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 17, 2023
951fc47
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 18, 2023
1a450e0
fix async
original-brownbear Dec 18, 2023
27c7caf
fix
original-brownbear Dec 18, 2023
12ad9a4
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 18, 2023
5cb5801
fix
original-brownbear Dec 18, 2023
1588d77
fix more tests
original-brownbear Dec 18, 2023
297951a
fixes
original-brownbear Dec 18, 2023
15e1445
fixes
original-brownbear Dec 18, 2023
177eff3
fix ds
original-brownbear Dec 18, 2023
65464b1
fix ds
original-brownbear Dec 18, 2023
03b7bc7
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 18, 2023
e0f7999
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 19, 2023
2d52761
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 20, 2023
3d24775
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 20, 2023
46a440c
bck
original-brownbear Dec 20, 2023
83909fb
less diff
original-brownbear Dec 20, 2023
de7b93c
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 22, 2023
ad638ec
Merge remote-tracking branch 'origin/ref-count-search-response-itself…
original-brownbear Dec 22, 2023
b80fe93
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 22, 2023
9670ea4
reduce noise
original-brownbear Dec 22, 2023
b5e067c
reduce noise
original-brownbear Dec 22, 2023
96f107f
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 29, 2023
2446242
start of this
original-brownbear Dec 29, 2023
5064702
fix
original-brownbear Dec 29, 2023
f608adc
Merge branch 'ref-count-search-response-itself' into ref-count-search…
original-brownbear Dec 29, 2023
5f03968
yeay
original-brownbear Dec 29, 2023
0dbbedf
cleaner
original-brownbear Dec 29, 2023
57959df
cleaner
original-brownbear Dec 29, 2023
c83d3de
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 30, 2023
752948d
bck
original-brownbear Dec 30, 2023
31cc1ca
woerks
original-brownbear Dec 30, 2023
9c68248
woerks
original-brownbear Dec 30, 2023
db07009
woerks
original-brownbear Dec 30, 2023
b8c8826
fixes
original-brownbear Dec 31, 2023
2e96556
some fixes
original-brownbear Dec 31, 2023
072e30c
some fixes
original-brownbear Dec 31, 2023
21c31cf
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Dec 31, 2023
155a14a
woerks
original-brownbear Dec 31, 2023
4ae679f
woerks
original-brownbear Dec 31, 2023
3315b82
we
original-brownbear Jan 1, 2024
385bb16
eql
original-brownbear Jan 2, 2024
34d7b08
rollup
original-brownbear Jan 2, 2024
fa1210e
rollup
original-brownbear Jan 2, 2024
f9b6899
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 2, 2024
8d7cdb6
bck
original-brownbear Jan 2, 2024
f00bfcd
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 2, 2024
28e2047
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 2, 2024
9976f85
fxi to string
original-brownbear Jan 2, 2024
b46e005
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 2, 2024
8c9c623
meh
original-brownbear Jan 2, 2024
bab9bce
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 2, 2024
d1affc4
fixes
original-brownbear Jan 2, 2024
97071ce
fix geoip
original-brownbear Jan 2, 2024
d77e926
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 2, 2024
4b9e159
bck
original-brownbear Jan 3, 2024
f99eccc
LS
original-brownbear Jan 3, 2024
ed4c77b
reindex
original-brownbear Jan 3, 2024
af2bb21
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 3, 2024
9df3739
more assert
original-brownbear Jan 3, 2024
0f1f470
percolator
original-brownbear Jan 3, 2024
b968c9f
watcher
original-brownbear Jan 3, 2024
bdbc287
latency simulating
original-brownbear Jan 3, 2024
c009fda
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 3, 2024
a449603
bck
original-brownbear Jan 3, 2024
96e7d34
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 3, 2024
9fe4d60
fixed?
original-brownbear Jan 3, 2024
3dee62c
bug
original-brownbear Jan 3, 2024
e487a5f
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 4, 2024
8757a08
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 4, 2024
a036be4
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 4, 2024
5cca6f6
simple fix?
original-brownbear Jan 4, 2024
e744c81
unpooled for now
original-brownbear Jan 4, 2024
e60771b
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 5, 2024
efa729a
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 5, 2024
9521560
another leak
original-brownbear Jan 5, 2024
20357d2
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 5, 2024
9034d3d
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 5, 2024
a94e573
shorter
original-brownbear Jan 5, 2024
e8c2a77
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 6, 2024
7e9e455
revert noise
original-brownbear Jan 6, 2024
7da5454
revert netty change
original-brownbear Jan 6, 2024
e49768e
priv
original-brownbear Jan 6, 2024
cacfb6a
cleanup
original-brownbear Jan 6, 2024
f62ee0b
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 7, 2024
ccf7a05
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 8, 2024
da86e00
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 8, 2024
34e89ed
shorter
original-brownbear Jan 8, 2024
f918228
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 8, 2024
1edba57
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 8, 2024
79c8ab4
shorter
original-brownbear Jan 8, 2024
cb716f9
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 8, 2024
ed4bc8b
shorter
original-brownbear Jan 8, 2024
3f90b59
shorter
original-brownbear Jan 8, 2024
6e192e1
shorter
original-brownbear Jan 8, 2024
249b001
shorter
original-brownbear Jan 8, 2024
7f5c349
shorter
original-brownbear Jan 8, 2024
97e6013
shorter
original-brownbear Jan 8, 2024
6af24be
weird stuff
original-brownbear Jan 8, 2024
8d9bce8
shoter
original-brownbear Jan 8, 2024
ff4c03c
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 8, 2024
38bee1b
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 9, 2024
2ecef41
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 9, 2024
d8c69a7
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 9, 2024
a7f9043
cheaper unpooled
original-brownbear Jan 9, 2024
f464d1f
not needed
original-brownbear Jan 9, 2024
58c56e1
facepalm
original-brownbear Jan 9, 2024
ed68271
fix pooling
original-brownbear Jan 9, 2024
de761ca
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 9, 2024
c402a0d
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 9, 2024
626b056
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 9, 2024
0a32e62
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 10, 2024
9ac3cad
shorter
original-brownbear Jan 10, 2024
2d3bd76
shorter
original-brownbear Jan 10, 2024
81a9e9a
shorter
original-brownbear Jan 10, 2024
6c5d399
rated search hit leak
original-brownbear Jan 10, 2024
ee3a352
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 10, 2024
0dd7ea7
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 10, 2024
ae1e894
simpler
original-brownbear Jan 10, 2024
1bab0de
massively more efficient
original-brownbear Jan 10, 2024
306b232
Update docs/changelog/103763.yaml
original-brownbear Jan 10, 2024
c6aae01
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 11, 2024
f7e9fd9
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 11, 2024
b49102b
shorter
original-brownbear Jan 11, 2024
2ec731a
Merge remote-tracking branch 'origin/ref-count-search-response-bytes'…
original-brownbear Jan 11, 2024
0c737fc
Update docs/changelog/103763.yaml
original-brownbear Jan 12, 2024
e99d091
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 12, 2024
b66ebc2
Merge remote-tracking branch 'origin/ref-count-search-response-bytes'…
original-brownbear Jan 12, 2024
bfb2b68
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 12, 2024
2b135ac
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 16, 2024
7c4744c
CR: comments
original-brownbear Jan 16, 2024
42caa0e
Merge remote-tracking branch 'elastic/main' into ref-count-search-res…
original-brownbear Jan 16, 2024
b12a673
Merge remote-tracking branch 'origin/ref-count-search-response-bytes'…
original-brownbear Jan 17, 2024
9f3bb93
Merge remote-tracking branch 'elastic/main' into ref-count-search…
original-brownbear Jan 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/changelog/103763.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
pr: 103763
summary: Ref count search response bytes
area: Search
type: enhancement
issues:
- 102657
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ private String mockSearches(String databaseName, int firstChunk, int lastChunk)
Map<String, ActionFuture<SearchResponse>> requestMap = new HashMap<>();
for (int i = firstChunk; i <= lastChunk; i++) {
byte[] chunk = data.get(i - firstChunk);
SearchHit hit = new SearchHit(i);
SearchHit hit = SearchHit.unpooled(i);
try (XContentBuilder builder = XContentBuilder.builder(XContentType.SMILE.xContent())) {
builder.map(Map.of("data", chunk));
builder.flush();
Expand All @@ -328,7 +328,7 @@ private String mockSearches(String databaseName, int firstChunk, int lastChunk)
throw new UncheckedIOException(ex);
}

SearchHits hits = new SearchHits(new SearchHit[] { hit }, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1f);
SearchHits hits = SearchHits.unpooled(new SearchHit[] { hit }, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1f);
SearchResponse searchResponse = new SearchResponse(hits, null, null, false, null, null, 0, null, 1, 1, 0, 1L, null, null);
toRelease.add(searchResponse::decRef);
@SuppressWarnings("unchecked")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public void process(HitContext hit) throws IOException {
BytesReference document = percolateQuery.getDocuments().get(slot);
leafStoredFields.advanceTo(slot);
HitContext subContext = new HitContext(
new SearchHit(slot, "unknown"),
SearchHit.unpooled(slot, "unknown"),
percolatorLeafReaderContext,
slot,
leafStoredFields.storedFields(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void testHitsExecute() throws Exception {
LeafReaderContext context = reader.leaves().get(0);
// A match:
{
HitContext hit = new HitContext(new SearchHit(0), context, 0, Map.of(), Source.empty(null));
HitContext hit = new HitContext(SearchHit.unpooled(0), context, 0, Map.of(), Source.empty(null));
PercolateQuery.QueryStore queryStore = ctx -> docId -> new TermQuery(new Term("field", "value"));
MemoryIndex memoryIndex = new MemoryIndex();
memoryIndex.addField("field", "value", new WhitespaceAnalyzer());
Expand Down Expand Up @@ -87,7 +87,7 @@ public void testHitsExecute() throws Exception {

// No match:
{
HitContext hit = new HitContext(new SearchHit(0), context, 0, Map.of(), Source.empty(null));
HitContext hit = new HitContext(SearchHit.unpooled(0), context, 0, Map.of(), Source.empty(null));
PercolateQuery.QueryStore queryStore = ctx -> docId -> new TermQuery(new Term("field", "value"));
MemoryIndex memoryIndex = new MemoryIndex();
memoryIndex.addField("field", "value1", new WhitespaceAnalyzer());
Expand Down Expand Up @@ -117,7 +117,7 @@ public void testHitsExecute() throws Exception {

// No query:
{
HitContext hit = new HitContext(new SearchHit(0), context, 0, Map.of(), Source.empty(null));
HitContext hit = new HitContext(SearchHit.unpooled(0), context, 0, Map.of(), Source.empty(null));
PercolateQuery.QueryStore queryStore = ctx -> docId -> null;
MemoryIndex memoryIndex = new MemoryIndex();
memoryIndex.addField("field", "value", new WhitespaceAnalyzer());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ public class RatedSearchHit implements Writeable, ToXContentObject {
private final OptionalInt rating;

public RatedSearchHit(SearchHit searchHit, OptionalInt rating) {
this.searchHit = searchHit;
this.searchHit = searchHit.asUnpooled();
benwtrent marked this conversation as resolved.
Show resolved Hide resolved
this.rating = rating;
}

RatedSearchHit(StreamInput in) throws IOException {
this(SearchHit.readFrom(in), in.readBoolean() ? OptionalInt.of(in.readVInt()) : OptionalInt.empty());
this(SearchHit.readFrom(in, false), in.readBoolean() ? OptionalInt.of(in.readVInt()) : OptionalInt.empty());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ public void testDeleteByQuery() throws Exception {
.addSort(SORTING_FIELD, SortOrder.DESC),
response -> {
// Modify a subset of the target documents concurrently
final List<SearchHit> originalDocs = Arrays.asList(response.getHits().getHits());
final List<SearchHit> originalDocs = Arrays.asList(response.getHits().asUnpooled().getHits());
docsModifiedConcurrently.addAll(randomSubsetOf(finalConflictingOps, originalDocs));
}
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -567,8 +567,8 @@ protected RequestWrapper<?> buildRequest(Hit doc) {
action.start();

// create a simulated response.
SearchHit hit = new SearchHit(0, "id").sourceRef(new BytesArray("{}"));
SearchHits hits = new SearchHits(
SearchHit hit = SearchHit.unpooled(0, "id").sourceRef(new BytesArray("{}"));
SearchHits hits = SearchHits.unpooled(
IntStream.range(0, 100).mapToObj(i -> hit).toArray(SearchHit[]::new),
new TotalHits(0, TotalHits.Relation.EQUAL_TO),
0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ public void testScrollKeepAlive() {

private SearchResponse createSearchResponse() {
// create a simulated response.
SearchHit hit = new SearchHit(0, "id").sourceRef(new BytesArray("{}"));
SearchHits hits = new SearchHits(
SearchHit hit = SearchHit.unpooled(0, "id").sourceRef(new BytesArray("{}"));
SearchHits hits = SearchHits.unpooled(
IntStream.range(0, randomIntBetween(0, 20)).mapToObj(i -> hit).toArray(SearchHit[]::new),
new TotalHits(0, TotalHits.Relation.EQUAL_TO),
0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ public void testConsistentHitsWithSameSeed() throws Exception {
CoreMatchers.equalTo(0)
);
final int hitCount = response.getHits().getHits().length;
final SearchHit[] currentHits = response.getHits().getHits();
final SearchHit[] currentHits = response.getHits().asUnpooled().getHits();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't seem like we need to asUnpooled() these hits unless we drop into the if (finalI == 0) block below.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True but it's more code/change to make that conditional with how things work today. I'd deal with this in a follow-up where I was planning to restrict the explicit use of the array backing a SearchHits as much as possible.

ArrayUtil.timSort(currentHits, (o1, o2) -> {
// for tie-breaking we have to resort here since if the score is
// identical we rely on collection order which might change.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ abstract class AbstractSearchAsyncAction<Result extends SearchPhaseResult> exten
this.results = resultConsumer;
// register the release of the query consumer to free up the circuit breaker memory
// at the end of the search
addReleasable(resultConsumer::decRef);
addReleasable(resultConsumer);
this.clusters = clusters;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
package org.elasticsearch.action.search;

import org.elasticsearch.common.util.concurrent.AtomicArray;
import org.elasticsearch.core.AbstractRefCounted;
import org.elasticsearch.core.RefCounted;
import org.elasticsearch.core.Releasable;
import org.elasticsearch.search.SearchPhaseResult;
import org.elasticsearch.transport.LeakTracker;

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Stream;

/**
Expand All @@ -22,7 +22,13 @@
class ArraySearchPhaseResults<Result extends SearchPhaseResult> extends SearchPhaseResults<Result> {
final AtomicArray<Result> results;

private final RefCounted refCounted = LeakTracker.wrap(AbstractRefCounted.of(this::doClose));
private final AtomicBoolean closed = new AtomicBoolean(false);

private final Releasable releasable = LeakTracker.wrap(() -> {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed plans on this one. Ref-counting was not appropriate here. We want to have this tracked by the context to be release as a last-resort but we also clearly know when this can be released earlier. So I just made it closable with the double-close noop so we can close it wherever.

for (Result result : getAtomicArray().asList()) {
result.decRef();
}
});

ArraySearchPhaseResults(int size) {
super(size);
Expand All @@ -41,12 +47,16 @@ void consumeResult(Result result, Runnable next) {
next.run();
}

protected void doClose() {
for (Result result : getAtomicArray().asList()) {
result.decRef();
@Override
public final void close() {
if (closed.compareAndSet(false, true)) {
releasable.close();
doClose();
}
}

protected void doClose() {}

boolean hasResult(int shardIndex) {
return results.get(shardIndex) != null;
}
Expand All @@ -55,24 +65,4 @@ boolean hasResult(int shardIndex) {
AtomicArray<Result> getAtomicArray() {
return results;
}

@Override
public void incRef() {
refCounted.incRef();
}

@Override
public boolean tryIncRef() {
return refCounted.tryIncRef();
}

@Override
public boolean decRef() {
return refCounted.decRef();
}

@Override
public boolean hasReferences() {
return refCounted.hasReferences();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -482,24 +482,7 @@ Stream<CanMatchShardResponse> getSuccessfulResults() {
}

@Override
public void incRef() {

}

@Override
public boolean tryIncRef() {
return false;
}

@Override
public boolean decRef() {
return false;
}

@Override
public boolean hasReferences() {
return false;
}
public void close() {}
}

private GroupShardsIterator<SearchShardIterator> getIterator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,20 +104,5 @@ AtomicArray<SearchPhaseResult> getAtomicArray() {
}

@Override
public void incRef() {}

@Override
public boolean tryIncRef() {
return true;
}

@Override
public boolean decRef() {
return true;
}

@Override
public boolean hasReferences() {
return false;
}
public void close() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ final class CountedCollector<R extends SearchPhaseResult> {

CountedCollector(SearchPhaseResults<R> resultConsumer, int expectedOps, Runnable onFinish, SearchPhaseContext context) {
this.resultConsumer = resultConsumer;
resultConsumer.incRef();
this.counter = new CountDown(expectedOps);
this.onFinish = onFinish;
this.context = context;
Expand All @@ -38,11 +37,7 @@ final class CountedCollector<R extends SearchPhaseResult> {
void countDown() {
assert counter.isCountedDown() == false : "more operations executed than specified";
if (counter.countDown()) {
try {
onFinish.run();
} finally {
resultConsumer.decRef();
}
onFinish.run();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ final class DfsQueryPhase extends SearchPhase {

// register the release of the query consumer to free up the circuit breaker memory
// at the end of the search
context.addReleasable(queryResult::decRef);
context.addReleasable(queryResult);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ public void run() {
hit.setInnerHits(Maps.newMapWithExpectedSize(innerHitBuilders.size()));
}
hit.getInnerHits().put(innerHitBuilder.getName(), innerHits);
innerHits.mustIncRef();
}
}
onPhaseDone();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,16 @@ final class FetchSearchPhase extends SearchPhase {
private final AggregatedDfs aggregatedDfs;

FetchSearchPhase(SearchPhaseResults<SearchPhaseResult> resultConsumer, AggregatedDfs aggregatedDfs, SearchPhaseContext context) {
this(resultConsumer, aggregatedDfs, context, (response, queryPhaseResults) -> {
response.mustIncRef();
context.addReleasable(response::decRef);
return new ExpandSearchPhase(context, response.hits, () -> new FetchLookupFieldsPhase(context, response, queryPhaseResults));
});
this(
resultConsumer,
aggregatedDfs,
context,
(response, queryPhaseResults) -> new ExpandSearchPhase(
context,
response.hits,
() -> new FetchLookupFieldsPhase(context, response, queryPhaseResults)
)
);
Comment on lines +45 to +50
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, just so I understand correctly. ExpandSearchPhase doesn't do any incrementing or decrementing, except specifically for inner hits.

And by this point response is already part of the context.addReleasable

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes exactly :)

}

FetchSearchPhase(
Expand All @@ -61,7 +66,7 @@ final class FetchSearchPhase extends SearchPhase {
);
}
this.fetchResults = new ArraySearchPhaseResults<>(resultConsumer.getNumShards());
context.addReleasable(fetchResults::decRef);
context.addReleasable(fetchResults);
this.queryResults = resultConsumer.getAtomicArray();
this.aggregatedDfs = aggregatedDfs;
this.nextPhaseFactory = nextPhaseFactory;
Expand Down Expand Up @@ -225,10 +230,8 @@ private void moveToNextPhase(
AtomicArray<? extends SearchPhaseResult> fetchResultsArr
) {
var resp = SearchPhaseController.merge(context.getRequest().scroll() != null, reducedQueryPhase, fetchResultsArr);
try {
context.executeNextPhase(this, nextPhaseFactory.apply(resp, queryResults));
} finally {
resp.decRef();
}
context.addReleasable(resp::decRef);
fetchResults.close();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is weird to me, we add fetchResults to context.addReleasable in the FetchSearchPhase ctor, but then we call close on it here. So, are we just closing it early here and relying on the context for releasing in a failure scenario?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes exactly that was the plan.

context.executeNextPhase(this, nextPhaseFactory.apply(resp, queryResults));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,7 @@ public QueryPhaseResultConsumer(

@Override
protected void doClose() {
try {
super.doClose();
} finally {
pendingMerges.close();
}
pendingMerges.close();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice! I like the final close and doClose pattern. Saves cognitive overhead & keeps us safe.

}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ final class SearchDfsQueryThenFetchAsyncAction extends AbstractSearchAsyncAction
clusters
);
this.queryPhaseResultConsumer = queryPhaseResultConsumer;
addReleasable(queryPhaseResultConsumer::decRef);
addReleasable(queryPhaseResultConsumer);
this.progressListener = task.getProgressListener();
// don't build the SearchShard list (can be expensive) if the SearchProgressListener won't use it
if (progressListener != SearchProgressListener.NOOP) {
Expand All @@ -95,7 +95,6 @@ protected SearchPhase getNextPhase(final SearchPhaseResults<DfsSearchResult> res
final List<DfsSearchResult> dfsSearchResults = results.getAtomicArray().asList();
final AggregatedDfs aggregatedDfs = SearchPhaseController.aggregateDfs(dfsSearchResults);
final List<DfsKnnResults> mergedKnnResults = SearchPhaseController.mergeKnnResults(getRequest(), dfsSearchResults);
queryPhaseResultConsumer.incRef();
return new DfsQueryPhase(
dfsSearchResults,
aggregatedDfs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -364,11 +364,15 @@ public static SearchResponseSections merge(
}
ScoreDoc[] sortedDocs = reducedQueryPhase.sortedTopDocs.scoreDocs;
var fetchResults = fetchResultsArray.asList();
SearchHits hits = getHits(reducedQueryPhase, ignoreFrom, fetchResultsArray);
if (reducedQueryPhase.suggest != null && fetchResults.isEmpty() == false) {
mergeSuggest(reducedQueryPhase, fetchResultsArray, hits, sortedDocs);
final SearchHits hits = getHits(reducedQueryPhase, ignoreFrom, fetchResultsArray);
try {
if (reducedQueryPhase.suggest != null && fetchResults.isEmpty() == false) {
mergeSuggest(reducedQueryPhase, fetchResultsArray, hits, sortedDocs);
}
return reducedQueryPhase.buildResponse(hits, fetchResults);
} finally {
hits.decRef();
}
return reducedQueryPhase.buildResponse(hits, fetchResults);
}

private static void mergeSuggest(
Expand Down Expand Up @@ -462,6 +466,7 @@ private static SearchHits getHits(
searchHit.score(shardDoc.score);
}
hits.add(searchHit);
searchHit.incRef();
}
}
return new SearchHits(
Expand Down
Loading