From 219db0c2d998966e1cecf560aac99d956ae8d8a8 Mon Sep 17 00:00:00 2001 From: MacRat Date: Sun, 27 Nov 2022 19:57:53 +0900 Subject: [PATCH] fix(store): make don't cause error even if log file removed --- internal/store/scanner.go | 23 +++++++++++++++++- internal/store/scanner_test.go | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/internal/store/scanner.go b/internal/store/scanner.go index 1f427b47..c15240ad 100644 --- a/internal/store/scanner.go +++ b/internal/store/scanner.go @@ -2,6 +2,7 @@ package store import ( "bufio" + "errors" "os" "sort" "time" @@ -133,11 +134,31 @@ func (r *inMemoryScanner) Record() api.Record { return r.records[r.index] } +type dummyScanner struct{} + +func (r dummyScanner) Close() error { + return nil +} + +func (r dummyScanner) Scan() bool { + return false +} + +func (r dummyScanner) Record() api.Record { + // This method never be called. + panic("This is a bug if you see this message.") +} + func (s *Store) OpenLog(since, until time.Time) (api.LogScanner, error) { if s.Path() == "" { return newInMemoryScanner(s, since, until), nil } interests := s.index.Search(since.Unix(), until.Unix()) - return newFileScanner(s.Path(), since, until, interests) + r, err := newFileScanner(s.Path(), since, until, interests) + if errors.Is(err, os.ErrNotExist) { + return dummyScanner{}, nil + } else { + return r, err + } } diff --git a/internal/store/scanner_test.go b/internal/store/scanner_test.go index 09decb16..e66881d6 100644 --- a/internal/store/scanner_test.go +++ b/internal/store/scanner_test.go @@ -2,12 +2,15 @@ package store_test import ( "io" + "os" + "path/filepath" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/macrat/ayd/internal/store" "github.com/macrat/ayd/internal/testutil" + api "github.com/macrat/ayd/lib-ayd" ) func TestStore_OpenLog(t *testing.T) { @@ -94,3 +97,44 @@ func TestStore_OpenLog(t *testing.T) { }) } } + +func TestStore_OpenLog_logRemoved(t *testing.T) { + p := filepath.Join(t.TempDir(), "ayd.log") + + s, err := store.New(p, io.Discard) + if err != nil { + t.Fatalf("failed to make store: %s", err) + } + defer s.Close() + + testCount := func(r api.LogScanner) { + t.Helper() + count := 0 + for r.Scan() { + count++ + } + if count != 0 { + t.Fatalf("unexpected number of records found: %d", count) + } + } + + baseTime := time.Now() + + if r, err := s.OpenLog(baseTime.Add(-1*time.Hour), baseTime.Add(1*time.Hour)); err != nil { + t.Fatalf("failed to open reader: %s", err) + } else { + testCount(r) + r.Close() + } + + if err := os.Remove(p); err != nil { + t.Fatalf("failed to remove test log file: %s", err) + } + + if r, err := s.OpenLog(baseTime.Add(-1*time.Hour), baseTime.Add(1*time.Hour)); err != nil { + t.Fatalf("failed to open reader: %s", err) + } else { + testCount(r) + r.Close() + } +}