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.
		
		
		
		
		
			
		
			
				
					
					
						
							129 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							129 lines
						
					
					
						
							3.6 KiB
						
					
					
				
								package base
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"time"
							 | 
						|
								
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/worker/types"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// GenericDetector implements TaskDetector using function-based logic
							 | 
						|
								type GenericDetector struct {
							 | 
						|
									taskDef *TaskDefinition
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// NewGenericDetector creates a detector from a task definition
							 | 
						|
								func NewGenericDetector(taskDef *TaskDefinition) *GenericDetector {
							 | 
						|
									return &GenericDetector{taskDef: taskDef}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetTaskType returns the task type
							 | 
						|
								func (d *GenericDetector) GetTaskType() types.TaskType {
							 | 
						|
									return d.taskDef.Type
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// ScanForTasks scans using the task definition's detection function
							 | 
						|
								func (d *GenericDetector) ScanForTasks(volumeMetrics []*types.VolumeHealthMetrics, clusterInfo *types.ClusterInfo) ([]*types.TaskDetectionResult, error) {
							 | 
						|
									if d.taskDef.DetectionFunc == nil {
							 | 
						|
										return nil, nil
							 | 
						|
									}
							 | 
						|
									return d.taskDef.DetectionFunc(volumeMetrics, clusterInfo, d.taskDef.Config)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// ScanInterval returns the scan interval from task definition
							 | 
						|
								func (d *GenericDetector) ScanInterval() time.Duration {
							 | 
						|
									if d.taskDef.ScanInterval > 0 {
							 | 
						|
										return d.taskDef.ScanInterval
							 | 
						|
									}
							 | 
						|
									return 30 * time.Minute // Default
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// IsEnabled returns whether this detector is enabled
							 | 
						|
								func (d *GenericDetector) IsEnabled() bool {
							 | 
						|
									return d.taskDef.Config.IsEnabled()
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GenericScheduler implements TaskScheduler using function-based logic
							 | 
						|
								type GenericScheduler struct {
							 | 
						|
									taskDef *TaskDefinition
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// NewGenericScheduler creates a scheduler from a task definition
							 | 
						|
								func NewGenericScheduler(taskDef *TaskDefinition) *GenericScheduler {
							 | 
						|
									return &GenericScheduler{taskDef: taskDef}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetTaskType returns the task type
							 | 
						|
								func (s *GenericScheduler) GetTaskType() types.TaskType {
							 | 
						|
									return s.taskDef.Type
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// CanScheduleNow determines if a task can be scheduled using the task definition's function
							 | 
						|
								func (s *GenericScheduler) CanScheduleNow(task *types.TaskInput, runningTasks []*types.TaskInput, availableWorkers []*types.WorkerData) bool {
							 | 
						|
									if s.taskDef.SchedulingFunc == nil {
							 | 
						|
										return s.defaultCanSchedule(task, runningTasks, availableWorkers)
							 | 
						|
									}
							 | 
						|
									return s.taskDef.SchedulingFunc(task, runningTasks, availableWorkers, s.taskDef.Config)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// defaultCanSchedule provides default scheduling logic
							 | 
						|
								func (s *GenericScheduler) defaultCanSchedule(task *types.TaskInput, runningTasks []*types.TaskInput, availableWorkers []*types.WorkerData) bool {
							 | 
						|
									if !s.taskDef.Config.IsEnabled() {
							 | 
						|
										return false
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Count running tasks of this type
							 | 
						|
									runningCount := 0
							 | 
						|
									for _, runningTask := range runningTasks {
							 | 
						|
										if runningTask.Type == s.taskDef.Type {
							 | 
						|
											runningCount++
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Check concurrency limit
							 | 
						|
									maxConcurrent := s.taskDef.MaxConcurrent
							 | 
						|
									if maxConcurrent <= 0 {
							 | 
						|
										maxConcurrent = 1 // Default
							 | 
						|
									}
							 | 
						|
									if runningCount >= maxConcurrent {
							 | 
						|
										return false
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Check if we have available workers
							 | 
						|
									for _, worker := range availableWorkers {
							 | 
						|
										if worker.CurrentLoad < worker.MaxConcurrent {
							 | 
						|
											for _, capability := range worker.Capabilities {
							 | 
						|
												if capability == s.taskDef.Type {
							 | 
						|
													return true
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									return false
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetPriority returns the priority for this task
							 | 
						|
								func (s *GenericScheduler) GetPriority(task *types.TaskInput) types.TaskPriority {
							 | 
						|
									return task.Priority
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetMaxConcurrent returns max concurrent tasks
							 | 
						|
								func (s *GenericScheduler) GetMaxConcurrent() int {
							 | 
						|
									if s.taskDef.MaxConcurrent > 0 {
							 | 
						|
										return s.taskDef.MaxConcurrent
							 | 
						|
									}
							 | 
						|
									return 1 // Default
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetDefaultRepeatInterval returns the default repeat interval
							 | 
						|
								func (s *GenericScheduler) GetDefaultRepeatInterval() time.Duration {
							 | 
						|
									if s.taskDef.RepeatInterval > 0 {
							 | 
						|
										return s.taskDef.RepeatInterval
							 | 
						|
									}
							 | 
						|
									return 24 * time.Hour // Default
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// IsEnabled returns whether this scheduler is enabled
							 | 
						|
								func (s *GenericScheduler) IsEnabled() bool {
							 | 
						|
									return s.taskDef.Config.IsEnabled()
							 | 
						|
								}
							 |