Skip to content

Commit 424ef4f

Browse files
committed
SecurityIndexSearcherWrapper doesn't always carry over caches and similarity (#43436)
If DocumentLevelSecurity is enabled SecurityIndexSearcherWrapper doesn't carry over the cache, cache policy and similarity from the incoming searcher.
1 parent 059eb55 commit 424ef4f

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/accesscontrol/SecurityIndexSearcherWrapper.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ protected IndexSearcher wrap(IndexSearcher searcher) throws EngineException {
124124
// The reasons why we return a custom searcher:
125125
// 1) in the case the role query is sparse then large part of the main query can be skipped
126126
// 2) If the role query doesn't match with any docs in a segment, that a segment can be skipped
127-
IndexSearcher indexSearcher = new IndexSearcherWrapper((DocumentSubsetDirectoryReader) directoryReader);
128-
indexSearcher.setQueryCache(indexSearcher.getQueryCache());
129-
indexSearcher.setQueryCachingPolicy(indexSearcher.getQueryCachingPolicy());
130-
indexSearcher.setSimilarity(indexSearcher.getSimilarity());
131-
return indexSearcher;
127+
IndexSearcher searcherWrapper = new IndexSearcherWrapper((DocumentSubsetDirectoryReader) directoryReader);
128+
searcherWrapper.setQueryCache(searcher.getQueryCache());
129+
searcherWrapper.setQueryCachingPolicy(searcher.getQueryCachingPolicy());
130+
searcherWrapper.setSimilarity(searcher.getSimilarity());
131+
return searcherWrapper;
132132
}
133133
return searcher;
134134
}

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/security/authz/accesscontrol/SecurityIndexSearcherWrapperUnitTests.java

+16
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import org.apache.lucene.index.PostingsEnum;
2020
import org.apache.lucene.index.Term;
2121
import org.apache.lucene.index.TermsEnum;
22+
import org.apache.lucene.misc.SweetSpotSimilarity;
2223
import org.apache.lucene.search.BulkScorer;
2324
import org.apache.lucene.search.Explanation;
2425
import org.apache.lucene.search.IndexSearcher;
2526
import org.apache.lucene.search.LeafCollector;
2627
import org.apache.lucene.search.MatchAllDocsQuery;
2728
import org.apache.lucene.search.Query;
29+
import org.apache.lucene.search.QueryCachingPolicy;
2830
import org.apache.lucene.search.Scorer;
2931
import org.apache.lucene.search.TermQuery;
3032
import org.apache.lucene.search.Weight;
@@ -198,11 +200,25 @@ public void onRemoval(ShardId shardId, Accountable accountable) {
198200
});
199201
DirectoryReader directoryReader = DocumentSubsetReader.wrap(esIn, bitsetFilterCache, new MatchAllDocsQuery());
200202
IndexSearcher indexSearcher = new IndexSearcher(directoryReader);
203+
indexSearcher.setSimilarity(new SweetSpotSimilarity());
204+
indexSearcher.setQueryCachingPolicy(new QueryCachingPolicy() {
205+
@Override
206+
public void onUse(Query query) {
207+
}
208+
209+
@Override
210+
public boolean shouldCache(Query query) {
211+
return false;
212+
}
213+
});
214+
indexSearcher.setQueryCache((weight, policy) -> weight);
201215
securityIndexSearcherWrapper =
202216
new SecurityIndexSearcherWrapper(null, null, threadContext, licenseState, scriptService);
203217
IndexSearcher result = securityIndexSearcherWrapper.wrap(indexSearcher);
204218
assertThat(result, not(sameInstance(indexSearcher)));
205219
assertThat(result.getSimilarity(), sameInstance(indexSearcher.getSimilarity()));
220+
assertThat(result.getQueryCachingPolicy(), sameInstance(indexSearcher.getQueryCachingPolicy()));
221+
assertThat(result.getQueryCache(), sameInstance(indexSearcher.getQueryCache()));
206222
bitsetFilterCache.close();
207223
}
208224

0 commit comments

Comments
 (0)