Skip to content

Commit f527559

Browse files
committed
Cut over to unwrap segment reader
The fix in elastic#33757 introduces some workaround since FilterCodecReader didn't support unwrapping. This cuts over to a more elegant fix to access the readers segment infos.
1 parent c6e3231 commit f527559

File tree

2 files changed

+17
-70
lines changed

2 files changed

+17
-70
lines changed

server/src/main/java/org/elasticsearch/common/lucene/Lucene.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.lucene.document.NumericDocValuesField;
3131
import org.apache.lucene.index.CorruptIndexException;
3232
import org.apache.lucene.index.DirectoryReader;
33+
import org.apache.lucene.index.FilterCodecReader;
3334
import org.apache.lucene.index.FilterDirectoryReader;
3435
import org.apache.lucene.index.FilterLeafReader;
3536
import org.apache.lucene.index.IndexCommit;
@@ -726,6 +727,9 @@ public static SegmentReader segmentReader(LeafReader reader) {
726727
} else if (reader instanceof FilterLeafReader) {
727728
final FilterLeafReader fReader = (FilterLeafReader) reader;
728729
return segmentReader(FilterLeafReader.unwrap(fReader));
730+
} else if (reader instanceof FilterCodecReader) {
731+
final FilterCodecReader fReader = (FilterCodecReader) reader;
732+
return segmentReader(FilterCodecReader.unwrap(fReader));
729733
}
730734
// hard fail - we can't get a SegmentReader
731735
throw new IllegalStateException("Can not extract segment reader from given index reader [" + reader + "]");

x-pack/plugin/core/src/main/java/org/elasticsearch/snapshots/SourceOnlySnapshot.java

