X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/05b52b297b30d075ef2409a123f7d096c1156cf8..d1e55b0176e20451df3ad11f7a0c24c0fe666738:/services/keepstore/volume_unix.go diff --git a/services/keepstore/volume_unix.go b/services/keepstore/volume_unix.go index 98c31d1eab..910cc25d61 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]) @@ -292,6 +292,7 @@ func (v *UnixVolume) Status() *VolumeStatus { } var blockDirRe = regexp.MustCompile(`^[0-9a-f]+$`) +var blockFileRe = regexp.MustCompile(`^[0-9a-f]{32}$`) // IndexTo writes (to the given Writer) a list of blocks found on this // volume which begin with the specified prefix. If the prefix is an @@ -348,6 +349,9 @@ func (v *UnixVolume) IndexTo(prefix string, w io.Writer) error { if !strings.HasPrefix(name, prefix) { continue } + if !blockFileRe.MatchString(name) { + continue + } _, err = fmt.Fprint(w, name, "+", fileInfo[0].Size(), @@ -479,3 +483,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 + } +}