+// 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"
// 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
// 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"
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
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)