@@ -566,6 +566,7 @@ public void testPurgeOnOpenSegment() throws Exception {
566566 int segmentSize = 200 ;
567567 long beginIndexOfOpenSegment = segmentSize * (endTerm - startTerm - 1 );
568568 long expectedIndex = segmentSize * (endTerm - startTerm - 1 );
569+ long purgePreservation = 0L ;
569570 purgeAndVerify (startTerm , endTerm , segmentSize , 1 , beginIndexOfOpenSegment , expectedIndex );
570571 }
571572
@@ -602,15 +603,36 @@ public void testPurgeOnClosedSegmentsWithPurgeGap() throws Exception {
602603 purgeAndVerify (startTerm , endTerm , segmentSize , 1000 , endIndexOfClosedSegment , expectedIndex );
603604 }
604605
606+ @ Test
607+ public void testPurgeWithLargePurgePreservationAndSmallPurgeGap () throws Exception {
608+ int startTerm = 0 ;
609+ int endTerm = 5 ;
610+ int segmentSize = 200 ;
611+ long endIndex = segmentSize * (endTerm - startTerm ) - 1 ;
612+ // start index is set so that the suggested index will not be negative, which will not trigger any purge
613+ long startIndex = 200 ;
614+ // purge preservation is larger than the total size of the log entries
615+ // which causes suggested index to be lower than the start index
616+ long purgePreservation = (segmentSize * (endTerm - startTerm )) + 100 ;
617+ // if the suggested index is lower than the start index due to the purge preservation, we should not purge anything
618+ purgeAndVerify (startTerm , endTerm , segmentSize , 1 , endIndex , startIndex , startIndex , purgePreservation );
619+ }
620+
605621 private void purgeAndVerify (int startTerm , int endTerm , int segmentSize , int purgeGap , long purgeIndex ,
606- long expectedIndex ) throws Exception {
607- List <SegmentRange > ranges = prepareRanges (startTerm , endTerm , segmentSize , 0 );
622+ long expectedIndex ) throws Exception {
623+ purgeAndVerify (startTerm , endTerm , segmentSize , purgeGap , purgeIndex , expectedIndex , 0 , 0 );
624+ }
625+
626+ private void purgeAndVerify (int startTerm , int endTerm , int segmentSize , int purgeGap , long purgeIndex ,
627+ long expectedIndex , long startIndex , long purgePreservation ) throws Exception {
628+ List <SegmentRange > ranges = prepareRanges (startTerm , endTerm , segmentSize , startIndex );
608629 List <LogEntryProto > entries = prepareLogEntries (ranges , null );
609630
610631 final RaftProperties p = new RaftProperties ();
611632 RaftServerConfigKeys .Log .setPurgeGap (p , purgeGap );
612- try (SegmentedRaftLog raftLog = newSegmentedRaftLog (storage , p )) {
613- raftLog .open (RaftLog .INVALID_LOG_INDEX , null );
633+ RaftServerConfigKeys .Log .setPurgePreservationLogNum (p , purgePreservation );
634+ try (SegmentedRaftLog raftLog = newSegmentedRaftLogWithSnapshotIndex (storage , p , () -> startIndex - 1 )) {
635+ raftLog .open (startIndex - 1 , null );
614636 entries .stream ().map (raftLog ::appendEntry ).forEach (CompletableFuture ::join );
615637 final CompletableFuture <Long > f = raftLog .purge (purgeIndex );
616638 final Long purged = f .get ();
0 commit comments