wal: add TestValidSnapshotEntriesAfterPurgeWal testcase
@@ -1052,3 +1052,60 @@ func TestValidSnapshotEntries(t *testing.T) {
t.Errorf("expected walSnaps %+v, got %+v", expected, walSnaps)
}
}
+
+// TestValidSnapshotEntriesAfterPurgeWal ensure that there are many wal files, and after cleaning the first wal file,
+// it can work well.
+func TestValidSnapshotEntriesAfterPurgeWal(t *testing.T) {
+ oldSegmentSizeBytes := SegmentSizeBytes
+ SegmentSizeBytes = 64
+ defer func() {
+ SegmentSizeBytes = oldSegmentSizeBytes
+ }()
+ p, err := ioutil.TempDir(os.TempDir(), "waltest")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(p)
+ snap0 := walpb.Snapshot{Index: 0, Term: 0}
+ snap1 := walpb.Snapshot{Index: 1, Term: 1}
+ state1 := raftpb.HardState{Commit: 1, Term: 1}
+ snap2 := walpb.Snapshot{Index: 2, Term: 1}
+ snap3 := walpb.Snapshot{Index: 3, Term: 2}
+ state2 := raftpb.HardState{Commit: 3, Term: 2}
+ func() {
+ w, err := Create(zap.NewExample(), p, nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer w.Close()
+
+ // snap0 is implicitly created at index 0, term 0
+ if err = w.SaveSnapshot(snap1); err != nil {
+ t.Fatal(err)
+ }
+ if err = w.Save(state1, nil); err != nil {
+ t.Fatal(err)
+ }
+ if err = w.SaveSnapshot(snap2); err != nil {
+ t.Fatal(err)
+ }
+ if err = w.SaveSnapshot(snap3); err != nil {
+ t.Fatal(err)
+ }
+ for i := 0; i < 128; i++ {
+ if err = w.Save(state2, nil); err != nil {
+ t.Fatal(err)
+ }
+ }
+
+ }()
+ files, _, err := selectWALFiles(nil, p, snap0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ os.Remove(p + "/" + files[0])
+ _, err = ValidSnapshotEntries(zap.NewExample(), p)
+ if err != nil {
+ t.Fatal(err)
+ }
+}
