From 1df9be9873b9ea080906a30c5eaa5bfe97d173e3 Mon Sep 17 00:00:00 2001 From: "Diogo Franco (Kovensky)" Date: Sun, 14 Jul 2013 02:04:35 -0300 Subject: [PATCH] anidb: (*cacheDir).Get(): reduce the time a file lock is retained When reading from cache, read the entire file into a buffer before attempting to decode; release the lock as soon as the read is done. Also move the parameter sanity check to be earlier in the method. --- cache.go | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/cache.go b/cache.go index 64cae67..faf2ce4 100644 --- a/cache.go +++ b/cache.go @@ -145,30 +145,46 @@ func (c *cacheDir) Get(v Cacheable, keys ...cacheKey) (err error) { defer func() { log.Println("Got entry", keys, "(error", err, ")") }() - if flock := lockFile(cachePath(keys...)); flock != nil { + + val := reflect.ValueOf(v) + if k := val.Kind(); k == reflect.Ptr || k == reflect.Interface { + val = val.Elem() + } + if !val.CanSet() { + // panic because this is an internal coding mistake + panic("(*cacheDir).Get(): given Cacheable is not setable") + } + + flock := lockFile(cachePath(keys...)) + if flock != nil { flock.Lock() - defer flock.Unlock() } + defer func() { + if flock != nil { + flock.Unlock() + } + }() fh, err := c.Open(keys...) if err != nil { return err } - defer func() { - if e := fh.Close(); err == nil { - err = e - } - }() - val := reflect.ValueOf(v) - if k := val.Kind(); k == reflect.Ptr || k == reflect.Interface { - val = val.Elem() + buf := bytes.Buffer{} + if _, err = io.Copy(&buf, fh); err != nil { + fh.Close() + return err } - if !val.CanSet() { - // panic because this is an internal coding mistake - panic("(*cacheDir).Get(): given Cacheable is not setable") + if err = fh.Close(); err != nil { + return err + } + + if flock != nil { + flock.Unlock() + flock = nil } - gz, err := gzip.NewReader(fh) + + gz, err := gzip.NewReader(&buf) if err != nil { return err } -- 2.44.0