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
}