From 93717305094cca7bee7348bc48f723bcd986efd6 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Wed, 4 Aug 2021 16:54:55 +0200 Subject: [PATCH 1/2] Ensure FrozenEngine always applies engine-level wrapper --- .../org/elasticsearch/index/engine/ReadOnlyEngine.java | 7 ++++--- .../elasticsearch/index/engine/frozen/FrozenEngine.java | 2 +- .../AbstractSearchableSnapshotsRestTestCase.java | 9 ++++++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/index/engine/ReadOnlyEngine.java b/server/src/main/java/org/elasticsearch/index/engine/ReadOnlyEngine.java index 54c10dbef9449..dd1a38fc341e6 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/ReadOnlyEngine.java +++ b/server/src/main/java/org/elasticsearch/index/engine/ReadOnlyEngine.java @@ -76,6 +76,7 @@ public class ReadOnlyEngine extends Engine { protected volatile TranslogStats translogStats; private final String commitId; + private final Function readerWrapperFunction; /** * Creates a new ReadOnlyEngine. This ctor can also be used to open a read-only engine on top of an already opened @@ -116,7 +117,8 @@ public ReadOnlyEngine(EngineConfig config, SeqNoStats seqNoStats, TranslogStats this.seqNoStats = seqNoStats; this.indexCommit = Lucene.getIndexCommit(lastCommittedSegmentInfos, directory); this.lazilyLoadSoftDeletes = lazilyLoadSoftDeletes; - reader = wrapReader(open(indexCommit), readerWrapperFunction); + this.readerWrapperFunction = readerWrapperFunction; + reader = wrapReader(open(indexCommit)); readerManager = new ElasticsearchReaderManager(reader); assert translogStats != null || obtainLock : "mutiple translogs instances should not be opened at the same time"; this.translogStats = translogStats != null ? translogStats : translogStats(config, lastCommittedSegmentInfos); @@ -192,8 +194,7 @@ public void verifyEngineBeforeIndexClosing() throws IllegalStateException { // reopened as an internal engine, which would be the path to fix the issue. } - protected final ElasticsearchDirectoryReader wrapReader(DirectoryReader reader, - Function readerWrapperFunction) throws IOException { + protected final ElasticsearchDirectoryReader wrapReader(DirectoryReader reader) throws IOException { reader = readerWrapperFunction.apply(reader); return ElasticsearchDirectoryReader.wrap(reader, engineConfig.getShardId()); } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/index/engine/frozen/FrozenEngine.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/index/engine/frozen/FrozenEngine.java index 0402b39f1451b..c2fe9a9f403da 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/index/engine/frozen/FrozenEngine.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/index/engine/frozen/FrozenEngine.java @@ -161,7 +161,7 @@ private synchronized ElasticsearchDirectoryReader getOrOpenReader() throws IOExc listeners.beforeRefresh(); } final DirectoryReader dirReader = openDirectory(engineConfig.getStore().directory()); - reader = lastOpenedReader = wrapReader(dirReader, Function.identity()); + reader = lastOpenedReader = wrapReader(dirReader); reader.getReaderCacheHelper().addClosedListener(this::onReaderClosed); for (ReferenceManager.RefreshListener listeners : config().getInternalRefreshListener()) { listeners.afterRefresh(true); diff --git a/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java b/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java index 8f0d0aeb767b2..485c4134c5569 100644 --- a/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java +++ b/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java @@ -21,10 +21,12 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.support.XContentMapValues; +import org.elasticsearch.index.mapper.SeqNoFieldMapper; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.test.rest.ESRestTestCase; import java.io.IOException; @@ -468,7 +470,12 @@ protected static Number count(String index) throws IOException { protected static Map search(String index, QueryBuilder query, Boolean ignoreThrottled) throws IOException { final Request request = new Request(HttpPost.METHOD_NAME, '/' + index + "/_search"); - request.setJsonEntity(new SearchSourceBuilder().trackTotalHits(true).query(query).toString()); + final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true).query(query); + if (true) { + // ensures we can always access sequence numbers, even on source-only mounted snapshots + searchSourceBuilder.sort(SeqNoFieldMapper.NAME, SortOrder.ASC); + } + request.setJsonEntity(searchSourceBuilder.toString()); if (ignoreThrottled != null) { request.addParameter("ignore_throttled", ignoreThrottled.toString()); } From 91147571b444a05ead428ea7b969548e2f9ea3c4 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Wed, 4 Aug 2021 18:27:03 +0200 Subject: [PATCH 2/2] doh --- .../AbstractSearchableSnapshotsRestTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java b/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java index 485c4134c5569..eefe851139875 100644 --- a/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java +++ b/x-pack/plugin/searchable-snapshots/src/test/java/org/elasticsearch/xpack/searchablesnapshots/AbstractSearchableSnapshotsRestTestCase.java @@ -471,7 +471,7 @@ protected static Number count(String index) throws IOException { protected static Map search(String index, QueryBuilder query, Boolean ignoreThrottled) throws IOException { final Request request = new Request(HttpPost.METHOD_NAME, '/' + index + "/_search"); final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().trackTotalHits(true).query(query); - if (true) { + if (randomBoolean()) { // ensures we can always access sequence numbers, even on source-only mounted snapshots searchSourceBuilder.sort(SeqNoFieldMapper.NAME, SortOrder.ASC); }