]> git.lizzy.rs Git - go-anidb.git/commitdiff
anidb: (*cacheDir).Get(): reduce the time a file lock is retained
authorDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Sun, 14 Jul 2013 05:04:35 +0000 (02:04 -0300)
committerDiogo Franco (Kovensky) <diogomfranco@gmail.com>
Sun, 14 Jul 2013 05:04:35 +0000 (02:04 -0300)
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

index 64cae67f451d6f4845af248635d2b5349befd67c..faf2ce4400414995d312c27e8e3c1e9bd7c07be9 100644 (file)
--- 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
        }