aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2018-11-07 20:57:05 +0100
committerMartin Polden <mpolden@mpolden.no>2018-11-07 20:57:05 +0100
commit004eb5d715f84aa304541042a44983c2d5fe97ac (patch)
tree0b0c0f57b5e90e0c9f01aab6893d6ef9e6c5bf4a
parent73651e2c82c0192d004221fdf1b615909a6b1eea (diff)
Simplify cache pruning
-rw-r--r--rar/rar.go41
-rw-r--r--rar/rar_test.go48
-rw-r--r--watcher/watcher.go2
3 files changed, 26 insertions, 65 deletions
diff --git a/rar/rar.go b/rar/rar.go
index 63c0c25..a8ec021 100644
--- a/rar/rar.go
+++ b/rar/rar.go
@@ -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