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