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.
This commit is contained in:
Simon Willnauer 2019-06-21 09:20:39 +02:00
parent 059eb55108
commit 424ef4f158
2 changed files with 21 additions and 5 deletions

View File

@ -124,11 +124,11 @@ public class SecurityIndexSearcherWrapper extends IndexSearcherWrapper {
// The reasons why we return a custom searcher:
// 1) in the case the role query is sparse then large part of the main query can be skipped
// 2) If the role query doesn't match with any docs in a segment, that a segment can be skipped
IndexSearcher indexSearcher = new IndexSearcherWrapper((DocumentSubsetDirectoryReader) directoryReader);
indexSearcher.setQueryCache(indexSearcher.getQueryCache());
indexSearcher.setQueryCachingPolicy(indexSearcher.getQueryCachingPolicy());
indexSearcher.setSimilarity(indexSearcher.getSimilarity());
return indexSearcher;
IndexSearcher searcherWrapper = new IndexSearcherWrapper((DocumentSubsetDirectoryReader) directoryReader);
searcherWrapper.setQueryCache(searcher.getQueryCache());
searcherWrapper.setQueryCachingPolicy(searcher.getQueryCachingPolicy());
searcherWrapper.setSimilarity(searcher.getSimilarity());
return searcherWrapper;
}
return searcher;
}

View File

@ -19,12 +19,14 @@ import org.apache.lucene.index.NoMergePolicy;
import org.apache.lucene.index.PostingsEnum;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.misc.SweetSpotSimilarity;
import org.apache.lucene.search.BulkScorer;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.LeafCollector;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryCachingPolicy;
import org.apache.lucene.search.Scorer;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.Weight;
@ -198,11 +200,25 @@ public class SecurityIndexSearcherWrapperUnitTests extends ESTestCase {
});
DirectoryReader directoryReader = DocumentSubsetReader.wrap(esIn, bitsetFilterCache, new MatchAllDocsQuery());
IndexSearcher indexSearcher = new IndexSearcher(directoryReader);
indexSearcher.setSimilarity(new SweetSpotSimilarity());
indexSearcher.setQueryCachingPolicy(new QueryCachingPolicy() {
@Override
public void onUse(Query query) {
}
@Override
public boolean shouldCache(Query query) {
return false;
}
});
indexSearcher.setQueryCache((weight, policy) -> weight);
securityIndexSearcherWrapper =
new SecurityIndexSearcherWrapper(null, null, threadContext, licenseState, scriptService);
IndexSearcher result = securityIndexSearcherWrapper.wrap(indexSearcher);
assertThat(result, not(sameInstance(indexSearcher)));
assertThat(result.getSimilarity(), sameInstance(indexSearcher.getSimilarity()));
assertThat(result.getQueryCachingPolicy(), sameInstance(indexSearcher.getQueryCachingPolicy()));
assertThat(result.getQueryCache(), sameInstance(indexSearcher.getQueryCache()));
bitsetFilterCache.close();
}