diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-11-07 20:57:05 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2018-11-07 20:57:05 +0100 |
commit | 004eb5d715f84aa304541042a44983c2d5fe97ac (patch) | |
tree | 0b0c0f57b5e90e0c9f01aab6893d6ef9e6c5bf4a | |
parent | 73651e2c82c0192d004221fdf1b615909a6b1eea (diff) |
Simplify cache pruning
-rw-r--r-- | rar/rar.go | 41 | ||||
-rw-r--r-- | rar/rar_test.go | 48 | ||||
-rw-r--r-- | watcher/watcher.go | 2 |
3 files changed, 26 insertions, 65 deletions
@@ -10,7 +10,6 @@ import ( "strings" "sync" "text/template" - "time" "github.com/mpolden/sfv" "github.com/nwaples/rardecode" @@ -134,11 +133,12 @@ func unpack(filename string) error { return nil } -func remove(sfv *sfv.SFV) error { +func (h *Handler) remove(sfv *sfv.SFV) error { for _, c := range sfv.Checksums { if err := os.Remove(c.Path); err != nil { return err } + delete(h.cache, c.Path) } return os.Remove(sfv.Path) } @@ -177,28 +177,7 @@ func runCmd(command string, e event) error { return nil } -func NewHandler() *Handler { return NewHandlerWithInterval(time.Minute) } - -func NewHandlerWithInterval(d time.Duration) *Handler { - h := &Handler{ - cache: make(map[string]bool), - done: make(chan bool), - } - ticker := time.NewTicker(d) - go func() { - for { - select { - case <-h.done: - ticker.Stop() - return - case <-ticker.C: - h.pruneCache() - } - } - - }() - return h -} +func NewHandler() *Handler { return &Handler{cache: make(map[string]bool)} } func (h *Handler) verify(sfv *sfv.SFV) (int, int, error) { passed := 0 @@ -219,18 +198,6 @@ func (h *Handler) verify(sfv *sfv.SFV) (int, int, error) { return passed, len(sfv.Checksums), nil } -func (h *Handler) pruneCache() { - h.mu.Lock() - defer h.mu.Unlock() - for path := range h.cache { - if _, err := os.Stat(path); os.IsNotExist(err) { - delete(h.cache, path) - } - } -} - -func (h *Handler) Stop() { h.done <- true } - func (h *Handler) Handle(name, postCommand string, removeRARs bool) error { h.mu.Lock() defer h.mu.Unlock() @@ -249,7 +216,7 @@ func (h *Handler) Handle(name, postCommand string, removeRARs bool) error { return errors.Wrapf(err, "unpacking failed: %s", ev.Dir) } if removeRARs { - if err := remove(ev.sfv); err != nil { + if err := h.remove(ev.sfv); err != nil { return errors.Wrapf(err, "removal failed: %s", ev.Dir) } } diff --git a/rar/rar_test.go b/rar/rar_test.go index bfc863f..d273f27 100644 --- a/rar/rar_test.go +++ b/rar/rar_test.go @@ -17,7 +17,7 @@ func symlink(t *testing.T, oldname, newname string) { } } -func testdataDir(t *testing.T) string { +func testDir(t *testing.T) string { wd, err := os.Getwd() if err != nil { t.Fatal(err) @@ -103,7 +103,7 @@ func TestFindFirstRAR(t *testing.T) { } func TestHandle(t *testing.T) { - td := testdataDir(t) + td := testDir(t) var tests = []struct { file string @@ -145,12 +145,6 @@ func TestHandle(t *testing.T) { } func TestHandleIncomplete(t *testing.T) { - var ( - td = testdataDir(t) - realRAR1 = filepath.Join(td, "test.rar") - realRAR2 = filepath.Join(td, "test.r00") - realSFV = filepath.Join(td, "test.sfv") - ) tempdir, err := ioutil.TempDir("", "unp") if err != nil { t.Fatal(err) @@ -158,36 +152,38 @@ func TestHandleIncomplete(t *testing.T) { defer os.RemoveAll(tempdir) var ( - sfv = filepath.Join(tempdir, "test.sfv") - rar1 = filepath.Join(tempdir, "test.rar") - rar2 = filepath.Join(tempdir, "test.r00") + td = testDir(t) + realRAR1 = filepath.Join(td, "test.rar") + realRAR2 = filepath.Join(td, "test.r00") + realRAR3 = filepath.Join(td, "test.r01") + realSFV = filepath.Join(td, "test.sfv") + rar1 = filepath.Join(tempdir, filepath.Base(realRAR1)) + rar2 = filepath.Join(tempdir, filepath.Base(realRAR2)) + rar3 = filepath.Join(tempdir, filepath.Base(realRAR3)) + sfv = filepath.Join(tempdir, filepath.Base(realSFV)) ) symlink(t, realSFV, sfv) symlink(t, realRAR1, rar1) symlink(t, realRAR2, rar2) - h := NewHandlerWithInterval(time.Hour) - defer h.Stop() - want := "incomplete: " + tempdir + ": 2/3 files" - if err := h.Handle(rar1, "", false); err.Error() != want { - t.Errorf("want err = %q, got %q", want, err.Error()) - } + h := NewHandler() - // Removing a file keeps the cached checksum - if err := os.Remove(rar1); err != nil { - t.Fatal(err) - } - if err := h.Handle(rar1, "", false); err.Error() != want { + // Verified checksums are cached while RAR set is incomplete + want := "incomplete: " + tempdir + ": 2/3 files" + if err := h.Handle(rar1, "", true); err.Error() != want { t.Errorf("want err = %q, got %q", want, err.Error()) } if want, got := 2, len(h.cache); want != got { t.Errorf("want len = %d, got %d", want, got) } - // ... until cache is pruned - h.pruneCache() - if want, got := 1, len(h.cache); want != got { - t.Errorf("want len = %d, got %d", want, got) + // Completing the set clears cache + symlink(t, realRAR3, rar3) + if err := h.Handle(rar3, "", true); err != nil { + t.Fatal(err) + } + if want, got := 0, len(h.cache); want != got { + t.Errorf("want %d cache entries, got %d", want, got) } } diff --git a/watcher/watcher.go b/watcher/watcher.go index 6525118..7a87a21 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -17,7 +17,6 @@ import ( type Handler interface { Handle(filename, postCommand string, remove bool) error - Stop() } type Watcher struct { @@ -152,7 +151,6 @@ func (w *Watcher) Start() { } func (w *Watcher) Stop() { - w.handler.Stop() notify.Stop(w.events) w.done <- true w.done <- true |