X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/8cc51c761385bd6acc5dbaf7e95994e916ca0d0d..eefc23215940fc40ec7eff4c6e7c52d6b263efee:/services/keepstore/volume.go diff --git a/services/keepstore/volume.go b/services/keepstore/volume.go index d23fcc81d4..52b9b1b244 100644 --- a/services/keepstore/volume.go +++ b/services/keepstore/volume.go @@ -1,12 +1,19 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main import ( "context" "crypto/rand" + "fmt" "io" "math/big" "sync/atomic" "time" + + "git.curoverse.com/arvados.git/sdk/go/arvados" ) type BlockWriter interface { @@ -32,7 +39,7 @@ type Volume interface { // Do whatever private setup tasks and configuration checks // are needed. Return non-nil if the volume is unusable (e.g., // invalid config). - Start() error + Start(vm *volumeMetricsVecs) error // Get a block: copy the block data into buf, and return the // number of bytes copied. @@ -231,6 +238,13 @@ type Volume interface { // EmptyTrash looks for trashed blocks that exceeded TrashLifetime // and deletes them from the volume. EmptyTrash() + + // Return a globally unique ID of the underlying storage + // device if possible, otherwise "". + DeviceID() string + + // Get the storage classes associated with this volume + GetStorageClasses() []string } // A VolumeWithExamples provides example configs to display in the @@ -275,11 +289,8 @@ type VolumeManager interface { // A VolumeMount is an attachment of a Volume to a VolumeManager. type VolumeMount struct { - UUID string - DeviceID string - ReadOnly bool - Tier int - volume Volume + arvados.KeepMount + volume Volume } // Generate a UUID the way API server would for a "KeepVolumeMount" @@ -294,7 +305,7 @@ func (*VolumeMount) generateUUID() string { if err != nil { panic(err) } - return "zzzzz-ivpuk-" + r.Text(36) + return fmt.Sprintf("zzzzz-ivpuk-%015s", r.Text(36)) } // RRVolumeManager is a round-robin VolumeManager: the Nth call to @@ -316,17 +327,19 @@ func MakeRRVolumeManager(volumes []Volume) *RRVolumeManager { } vm.mountMap = make(map[string]*VolumeMount) for _, v := range volumes { - mnt := &VolumeMount{ - UUID: (*VolumeMount)(nil).generateUUID(), - DeviceID: "", - ReadOnly: !v.Writable(), - Tier: 1, - volume: v, + sc := v.GetStorageClasses() + if len(sc) == 0 { + sc = []string{"default"} } - if v, ok := v.(interface { - DeviceID() string - }); ok { - mnt.DeviceID = v.DeviceID() + mnt := &VolumeMount{ + KeepMount: arvados.KeepMount{ + UUID: (*VolumeMount)(nil).generateUUID(), + DeviceID: v.DeviceID(), + ReadOnly: !v.Writable(), + Replication: v.Replication(), + StorageClasses: sc, + }, + volume: v, } vm.iostats[v] = &ioStats{} vm.mounts = append(vm.mounts, mnt)