@ -436,13 +436,29 @@ func collectEcVolumeServersByDc(topo *master_pb.TopologyInfo, selectedDataCenter
disks : make ( map [ uint32 ] * EcDisk ) ,
disks : make ( map [ uint32 ] * EcDisk ) ,
}
}
// Build disk-level information from EC shard info
// Build disk-level information from volumes and EC shards
// First, discover all unique disk IDs from VolumeInfos (includes empty disks)
allDiskIds := make ( map [ uint32 ] string ) // diskId -> diskType
for diskType , diskInfo := range dn . DiskInfos {
for diskType , diskInfo := range dn . DiskInfos {
if diskInfo == nil {
if diskInfo == nil {
continue
continue
}
}
// Get all disk IDs from volumes
for _ , vi := range diskInfo . VolumeInfos {
allDiskIds [ vi . DiskId ] = diskType
}
// Also get disk IDs from EC shards
for _ , ecShardInfo := range diskInfo . EcShardInfos {
allDiskIds [ ecShardInfo . DiskId ] = diskType
}
}
// Group EC shards by disk_id
// Group EC shards by disk_id
diskShards := make ( map [ uint32 ] map [ needle . VolumeId ] erasure_coding . ShardBits )
diskShards := make ( map [ uint32 ] map [ needle . VolumeId ] erasure_coding . ShardBits )
for _ , diskInfo := range dn . DiskInfos {
if diskInfo == nil {
continue
}
for _ , ecShardInfo := range diskInfo . EcShardInfos {
for _ , ecShardInfo := range diskInfo . EcShardInfos {
diskId := ecShardInfo . DiskId
diskId := ecShardInfo . DiskId
if diskShards [ diskId ] == nil {
if diskShards [ diskId ] == nil {
@ -451,24 +467,24 @@ func collectEcVolumeServersByDc(topo *master_pb.TopologyInfo, selectedDataCenter
vid := needle . VolumeId ( ecShardInfo . Id )
vid := needle . VolumeId ( ecShardInfo . Id )
diskShards [ diskId ] [ vid ] = erasure_coding . ShardBits ( ecShardInfo . EcIndexBits )
diskShards [ diskId ] [ vid ] = erasure_coding . ShardBits ( ecShardInfo . EcIndexBits )
}
}
}
// If no EC shards, still create disk entry based on DiskInfo.DiskId
if len ( diskShards ) == 0 && diskInfo . DiskId > 0 {
diskShards [ diskInfo . DiskId ] = make ( map [ needle . VolumeId ] erasure_coding . ShardBits )
// Create EcDisk for each discovered disk
diskCount := len ( allDiskIds )
if diskCount == 0 {
diskCount = 1
}
}
freePerDisk := int ( freeEcSlots ) / diskCount
// Create EcDisk for each disk_id found
for diskId , shards := range diskShards {
for diskId , diskType := range allDiskIds {
shards := diskShards [ diskId ]
if shards == nil {
shards = make ( map [ needle . VolumeId ] erasure_coding . ShardBits )
}
totalShardCount := 0
totalShardCount := 0
for _ , shardBits := range shards {
for _ , shardBits := range shards {
totalShardCount += shardBits . ShardIdCount ( )
totalShardCount += shardBits . ShardIdCount ( )
}
}
// Estimate free slots per disk (simplified: divide evenly if multiple disks)
diskCount := len ( diskShards )
if diskCount == 0 {
diskCount = 1
}
freePerDisk := int ( freeEcSlots ) / diskCount
ecNode . disks [ diskId ] = & EcDisk {
ecNode . disks [ diskId ] = & EcDisk {
diskId : diskId ,
diskId : diskId ,
@ -478,7 +494,6 @@ func collectEcVolumeServersByDc(topo *master_pb.TopologyInfo, selectedDataCenter
ecShards : shards ,
ecShards : shards ,
}
}
}
}
}
ecNodes = append ( ecNodes , ecNode )
ecNodes = append ( ecNodes , ecNode )
totalFreeEcSlots += freeEcSlots
totalFreeEcSlots += freeEcSlots