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