X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/12e80e523f1178c0db49a3c9d856d17bb7855dfe..2a4c56d2a0eead4c2863ff12882dc6512d4bf803:/services/keepstore/volume.go diff --git a/services/keepstore/volume.go b/services/keepstore/volume.go index fbf63b729c..e7683ee991 100644 --- a/services/keepstore/volume.go +++ b/services/keepstore/volume.go @@ -16,6 +16,7 @@ type Volume interface { Get(loc string) ([]byte, error) Put(loc string, block []byte) error Touch(loc string) error + Mtime(loc string) (time.Time, error) Index(prefix string) string Delete(loc string) error Status() *VolumeStatus @@ -27,17 +28,29 @@ type Volume interface { // If the Bad field is true, this volume should return an error // on all writes and puts. // +// The Touchable field signifies whether the Touch method will +// succeed. Defaults to true. Note that Bad and Touchable are +// independent: a MockVolume may be set up so that Put fails but Touch +// works or vice versa. +// +// TODO(twp): rename Bad to something more descriptive, e.g. Writable, +// and make sure that the tests that rely on it are testing the right +// thing. We may need to simulate Writable, Touchable and Corrupt +// volumes in different ways. +// type MockVolume struct { Store map[string][]byte Timestamps map[string]time.Time Bad bool + Touchable bool } func CreateMockVolume() *MockVolume { return &MockVolume{ - make(map[string][]byte), - make(map[string]time.Time), - false, + Store: make(map[string][]byte), + Timestamps: make(map[string]time.Time), + Bad: false, + Touchable: true, } } @@ -59,11 +72,24 @@ func (v *MockVolume) Put(loc string, block []byte) error { } func (v *MockVolume) Touch(loc string) error { + if v.Touchable { + v.Timestamps[loc] = time.Now() + return nil + } + return errors.New("Touch failed") +} + +func (v *MockVolume) Mtime(loc string) (time.Time, error) { + var mtime time.Time + var err error if v.Bad { - return errors.New("Bad volume") + err = errors.New("Bad volume") + } else if t, ok := v.Timestamps[loc]; ok { + mtime = t + } else { + err = os.ErrNotExist } - v.Timestamps[loc] = time.Now() - return nil + return mtime, err } func (v *MockVolume) Index(prefix string) string { @@ -79,6 +105,9 @@ func (v *MockVolume) Index(prefix string) string { func (v *MockVolume) Delete(loc string) error { if _, ok := v.Store[loc]; ok { + if time.Since(v.Timestamps[loc]) < permission_ttl { + return nil + } delete(v.Store, loc) return nil }