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