@@ -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