Merge branch '13063-update-azure-sdk'
[arvados.git] / services / keepstore / volume.go
index d23fcc81d4902d7ca28c442c2fba935d15914d3d..69802abdd1b5c4e22422293331d6cb0eec371896 100644 (file)
@@ -1,8 +1,13 @@
+// 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"
@@ -231,6 +236,10 @@ 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
 }
 
 // A VolumeWithExamples provides example configs to display in the
@@ -275,11 +284,12 @@ 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
+       UUID        string
+       DeviceID    string
+       ReadOnly    bool
+       Replication int
+       Tier        int
+       volume      Volume
 }
 
 // Generate a UUID the way API server would for a "KeepVolumeMount"
@@ -294,7 +304,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
@@ -317,16 +327,12 @@ 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,
-               }
-               if v, ok := v.(interface {
-                       DeviceID() string
-               }); ok {
-                       mnt.DeviceID = v.DeviceID()
+                       UUID:        (*VolumeMount)(nil).generateUUID(),
+                       DeviceID:    v.DeviceID(),
+                       ReadOnly:    !v.Writable(),
+                       Replication: v.Replication(),
+                       Tier:        1,
+                       volume:      v,
                }
                vm.iostats[v] = &ioStats{}
                vm.mounts = append(vm.mounts, mnt)