X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/ceeab308e98c5d03962404ec00e1d365d2530644..139200027a3192260b5ea7c2d0c93a8eb5f8eb7e:/services/keepstore/volume_unix.go diff --git a/services/keepstore/volume_unix.go b/services/keepstore/volume_unix.go index 996068cf3d..7aff85e59a 100644 --- a/services/keepstore/volume_unix.go +++ b/services/keepstore/volume_unix.go @@ -181,26 +181,24 @@ func (v *UnixVolume) stat(path string) (os.FileInfo, error) { return stat, err } -// Get retrieves a block identified by the locator string "loc", and -// returns its contents as a byte slice. -// -// Get returns a nil buffer IFF it returns a non-nil error. -func (v *UnixVolume) Get(loc string) ([]byte, error) { +// Get retrieves a block, copies it to the given slice, and returns +// the number of bytes copied. +func (v *UnixVolume) Get(loc string, buf []byte) (int, error) { path := v.blockPath(loc) stat, err := v.stat(path) if err != nil { - return nil, v.translateError(err) + return 0, v.translateError(err) + } + if stat.Size() > int64(len(buf)) { + return 0, TooLongError } - buf := bufs.Get(int(stat.Size())) + var read int + size := int(stat.Size()) err = v.getFunc(path, func(rdr io.Reader) error { - _, err = io.ReadFull(rdr, buf) + read, err = io.ReadFull(rdr, buf[:size]) return err }) - if err != nil { - bufs.Put(buf) - return nil, err - } - return buf, nil + return read, err } // Compare returns nil if Get(loc) would return the same content as @@ -540,7 +538,7 @@ func (v *UnixVolume) translateError(err error) error { } } -var trashLocRegexp = regexp.MustCompile(`/([0-9a-f]{32})\.trash\.(\d+)$`) +var unixTrashLocRegexp = regexp.MustCompile(`/([0-9a-f]{32})\.trash\.(\d+)$`) // EmptyTrash walks hierarchy looking for {hash}.trash.* // and deletes those with deadline < now. @@ -556,7 +554,7 @@ func (v *UnixVolume) EmptyTrash() { if info.Mode().IsDir() { return nil } - matches := trashLocRegexp.FindStringSubmatch(path) + matches := unixTrashLocRegexp.FindStringSubmatch(path) if len(matches) != 3 { return nil }