|
21 | 21 | import org.apache.lucene.index.PointValues; |
22 | 22 | import org.apache.lucene.index.SegmentCommitInfo; |
23 | 23 | import org.apache.lucene.index.SegmentReader; |
| 24 | +import org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper; |
24 | 25 | import org.apache.lucene.index.SortedDocValues; |
25 | 26 | import org.apache.lucene.index.SortedNumericDocValues; |
26 | 27 | import org.apache.lucene.index.SortedSetDocValues; |
@@ -77,16 +78,19 @@ public FrozenEngine(EngineConfig config) { |
77 | 78 |
|
78 | 79 | boolean success = false; |
79 | 80 | Directory directory = store.directory(); |
80 | | - try (DirectoryReader reader = openDirectory(directory, config.getIndexSettings())) { |
81 | | - canMatchReader = ElasticsearchDirectoryReader.wrap(new RewriteCachingDirectoryReader(directory, reader.leaves()), |
82 | | - config.getShardId()); |
| 81 | + // Do not wrap soft-deletes reader when calculating segment stats as the wrapper might filter out fully deleted segments. |
| 82 | + try (DirectoryReader reader = openDirectory(directory, false)) { |
83 | 83 | // we record the segment stats here - that's what the reader needs when it's open and it give the user |
84 | 84 | // an idea of what it can save when it's closed |
85 | 85 | this.stats = new SegmentsStats(); |
86 | 86 | for (LeafReaderContext ctx : reader.getContext().leaves()) { |
87 | 87 | SegmentReader segmentReader = Lucene.segmentReader(ctx.reader()); |
88 | 88 | fillSegmentStats(segmentReader, true, stats); |
89 | 89 | } |
| 90 | + final DirectoryReader wrappedReader = config.getIndexSettings().isSoftDeleteEnabled() ? |
| 91 | + new SoftDeletesDirectoryReaderWrapper(reader, Lucene.SOFT_DELETES_FIELD) : reader; |
| 92 | + canMatchReader = ElasticsearchDirectoryReader.wrap( |
| 93 | + new RewriteCachingDirectoryReader(directory, wrappedReader.leaves()), config.getShardId()); |
90 | 94 | success = true; |
91 | 95 | } catch (IOException e) { |
92 | 96 | throw new UncheckedIOException(e); |
@@ -167,7 +171,8 @@ private synchronized ElasticsearchDirectoryReader getOrOpenReader() throws IOExc |
167 | 171 | for (ReferenceManager.RefreshListener listeners : config ().getInternalRefreshListener()) { |
168 | 172 | listeners.beforeRefresh(); |
169 | 173 | } |
170 | | - final DirectoryReader dirReader = openDirectory(engineConfig.getStore().directory(), engineConfig.getIndexSettings()); |
| 174 | + final DirectoryReader dirReader = openDirectory(engineConfig.getStore().directory(), |
| 175 | + engineConfig.getIndexSettings().isSoftDeleteEnabled()); |
171 | 176 | reader = lastOpenedReader = wrapReader(dirReader, Function.identity()); |
172 | 177 | processReader(reader); |
173 | 178 | reader.getReaderCacheHelper().addClosedListener(this::onReaderClosed); |
|
0 commit comments