@@ -264,7 +264,7 @@ public void testVersionMapAfterAutoIDDocument() throws IOException {
264
264
}
265
265
}
266
266
267
- public void testSegments () throws Exception {
267
+ public void testSegmentsWithoutSoftDeletes () throws Exception {
268
268
Settings settings = Settings .builder ()
269
269
.put (defaultSettings .getSettings ())
270
270
.put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), false ).build ();
@@ -594,6 +594,68 @@ public void testSegmentsStatsIncludingFileSizes() throws Exception {
594
594
}
595
595
}
596
596
597
+ public void testSegmentsWithSoftDeletes () throws Exception {
598
+ Settings .Builder settings = Settings .builder ()
599
+ .put (defaultSettings .getSettings ())
600
+ .put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), true );
601
+ final IndexMetaData indexMetaData = IndexMetaData .builder (defaultSettings .getIndexMetaData ()).settings (settings ).build ();
602
+ final IndexSettings indexSettings = IndexSettingsModule .newIndexSettings (indexMetaData );
603
+ final AtomicLong globalCheckpoint = new AtomicLong (SequenceNumbers .NO_OPS_PERFORMED );
604
+ try (Store store = createStore ();
605
+ InternalEngine engine = createEngine (config (indexSettings , store , createTempDir (), NoMergePolicy .INSTANCE , null ,
606
+ null , globalCheckpoint ::get ))) {
607
+ assertThat (engine .segments (false ), empty ());
608
+ int numDocsFirstSegment = randomIntBetween (5 , 50 );
609
+ Set <String > liveDocsFirstSegment = new HashSet <>();
610
+ for (int i = 0 ; i < numDocsFirstSegment ; i ++) {
611
+ String id = Integer .toString (i );
612
+ ParsedDocument doc = testParsedDocument (id , null , testDocument (), B_1 , null );
613
+ engine .index (indexForDoc (doc ));
614
+ liveDocsFirstSegment .add (id );
615
+ }
616
+ engine .refresh ("test" );
617
+ List <Segment > segments = engine .segments (randomBoolean ());
618
+ assertThat (segments , hasSize (1 ));
619
+ assertThat (segments .get (0 ).getNumDocs (), equalTo (liveDocsFirstSegment .size ()));
620
+ assertThat (segments .get (0 ).getDeletedDocs (), equalTo (0 ));
621
+ assertFalse (segments .get (0 ).committed );
622
+ int deletes = 0 ;
623
+ int updates = 0 ;
624
+ int appends = 0 ;
625
+ int iterations = scaledRandomIntBetween (1 , 50 );
626
+ for (int i = 0 ; i < iterations && liveDocsFirstSegment .isEmpty () == false ; i ++) {
627
+ String idToUpdate = randomFrom (liveDocsFirstSegment );
628
+ liveDocsFirstSegment .remove (idToUpdate );
629
+ ParsedDocument doc = testParsedDocument (idToUpdate , null , testDocument (), B_1 , null );
630
+ if (randomBoolean ()) {
631
+ engine .delete (new Engine .Delete (doc .type (), doc .id (), newUid (doc ), primaryTerm .get ()));
632
+ deletes ++;
633
+ } else {
634
+ engine .index (indexForDoc (doc ));
635
+ updates ++;
636
+ }
637
+ if (randomBoolean ()) {
638
+ engine .index (indexForDoc (testParsedDocument (UUIDs .randomBase64UUID (), null , testDocument (), B_1 , null )));
639
+ appends ++;
640
+ }
641
+ }
642
+ boolean committed = randomBoolean ();
643
+ if (committed ) {
644
+ engine .flush ();
645
+ }
646
+ engine .refresh ("test" );
647
+ segments = engine .segments (randomBoolean ());
648
+ assertThat (segments , hasSize (2 ));
649
+ assertThat (segments .get (0 ).getNumDocs (), equalTo (liveDocsFirstSegment .size ()));
650
+ assertThat (segments .get (0 ).getDeletedDocs (), equalTo (updates + deletes ));
651
+ assertThat (segments .get (0 ).committed , equalTo (committed ));
652
+
653
+ assertThat (segments .get (1 ).getNumDocs (), equalTo (updates + appends ));
654
+ assertThat (segments .get (1 ).getDeletedDocs (), equalTo (deletes )); // delete tombstones
655
+ assertThat (segments .get (1 ).committed , equalTo (committed ));
656
+ }
657
+ }
658
+
597
659
public void testCommitStats () throws IOException {
598
660
final AtomicLong maxSeqNo = new AtomicLong (SequenceNumbers .NO_OPS_PERFORMED );
599
661
final AtomicLong localCheckpoint = new AtomicLong (SequenceNumbers .NO_OPS_PERFORMED );
0 commit comments