Browse Source

ec: dynamically discover disk types from topology for evacuation

Disk types are free-form tags (e.g., 'ssd', 'nvme', 'archive') that come
from the topology, not a hardcoded set. Only 'hdd' (or empty) is the
default disk type.

Use collectVolumeDiskTypes() to discover all disk types present in the
cluster topology instead of hardcoding [HardDriveType, SsdType].
pull/7607/head
chrislusf 2 months ago
parent
commit
0e8db10a54
  1. 2
      test/erasure_coding/ec_integration_test.go
  2. 5
      weed/shell/command_volume_server_evacuate.go

2
test/erasure_coding/ec_integration_test.go

@ -1282,7 +1282,7 @@ func TestECDiskTypeSupport(t *testing.T) {
args := []string{
"-collection", "ssd_test",
"-sourceDiskType", "ssd", // Filter source volumes by SSD
"-diskType", "ssd", // Place EC shards on SSD
"-diskType", "ssd", // Place EC shards on SSD
"-force",
}

5
weed/shell/command_volume_server_evacuate.go

@ -156,12 +156,13 @@ func (c *commandVolumeServerEvacuate) evacuateNormalVolumes(commandEnv *CommandE
}
func (c *commandVolumeServerEvacuate) evacuateEcVolumes(commandEnv *CommandEnv, volumeServer string, skipNonMoveable, applyChange bool, writer io.Writer) error {
// Evacuate EC volumes for all disk types
// Evacuate EC volumes for all disk types discovered from topology
// Disk types are free-form tags (e.g., "", "hdd", "ssd", "nvme", etc.)
// We need to handle each disk type separately because shards should be moved to nodes with the same disk type
// We collect topology once at the start and track capacity changes ourselves
// (via freeEcSlot decrement after each move) rather than repeatedly refreshing,
// which would give a false sense of correctness since topology could be stale.
diskTypes := []types.DiskType{types.HardDriveType, types.SsdType}
diskTypes := collectVolumeDiskTypes(c.topologyInfo)
for _, diskType := range diskTypes {
ecNodes, _ := collectEcVolumeServersByDc(c.topologyInfo, "", diskType)

Loading…
Cancel
Save