X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/05b52b297b30d075ef2409a123f7d096c1156cf8..1e74db260a84317d58969b9b530d0d87a325da9c:/services/keepstore/volume_unix.go diff --git a/services/keepstore/volume_unix.go b/services/keepstore/volume_unix.go index 98c31d1eab..e745eb2691 100644 --- a/services/keepstore/volume_unix.go +++ b/services/keepstore/volume_unix.go @@ -189,7 +189,7 @@ func (v *UnixVolume) Get(loc string) ([]byte, error) { path := v.blockPath(loc) stat, err := v.stat(path) if err != nil { - return nil, err + return nil, v.translateError(err) } buf := bufs.Get(int(stat.Size())) err = v.getFunc(path, func(rdr io.Reader) error { @@ -209,7 +209,7 @@ func (v *UnixVolume) Get(loc string) ([]byte, error) { func (v *UnixVolume) Compare(loc string, expect []byte) error { path := v.blockPath(loc) if _, err := v.stat(path); err != nil { - return err + return v.translateError(err) } return v.getFunc(path, func(rdr io.Reader) error { return compareReaderWithBuf(rdr, expect, loc[:32]) @@ -479,3 +479,16 @@ func lockfile(f *os.File) error { func unlockfile(f *os.File) error { return syscall.Flock(int(f.Fd()), syscall.LOCK_UN) } + +// Where appropriate, translate a more specific filesystem error to an +// error recognized by handlers, like os.ErrNotExist. +func (v *UnixVolume) translateError(err error) error { + switch err.(type) { + case *os.PathError: + // stat() returns a PathError if the parent directory + // (not just the file itself) is missing + return os.ErrNotExist + default: + return err + } +}