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.
50 lines
2.6 KiB
50 lines
2.6 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 taskType {
|
|
case TaskTypeErasureCoding:
|
|
// 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-target handling
|
|
// 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 TaskTypeBalance:
|
|
// Balance task: moves volume from source to target
|
|
// Source loses 1 volume, target gains 1 volume
|
|
return StorageSlotChange{VolumeSlots: -1, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 1, ShardSlots: 0}
|
|
|
|
case TaskTypeVacuum:
|
|
// Vacuum task: frees space by removing deleted entries, no slot change
|
|
return StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}, StorageSlotChange{VolumeSlots: 0, ShardSlots: 0}
|
|
|
|
case TaskTypeReplication:
|
|
// 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.Warningf("unhandled task type %s in CalculateTaskStorageImpact, assuming 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
|
|
}
|