Skip to content

Commit dadc717

Browse files
committed
Cut over to unwrap segment reader (#33843)
The fix in #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 4c6cb3c commit dadc717

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;
@@ -668,6 +669,9 @@ public static SegmentReader segmentReader(LeafReader reader) {
668669
} else if (reader instanceof FilterLeafReader) {
669670
final FilterLeafReader fReader = (FilterLeafReader) reader;
670671
return segmentReader(FilterLeafReader.unwrap(fReader));
672+
} else if (reader instanceof FilterCodecReader) {
673+
final FilterCodecReader fReader = (FilterCodecReader) reader;
674+
return segmentReader(FilterCodecReader.unwrap(fReader));
671675
}
672676
// hard fail - we can't get a SegmentReader
673677
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
@@ -80,31 +80,21 @@ public synchronized List<String> syncSnapshot(IndexCommit commit) throws IOExcep
8080
String segmentFileName;
8181
try (Lock writeLock = targetDirectory.obtainLock(IndexWriter.WRITE_LOCK_NAME);
8282
StandardDirectoryReader reader = (StandardDirectoryReader) DirectoryReader.open(commit)) {
83-
SegmentInfos segmentInfos = reader.getSegmentInfos();
83+
SegmentInfos segmentInfos = reader.getSegmentInfos().clone();
84+
DirectoryReader wrappedReader = wrapReader(reader);
8485
List<SegmentCommitInfo> newInfos = new ArrayList<>();
85-
for (LeafReaderContext ctx : reader.leaves()) {
86+
for (LeafReaderContext ctx : wrappedReader.leaves()) {
8687
LeafReader leafReader = ctx.reader();
87-
SegmentCommitInfo info = reader.getSegmentInfos().info(ctx.ord);
88-
assert info.info.equals(Lucene.segmentReader(ctx.reader()).getSegmentInfo().info);
89-
/* We could do this totally different without wrapping this dummy directory reader if FilterCodecReader would have a
90-
* getDelegate method. This is fixed in LUCENE-8502 but we need to wait for it to come in 7.5.1 or 7.6.
91-
* The reason here is that the ctx.ord is not guaranteed to be equivalent to the SegmentCommitInfo ord in the SegmentInfo
92-
* object since we might drop fully deleted segments. if that happens we are using the wrong reader for the SI and
93-
* might almost certainly expose deleted documents.
94-
*/
95-
DirectoryReader wrappedReader = wrapReader(new DummyDirectoryReader(reader.directory(), leafReader));
96-
if (wrappedReader.leaves().isEmpty() == false) {
97-
leafReader = wrappedReader.leaves().get(0).reader();
98-
LiveDocs liveDocs = getLiveDocs(leafReader);
99-
if (leafReader.numDocs() != 0) { // fully deleted segments don't need to be processed
100-
SegmentCommitInfo newInfo = syncSegment(info, liveDocs, leafReader.getFieldInfos(), existingSegments, createdFiles);
101-
newInfos.add(newInfo);
102-
}
88+
SegmentCommitInfo info = Lucene.segmentReader(leafReader).getSegmentInfo();
89+
LiveDocs liveDocs = getLiveDocs(leafReader);
90+
if (leafReader.numDocs() != 0) { // fully deleted segments don't need to be processed
91+
SegmentCommitInfo newInfo = syncSegment(info, liveDocs, leafReader.getFieldInfos(), existingSegments, createdFiles);
92+
newInfos.add(newInfo);
10393
}
10494
}
10595
segmentInfos.clear();
10696
segmentInfos.addAll(newInfos);
107-
segmentInfos.setNextWriteGeneration(Math.max(segmentInfos.getGeneration(), generation)+1);
97+
segmentInfos.setNextWriteGeneration(Math.max(segmentInfos.getGeneration(), generation) + 1);
10898
String pendingSegmentFileName = IndexFileNames.fileNameFromGeneration(IndexFileNames.PENDING_SEGMENTS,
10999
"", segmentInfos.getGeneration());
110100
try (IndexOutput segnOutput = targetDirectory.createOutput(pendingSegmentFileName, IOContext.DEFAULT)) {
@@ -206,9 +196,9 @@ private SegmentCommitInfo syncSegment(SegmentCommitInfo segmentCommitInfo, LiveD
206196
newInfo = new SegmentCommitInfo(newSegmentInfo, 0, 0, -1, -1, -1);
207197
List<FieldInfo> fieldInfoCopy = new ArrayList<>(fieldInfos.size());
208198
for (FieldInfo fieldInfo : fieldInfos) {
209-
fieldInfoCopy.add(new FieldInfo(fieldInfo.name, fieldInfo.number,
210-
false, false, false, IndexOptions.NONE, DocValuesType.NONE, -1, fieldInfo.attributes(), 0, 0,
211-
fieldInfo.isSoftDeletesField()));
199+
fieldInfoCopy.add(new FieldInfo(fieldInfo.name, fieldInfo.number,
200+
false, false, false, IndexOptions.NONE, DocValuesType.NONE, -1, fieldInfo.attributes(), 0, 0,
201+
fieldInfo.isSoftDeletesField()));
212202
}
213203
FieldInfos newFieldInfos = new FieldInfos(fieldInfoCopy.toArray(new FieldInfo[0]));
214204
codec.fieldInfosFormat().write(trackingDir, newSegmentInfo, segmentSuffix, newFieldInfos, IOContext.DEFAULT);
@@ -249,7 +239,7 @@ private SegmentCommitInfo syncSegment(SegmentCommitInfo segmentCommitInfo, LiveD
249239

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

0 commit comments

Comments
 (0)