5185: in project data collections tab, show description when available; otherwise...
[arvados.git] / services / keepstore / volume.go
index 0406c3d1983fc9ce718f20797447d7218ea93276..e7683ee991a41ac8a8f45cfa9f5f263e2a7a42a6 100644 (file)
@@ -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 {