diff --git a/db/wal/compacting_scanner.go b/db/wal/compacting_scanner.go index 1f579be7..0a0311a9 100644 --- a/db/wal/compacting_scanner.go +++ b/db/wal/compacting_scanner.go @@ -85,7 +85,7 @@ func (c *CompactingScanner) Next() (*Frame, error) { Data: make([]byte, c.header.PageSize), } - if _, err := c.readSeeker.Seek(c.frames[c.cIdx].Offset, io.SeekStart); err != nil { + if _, err := c.readSeeker.Seek(c.frames[c.cIdx].Offset+WALFrameHeaderSize, io.SeekStart); err != nil { return nil, err } if _, err := io.ReadFull(c.readSeeker, frame.Data); err != nil { diff --git a/db/wal/compacting_scanner_test.go b/db/wal/compacting_scanner_test.go new file mode 100644 index 00000000..531bcce9 --- /dev/null +++ b/db/wal/compacting_scanner_test.go @@ -0,0 +1,53 @@ +package wal + +import ( + "bytes" + "io" + "os" + "testing" +) + +func Test_CompactingScanner_Scan(t *testing.T) { + b, err := os.ReadFile("testdata/wal-reader/ok/wal") + if err != nil { + t.Fatal(err) + } + + s, err := NewCompactingScanner(bytes.NewReader(b)) + if err != nil { + t.Fatal(err) + } + + for i, expF := range []struct { + pgno uint32 + commit uint32 + dataLowIdx int + dataHighIdx int + }{ + {1, 0, 56, 4152}, + //{2, 2, 4176, 8272}, // This frame is skipped. + {2, 2, 8296, 12392}, + } { + f, err := s.Next() + if err != nil { + t.Fatal(err) + } + if f.Pgno != expF.pgno { + t.Fatalf("expected pgno %d, got %d", expF.pgno, f.Pgno) + } + if f.Commit != expF.commit { + t.Fatalf("expected commit %d, got %d", expF.commit, f.Commit) + } + if len(f.Data) != 4096 { + t.Fatalf("expected data length 4096, got %d", len(f.Data)) + } + if !bytes.Equal(f.Data, b[expF.dataLowIdx:expF.dataHighIdx]) { + t.Fatalf("page data mismatch on test %d", i) + } + } + + _, err = s.Next() + if err != io.EOF { + t.Fatalf("expected EOF, got %v", err) + } +}