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.
		
		
		
		
		
			
		
			
				
					
					
						
							36 lines
						
					
					
						
							1.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							36 lines
						
					
					
						
							1.2 KiB
						
					
					
				
								package base
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/admin/topology"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// FindVolumeDisk finds the disk ID where a specific volume is located on a given server.
							 | 
						|
								// Returns the disk ID and a boolean indicating whether the volume was found.
							 | 
						|
								// Uses O(1) indexed lookup for optimal performance on large clusters.
							 | 
						|
								//
							 | 
						|
								// This is a shared utility function used by multiple task detection algorithms
							 | 
						|
								// (balance, vacuum, etc.) to locate volumes efficiently.
							 | 
						|
								//
							 | 
						|
								// Example usage:
							 | 
						|
								//
							 | 
						|
								//	// In balance task: find source disk for a volume that needs to be moved
							 | 
						|
								//	sourceDisk, found := base.FindVolumeDisk(topology, volumeID, collection, sourceServer)
							 | 
						|
								//
							 | 
						|
								//	// In vacuum task: find disk containing volume that needs cleanup
							 | 
						|
								//	diskID, exists := base.FindVolumeDisk(topology, volumeID, collection, serverID)
							 | 
						|
								func FindVolumeDisk(activeTopology *topology.ActiveTopology, volumeID uint32, collection string, serverID string) (uint32, bool) {
							 | 
						|
									if activeTopology == nil {
							 | 
						|
										return 0, false
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Use the new O(1) indexed lookup for better performance
							 | 
						|
									locations := activeTopology.GetVolumeLocations(volumeID, collection)
							 | 
						|
									for _, loc := range locations {
							 | 
						|
										if loc.ServerID == serverID {
							 | 
						|
											return loc.DiskID, true
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Volume not found on this server
							 | 
						|
									return 0, false
							 | 
						|
								}
							 |