Lines changed: 13 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -81,31 +81,21 @@ public synchronized List<String> syncSnapshot(IndexCommit commit) throws IOExcep
8181
String segmentFileName;
8282
try (Lock writeLock = targetDirectory.obtainLock(IndexWriter.WRITE_LOCK_NAME);
8383
StandardDirectoryReader reader = (StandardDirectoryReader) DirectoryReader.open(commit)) {
84-
SegmentInfos segmentInfos = reader.getSegmentInfos();
84+
SegmentInfos segmentInfos = reader.getSegmentInfos().clone();
85+
DirectoryReader wrappedReader = wrapReader(reader);
8586
List<SegmentCommitInfo> newInfos = new ArrayList<>();
86-
for (LeafReaderContext ctx : reader.leaves()) {
87+
for (LeafReaderContext ctx : wrappedReader.leaves()) {
8788
LeafReader leafReader = ctx.reader();
88-
SegmentCommitInfo info = reader.getSegmentInfos().info(ctx.ord);
89-
assert info.info.equals(Lucene.segmentReader(ctx.reader()).getSegmentInfo().info);
90-
/* We could do this totally different without wrapping this dummy directory reader if FilterCodecReader would have a
91-
* getDelegate method. This is fixed in LUCENE-8502 but we need to wait for it to come in 7.5.1 or 7.6.
92-
* The reason here is that the ctx.ord is not guaranteed to be equivalent to the SegmentCommitInfo ord in the SegmentInfo
93-
* object since we might drop fully deleted segments. if that happens we are using the wrong reader for the SI and
94-
* might almost certainly expose deleted documents.
95-
*/
96-
DirectoryReader wrappedReader = wrapReader(new DummyDirectoryReader(reader.directory(), leafReader));
97-
if (wrappedReader.leaves().isEmpty() == false) {
98-
leafReader = wrappedReader.leaves().get(0).reader();
99-
LiveDocs liveDocs = getLiveDocs(leafReader);
100-
if (leafReader.numDocs() != 0) { // fully deleted segments don't need to be processed
101-
SegmentCommitInfo newInfo = syncSegment(info, liveDocs, leafReader.getFieldInfos(), existingSegments, createdFiles);
102-
newInfos.add(newInfo);
103-
}
89+
SegmentCommitInfo info = Lucene.segmentReader(leafReader).getSegmentInfo();
90+
LiveDocs liveDocs = getLiveDocs(leafReader);
91+
if (leafReader.numDocs() != 0) { // fully deleted segments don't need to be processed
92+
SegmentCommitInfo newInfo = syncSegment(info, liveDocs, leafReader.getFieldInfos(), existingSegments, createdFiles);
93+
newInfos.add(newInfo);
10494
}
10595
}
10696
segmentInfos.clear();
10797
segmentInfos.addAll(newInfos);
108-
segmentInfos.setNextWriteGeneration(Math.max(segmentInfos.getGeneration(), generation)+1);
98+
segmentInfos.setNextWriteGeneration(Math.max(segmentInfos.getGeneration(), generation) + 1);
10999
String pendingSegmentFileName = IndexFileNames.fileNameFromGeneration(IndexFileNames.PENDING_SEGMENTS,
110100
"", segmentInfos.getGeneration());
111101
try (IndexOutput segnOutput = targetDirectory.createOutput(pendingSegmentFileName, IOContext.DEFAULT)) {
@@ -207,9 +197,9 @@ private SegmentCommitInfo syncSegment(SegmentCommitInfo segmentCommitInfo, LiveD
207197
newInfo = new SegmentCommitInfo(newSegmentInfo, 0, 0, -1, -1, -1);
208198
List<FieldInfo> fieldInfoCopy = new ArrayList<>(fieldInfos.size());
209199
for (FieldInfo fieldInfo : fieldInfos) {
210-
fieldInfoCopy.add(new FieldInfo(fieldInfo.name, fieldInfo.number,
211-
false, false, false, IndexOptions.NONE, DocValuesType.NONE, -1, fieldInfo.attributes(), 0, 0,
212-
fieldInfo.isSoftDeletesField()));
200+
fieldInfoCopy.add(new FieldInfo(fieldInfo.name, fieldInfo.number,
201+
false, false, false, IndexOptions.NONE, DocValuesType.NONE, -1, fieldInfo.attributes(), 0, 0,
202+
fieldInfo.isSoftDeletesField()));
213203
}
214204
FieldInfos newFieldInfos = new FieldInfos(fieldInfoCopy.toArray(new FieldInfo[0]));
215205
codec.fieldInfosFormat().write(trackingDir, newSegmentInfo, segmentSuffix, newFieldInfos, IOContext.DEFAULT);
@@ -250,7 +240,7 @@ private SegmentCommitInfo syncSegment(SegmentCommitInfo segmentCommitInfo, LiveD
250240

251241
private boolean assertLiveDocs(Bits liveDocs, int deletes) {
252242
int actualDeletes = 0;
253-
for (int i = 0; i < liveDocs.length(); i++ ) {
243+
for (int i = 0; i < liveDocs.length(); i++) {
254244
if (liveDocs.get(i) == false) {
255245
actualDeletes++;
256246
}
@@ -268,51 +258,4 @@ private static class LiveDocs {
268258
this.bits = bits;
269259
}
270260
}
271-
272-
private static class DummyDirectoryReader extends DirectoryReader {
273-
274-
protected DummyDirectoryReader(Directory directory, LeafReader... segmentReaders) throws IOException {
275-
super(directory, segmentReaders);
276-
}
277-
278-
@Override
279-
protected DirectoryReader doOpenIfChanged() throws IOException {
280-
return null;
281-
}
282-
283-
@Override
284-
protected DirectoryReader doOpenIfChanged(IndexCommit commit) throws IOException {
285-
return null;
286-
}
287-
288-
@Override
289-
protected DirectoryReader doOpenIfChanged(IndexWriter writer, boolean applyAllDeletes) throws IOException {
290-
return null;
291-
}
292-
293-
@Override
294-
public long getVersion() {
295-
return 0;
296-
}
297-
298-
@Override
299-
public boolean isCurrent() throws IOException {
300-
return false;
301-
}
302-
303-
@Override
304-
public IndexCommit getIndexCommit() throws IOException {
305-
return null;
306-
}
307-
308-
@Override
309-
protected void doClose() throws IOException {
310-
311-
}
312-
313-
@Override
314-
public CacheHelper getReaderCacheHelper() {
315-
return null;
316-
}
317-
}
318261
}

0 commit comments

Comments
 (0)