Skip to content

Commit

Permalink
fix(store): make sure to follow log rotating
Browse files Browse the repository at this point in the history
  • Loading branch information
macrat committed Nov 26, 2022
1 parent e05a05b commit c5b601b
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 4 deletions.
12 changes: 8 additions & 4 deletions internal/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,19 +137,23 @@ func (s *Store) writer(ch <-chan api.Record, stopped chan struct{}) {
continue
}

stat, err := f.Stat()
s.handleError(err, "failed to get log file status")
beforeSize := stat.Size()

reader.Seek(0, io.SeekStart)
_, err = reader.WriteTo(f)
wroteSize, err := reader.WriteTo(f)
s.handleError(err, "failed to write log file")

err = f.Close()
s.handleError(err, "failed to close log file")

if s.index.AppendEntry(s.fileIndex, s.fileIndex+reader.Size(), r.Time.Unix()) == nil {
s.fileIndex += reader.Size()
} else {
if s.index.AppendEntry(beforeSize, beforeSize+wroteSize, r.Time.Unix()) == ErrLogUnmatch {
s.index.Reset()
s.fileIndex = reader.Size()
s.index.AppendEntry(0, s.fileIndex, r.Time.Unix())
} else {
s.fileIndex += reader.Size()
}
}

Expand Down
55 changes: 55 additions & 0 deletions internal/store/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,61 @@ func TestStore_Restore_limitBorder(t *testing.T) {
}
}

func TestStore_Restore_rotate(t *testing.T) {
t.Parallel()

f, err := os.CreateTemp("", "ayd-test-*")
if err != nil {
t.Fatalf("failed to create log file: %s", err)
}
defer os.Remove(f.Name())
defer f.Close()

s, err := store.New(f.Name(), io.Discard)
if err != nil {
t.Fatalf("failed to create store: %s", err)
}
defer s.Close()

s.SetIndexInterval(1)

baseTime := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)

for i := 0; i < 2; i++ {
since := baseTime.Add(time.Duration(i) * 10 * time.Minute)

err := os.Truncate(f.Name(), 0)
if err != nil {
t.Fatalf("%d: failed to truncate log file: %s", i, err)
}

s.Report(&api.URL{Scheme: "dummy"}, api.Record{
Time: since,
Target: &api.URL{Scheme: "dummy"},
Message: "hello world",
})
s.Report(&api.URL{Scheme: "dummy"}, api.Record{
Time: since.Add(1 * time.Minute),
Target: &api.URL{Scheme: "dummy"},
Message: "hello world",
})
time.Sleep(10 * time.Millisecond) // wait for writing goroutine

scanner, err := s.OpenLog(since.Add(-1*time.Minute), since.Add(5*time.Minute))
if err != nil {
t.Fatalf("failed to open log: %s", err)
}

var rs []api.Record
for scanner.Scan() {
rs = append(rs, scanner.Record())
}
if len(rs) != 2 {
t.Fatalf("unexpected number of records found:\n%#v", rs)
}
}
}

func TestStore_AddTarget(t *testing.T) {
s := testutil.NewStore(t)
defer s.Close()
Expand Down

0 comments on commit c5b601b

Please sign in to comment.