X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d0f91b34eedec9af266ec4877a3005dd627ad38e..1f62181aa86195fe76d27d351a9135e44940c8ef:/services/keepstore/volume_test.go diff --git a/services/keepstore/volume_test.go b/services/keepstore/volume_test.go index d6714365de..0b8af330fb 100644 --- a/services/keepstore/volume_test.go +++ b/services/keepstore/volume_test.go @@ -1,7 +1,12 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main import ( "bytes" + "context" "crypto/md5" "errors" "fmt" @@ -17,10 +22,14 @@ import ( // impractical to achieve with a sequence of normal Volume operations. type TestableVolume interface { Volume + // [Over]write content for a locator with the given data, // bypassing all constraints like readonly and serialize. PutRaw(locator string, data []byte) + // Returns the strings that a driver uses to record read/write operations. + ReadWriteOperationLabelValues() (r, w string) + // Specify the value Mtime() should return, until the next // call to Touch, TouchWithDate, or Put. TouchWithDate(locator string, lastPut time.Time) @@ -35,7 +44,8 @@ type MockVolume struct { Timestamps map[string]time.Time // Bad volumes return an error for every operation. - Bad bool + Bad bool + BadVolumeError error // Touchable volumes' Touch() method succeeds for a locator // that has been Put(). @@ -95,11 +105,11 @@ func (v *MockVolume) gotCall(method string) { } } -func (v *MockVolume) Compare(loc string, buf []byte) error { +func (v *MockVolume) Compare(ctx context.Context, loc string, buf []byte) error { v.gotCall("Compare") <-v.Gate if v.Bad { - return errors.New("Bad volume") + return v.BadVolumeError } else if block, ok := v.Store[loc]; ok { if fmt.Sprintf("%x", md5.Sum(block)) != loc { return DiskHashError @@ -113,24 +123,23 @@ func (v *MockVolume) Compare(loc string, buf []byte) error { } } -func (v *MockVolume) Get(loc string) ([]byte, error) { +func (v *MockVolume) Get(ctx context.Context, loc string, buf []byte) (int, error) { v.gotCall("Get") <-v.Gate if v.Bad { - return nil, errors.New("Bad volume") + return 0, v.BadVolumeError } else if block, ok := v.Store[loc]; ok { - buf := bufs.Get(len(block)) - copy(buf, block) - return buf, nil + copy(buf[:len(block)], block) + return len(block), nil } - return nil, os.ErrNotExist + return 0, os.ErrNotExist } -func (v *MockVolume) Put(loc string, block []byte) error { +func (v *MockVolume) Put(ctx context.Context, loc string, block []byte) error { v.gotCall("Put") <-v.Gate if v.Bad { - return errors.New("Bad volume") + return v.BadVolumeError } if v.Readonly { return MethodDisabledError @@ -158,7 +167,7 @@ func (v *MockVolume) Mtime(loc string) (time.Time, error) { var mtime time.Time var err error if v.Bad { - err = errors.New("Bad volume") + err = v.BadVolumeError } else if t, ok := v.Timestamps[loc]; ok { mtime = t } else { @@ -183,14 +192,14 @@ func (v *MockVolume) IndexTo(prefix string, w io.Writer) error { return nil } -func (v *MockVolume) Delete(loc string) error { +func (v *MockVolume) Trash(loc string) error { v.gotCall("Delete") <-v.Gate if v.Readonly { return MethodDisabledError } if _, ok := v.Store[loc]; ok { - if time.Since(v.Timestamps[loc]) < blobSignatureTTL { + if time.Since(v.Timestamps[loc]) < time.Duration(theConfig.BlobSignatureTTL) { return nil } delete(v.Store, loc) @@ -199,6 +208,22 @@ func (v *MockVolume) Delete(loc string) error { return os.ErrNotExist } +func (v *MockVolume) DeviceID() string { + return "mock-device-id" +} + +func (v *MockVolume) Type() string { + return "Mock" +} + +func (v *MockVolume) Start(vm *volumeMetricsVecs) error { + return nil +} + +func (v *MockVolume) Untrash(loc string) error { + return nil +} + func (v *MockVolume) Status() *VolumeStatus { var used uint64 for _, block := range v.Store { @@ -218,3 +243,10 @@ func (v *MockVolume) Writable() bool { func (v *MockVolume) Replication() int { return 1 } + +func (v *MockVolume) EmptyTrash() { +} + +func (v *MockVolume) GetStorageClasses() []string { + return nil +}