You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
2.1 KiB
41 lines
2.1 KiB
package topology
|
|
|
|
import (
|
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
"github.com/seaweedfs/seaweedfs/weed/storage/erasure_coding"
|
|
)
|
|
|
|
// CalculateTaskStorageImpact calculates storage impact for different task types
|
|
func CalculateTaskStorageImpact(taskType TaskType, volumeSize int64) (sourceChange, targetChange StorageSlotChange) {
|
|
switch string(taskType) {
|
|
case "erasure_coding":
|
|
// EC task: distributes shards to MULTIPLE targets, source reserves with zero impact
|
|
// Source reserves capacity but with zero StorageSlotChange (no actual capacity consumption during planning)
|
|
// WARNING: EC has multiple targets! Use AddPendingTask with multiple destinations for proper multi-destination calculation
|
|
// This simplified function returns zero impact; real EC requires specialized multi-destination calculation
|
|
return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}
|
|
|
|
case "replication":
|
|
// Replication task: creates new replica on target
|
|
return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 1, ShardSlots: 0}
|
|
|
|
default:
|
|
// Unknown task type, assume minimal impact
|
|
glog.V(2).Infof("Task type %s not specifically handled in CalculateTaskStorageImpact, using default impact", taskType)
|
|
return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 1, ShardSlots: 0}
|
|
}
|
|
}
|
|
|
|
// CalculateECShardStorageImpact calculates storage impact for EC shards specifically
|
|
func CalculateECShardStorageImpact(shardCount int32, expectedShardSize int64) StorageSlotChange {
|
|
// EC shards are typically much smaller than full volumes
|
|
// Use shard-level tracking for granular capacity planning
|
|
return StorageSlotChange{VolumeSlots: 0, ShardSlots: shardCount}
|
|
}
|
|
|
|
// CalculateECShardCleanupImpact calculates storage impact for cleaning up existing EC shards
|
|
func CalculateECShardCleanupImpact(originalVolumeSize int64) StorageSlotChange {
|
|
// Cleaning up existing EC shards frees shard slots
|
|
// Use the actual EC configuration constants for accurate shard count
|
|
return StorageSlotChange{VolumeSlots: 0, ShardSlots: -int32(erasure_coding.TotalShardsCount)} // Negative = freed capacity
|
|
}
|