9005: Copy default transport if possible. Move magics to consts.
[arvados.git] / services / keepstore / volume.go
index 836e8c6fdc918c94be128bee0399c93f89d4c6cf..86b3da61fa34802b232987126e0c490f96fc7fe8 100644 (file)
@@ -3,6 +3,7 @@ package main
 import (
        "context"
        "crypto/rand"
+       "fmt"
        "io"
        "math/big"
        "sync/atomic"
@@ -231,6 +232,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
@@ -295,7 +300,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
@@ -319,17 +324,12 @@ func MakeRRVolumeManager(volumes []Volume) *RRVolumeManager {
        for _, v := range volumes {
                mnt := &VolumeMount{
                        UUID:        (*VolumeMount)(nil).generateUUID(),
-                       DeviceID:    "",
+                       DeviceID:    v.DeviceID(),
                        ReadOnly:    !v.Writable(),
                        Replication: v.Replication(),
                        Tier:        1,
                        volume:      v,
                }
-               if v, ok := v.(interface {
-                       DeviceID() string
-               }); ok {
-                       mnt.DeviceID = v.DeviceID()
-               }
                vm.iostats[v] = &ioStats{}
                vm.mounts = append(vm.mounts, mnt)
                vm.mountMap[mnt.UUID] = mnt