@@ -80,31 +80,21 @@ public synchronized List<String> syncSnapshot(IndexCommit commit) throws IOExcep
80
80
String segmentFileName ;
81
81
try (Lock writeLock = targetDirectory .obtainLock (IndexWriter .WRITE_LOCK_NAME );
82
82
StandardDirectoryReader reader = (StandardDirectoryReader ) DirectoryReader .open (commit )) {
83
- SegmentInfos segmentInfos = reader .getSegmentInfos ();
83
+ SegmentInfos segmentInfos = reader .getSegmentInfos ().clone ();
84
+ DirectoryReader wrappedReader = wrapReader (reader );
84
85
List <SegmentCommitInfo > newInfos = new ArrayList <>();
85
- for (LeafReaderContext ctx : reader .leaves ()) {
86
+ for (LeafReaderContext ctx : wrappedReader .leaves ()) {
86
87
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 );
103
93
}
104
94
}
105
95
segmentInfos .clear ();
106
96
segmentInfos .addAll (newInfos );
107
- segmentInfos .setNextWriteGeneration (Math .max (segmentInfos .getGeneration (), generation )+ 1 );
97
+ segmentInfos .setNextWriteGeneration (Math .max (segmentInfos .getGeneration (), generation ) + 1 );
108
98
String pendingSegmentFileName = IndexFileNames .fileNameFromGeneration (IndexFileNames .PENDING_SEGMENTS ,
109
99
"" , segmentInfos .getGeneration ());
110
100
try (IndexOutput segnOutput = targetDirectory .createOutput (pendingSegmentFileName , IOContext .DEFAULT )) {
@@ -206,9 +196,9 @@ private SegmentCommitInfo syncSegment(SegmentCommitInfo segmentCommitInfo, LiveD
206
196
newInfo = new SegmentCommitInfo (newSegmentInfo , 0 , 0 , -1 , -1 , -1 );
207
197
List <FieldInfo > fieldInfoCopy = new ArrayList <>(fieldInfos .size ());
208
198
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 ()));
212
202
}
213
203
FieldInfos newFieldInfos = new FieldInfos (fieldInfoCopy .toArray (new FieldInfo [0 ]));
214
204
codec .fieldInfosFormat ().write (trackingDir , newSegmentInfo , segmentSuffix , newFieldInfos , IOContext .DEFAULT );
@@ -249,7 +239,7 @@ private SegmentCommitInfo syncSegment(SegmentCommitInfo segmentCommitInfo, LiveD
249
239
250
240
private boolean assertLiveDocs (Bits liveDocs , int deletes ) {
251
241
int actualDeletes = 0 ;
252
- for (int i = 0 ; i < liveDocs .length (); i ++ ) {
242
+ for (int i = 0 ; i < liveDocs .length (); i ++) {
253
243
if (liveDocs .get (i ) == false ) {
254
244
actualDeletes ++;
255
245
}
@@ -267,51 +257,4 @@ private static class LiveDocs {
267
257
this .bits = bits ;
268
258
}
269
259
}
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
- }
317
260
}
0 commit comments