@@ -563,6 +563,7 @@ public void testPurgeOnOpenSegment() throws Exception {
563563 int segmentSize = 200 ;
564564 long beginIndexOfOpenSegment = segmentSize * (endTerm - startTerm - 1 );
565565 long expectedIndex = segmentSize * (endTerm - startTerm - 1 );
566+ long purgePreservation = 0L ;
566567 purgeAndVerify (startTerm , endTerm , segmentSize , 1 , beginIndexOfOpenSegment , expectedIndex );
567568 }
568569
@@ -599,15 +600,36 @@ public void testPurgeOnClosedSegmentsWithPurgeGap() throws Exception {
599600 purgeAndVerify (startTerm , endTerm , segmentSize , 1000 , endIndexOfClosedSegment , expectedIndex );
600601 }
601602
603+ @ Test
604+ public void testPurgeWithLargePurgePreservationAndSmallPurgeGap () throws Exception {
605+ int startTerm = 0 ;
606+ int endTerm = 5 ;
607+ int segmentSize = 200 ;
608+ long endIndex = segmentSize * (endTerm - startTerm ) - 1 ;
609+ // start index is set so that the suggested index will not be negative, which will not trigger any purge
610+ long startIndex = 200 ;
611+ // purge preservation is larger than the total size of the log entries
612+ // which causes suggested index to be lower than the start index
613+ long purgePreservation = (segmentSize * (endTerm - startTerm )) + 100 ;
614+ // if the suggested index is lower than the start index due to the purge preservation, we should not purge anything
615+ purgeAndVerify (startTerm , endTerm , segmentSize , 1 , endIndex , startIndex , startIndex , purgePreservation );
616+ }
617+
602618 private void purgeAndVerify (int startTerm , int endTerm , int segmentSize , int purgeGap , long purgeIndex ,
603- long expectedIndex ) throws Exception {
604- List <SegmentRange > ranges = prepareRanges (startTerm , endTerm , segmentSize , 0 );
619+ long expectedIndex ) throws Exception {
620+ purgeAndVerify (startTerm , endTerm , segmentSize , purgeGap , purgeIndex , expectedIndex , 0 , 0 );
621+ }
622+
623+ private void purgeAndVerify (int startTerm , int endTerm , int segmentSize , int purgeGap , long purgeIndex ,
624+ long expectedIndex , long startIndex , long purgePreservation ) throws Exception {
625+ List <SegmentRange > ranges = prepareRanges (startTerm , endTerm , segmentSize , startIndex );
605626 List <LogEntryProto > entries = prepareLogEntries (ranges , null );
606627
607628 final RaftProperties p = new RaftProperties ();
608629 RaftServerConfigKeys .Log .setPurgeGap (p , purgeGap );
609- try (SegmentedRaftLog raftLog = newSegmentedRaftLog (storage , p )) {
610- raftLog .open (RaftLog .INVALID_LOG_INDEX , null );
630+ RaftServerConfigKeys .Log .setPurgePreservationLogNum (p , purgePreservation );
631+ try (SegmentedRaftLog raftLog = newSegmentedRaftLogWithSnapshotIndex (storage , p , () -> startIndex - 1 )) {
632+ raftLog .open (startIndex - 1 , null );
611633 entries .stream ().map (raftLog ::appendEntry ).forEach (CompletableFuture ::join );
612634 final CompletableFuture <Long > f = raftLog .purge (purgeIndex );
613635 final Long purged = f .get ();
0 commit comments