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 | |
| }
 |