package wal import ( "math/rand" "sync" "testing" "time" ) func TestDeleteBefore(t *testing.T) { t.Parallel() firstSeqNum := rand.Int63n(9288389) tmpDir := t.TempDir() wal, err := Create(tmpDir, firstSeqNum, Config{ SegMinCount: 10, SegMaxAgeSec: 1, }) if err != nil { t.Fatal(err) } defer wal.Close() wg := sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() err := writeRandomWithEOF(wal, 8*time.Second) if err != nil { panic(err) } }() wg.Wait() info := wal.Info() if info.FirstSeqNum != firstSeqNum { t.Fatal(info) } lastSeqNum := info.LastSeqNum lastTimestampMS := info.LastTimestampMS err = wal.DeleteBefore((info.LastTimestampMS/1000)-4, lastSeqNum+100) if err != nil { t.Fatal(err) } info = wal.Info() if info.FirstSeqNum == firstSeqNum || info.LastSeqNum != lastSeqNum || info.LastTimestampMS != lastTimestampMS { t.Fatal(info) } header := wal.header if header.FirstSegmentID >= header.LastSegmentID { t.Fatal(header) } } func TestDeleteBeforeOnlyOneSegment(t *testing.T) { t.Parallel() firstSeqNum := rand.Int63n(9288389) tmpDir := t.TempDir() wal, err := Create(tmpDir, firstSeqNum, Config{ SegMinCount: 10, SegMaxAgeSec: 10, }) if err != nil { t.Fatal(err) } defer wal.Close() if err := writeRandomWithEOF(wal, time.Second); err != nil { t.Fatal(err) } header := wal.header if header.FirstSegmentID != header.LastSegmentID { t.Fatal(header) } lastSeqNum := wal.Info().LastSeqNum err = wal.DeleteBefore(time.Now().Unix()+1, lastSeqNum+100) if err != nil { t.Fatal(err) } header = wal.header if header.FirstSegmentID != header.LastSegmentID { t.Fatal(header) } }