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.
		
		
		
		
		
			
		
			
				
					
					
						
							148 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							148 lines
						
					
					
						
							4.6 KiB
						
					
					
				
								package tasks
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"sync"
							 | 
						|
								
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/glog"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/worker/types"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								var (
							 | 
						|
									globalTypesRegistry *types.TaskRegistry
							 | 
						|
									globalUIRegistry    *types.UIRegistry
							 | 
						|
									globalTaskRegistry  *TaskRegistry
							 | 
						|
									typesRegistryOnce   sync.Once
							 | 
						|
									uiRegistryOnce      sync.Once
							 | 
						|
									taskRegistryOnce    sync.Once
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// GetGlobalTypesRegistry returns the global types registry (singleton)
							 | 
						|
								func GetGlobalTypesRegistry() *types.TaskRegistry {
							 | 
						|
									typesRegistryOnce.Do(func() {
							 | 
						|
										globalTypesRegistry = types.NewTaskRegistry()
							 | 
						|
										glog.V(1).Infof("Created global types registry")
							 | 
						|
									})
							 | 
						|
									return globalTypesRegistry
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetGlobalUIRegistry returns the global UI registry (singleton)
							 | 
						|
								func GetGlobalUIRegistry() *types.UIRegistry {
							 | 
						|
									uiRegistryOnce.Do(func() {
							 | 
						|
										globalUIRegistry = types.NewUIRegistry()
							 | 
						|
										glog.V(1).Infof("Created global UI registry")
							 | 
						|
									})
							 | 
						|
									return globalUIRegistry
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetGlobalTaskRegistry returns the global task registry (singleton)
							 | 
						|
								func GetGlobalTaskRegistry() *TaskRegistry {
							 | 
						|
									taskRegistryOnce.Do(func() {
							 | 
						|
										globalTaskRegistry = NewTaskRegistry()
							 | 
						|
										glog.V(1).Infof("Created global task registry")
							 | 
						|
									})
							 | 
						|
									return globalTaskRegistry
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// AutoRegister registers a task with the global task registry
							 | 
						|
								func AutoRegister(taskType types.TaskType, factory types.TaskFactory) {
							 | 
						|
									registry := GetGlobalTaskRegistry()
							 | 
						|
									registry.Register(taskType, factory)
							 | 
						|
									glog.V(1).Infof("Auto-registered task type: %s", taskType)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// AutoRegisterTypes registers a task with the global types registry
							 | 
						|
								func AutoRegisterTypes(registerFunc func(*types.TaskRegistry)) {
							 | 
						|
									registry := GetGlobalTypesRegistry()
							 | 
						|
									registerFunc(registry)
							 | 
						|
									glog.V(1).Infof("Auto-registered task with types registry")
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// AutoRegisterUI registers a UI provider with the global UI registry
							 | 
						|
								func AutoRegisterUI(registerFunc func(*types.UIRegistry)) {
							 | 
						|
									registry := GetGlobalUIRegistry()
							 | 
						|
									registerFunc(registry)
							 | 
						|
									glog.V(1).Infof("Auto-registered task UI provider")
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// SetDefaultCapabilitiesFromRegistry sets the default worker capabilities
							 | 
						|
								// based on all registered task types
							 | 
						|
								func SetDefaultCapabilitiesFromRegistry() {
							 | 
						|
									typesRegistry := GetGlobalTypesRegistry()
							 | 
						|
								
							 | 
						|
									var capabilities []types.TaskType
							 | 
						|
									for taskType := range typesRegistry.GetAllDetectors() {
							 | 
						|
										capabilities = append(capabilities, taskType)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Set the default capabilities in the types package
							 | 
						|
									types.SetDefaultCapabilities(capabilities)
							 | 
						|
								
							 | 
						|
									glog.V(1).Infof("Set default worker capabilities from registry: %v", capabilities)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// BuildMaintenancePolicyFromTasks creates a maintenance policy with default configurations
							 | 
						|
								// from all registered tasks using their UI providers
							 | 
						|
								func BuildMaintenancePolicyFromTasks() *types.MaintenancePolicy {
							 | 
						|
									policy := types.NewMaintenancePolicy()
							 | 
						|
								
							 | 
						|
									// Get all registered task types from the UI registry
							 | 
						|
									uiRegistry := GetGlobalUIRegistry()
							 | 
						|
								
							 | 
						|
									for taskType, provider := range uiRegistry.GetAllProviders() {
							 | 
						|
										// Get the default configuration from the UI provider
							 | 
						|
										defaultConfig := provider.GetCurrentConfig()
							 | 
						|
								
							 | 
						|
										// Set the configuration in the policy
							 | 
						|
										policy.SetTaskConfig(taskType, defaultConfig)
							 | 
						|
								
							 | 
						|
										glog.V(3).Infof("Added default config for task type %s to policy", taskType)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									glog.V(2).Infof("Built maintenance policy with %d task configurations", len(policy.TaskConfigs))
							 | 
						|
									return policy
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// SetMaintenancePolicyFromTasks sets the default maintenance policy from registered tasks
							 | 
						|
								func SetMaintenancePolicyFromTasks() {
							 | 
						|
									// This function can be called to initialize the policy from registered tasks
							 | 
						|
									// For now, we'll just log that this should be called by the integration layer
							 | 
						|
									glog.V(1).Infof("SetMaintenancePolicyFromTasks called - policy should be built by the integration layer")
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// TaskRegistry manages task factories
							 | 
						|
								type TaskRegistry struct {
							 | 
						|
									factories map[types.TaskType]types.TaskFactory
							 | 
						|
									mutex     sync.RWMutex
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// NewTaskRegistry creates a new task registry
							 | 
						|
								func NewTaskRegistry() *TaskRegistry {
							 | 
						|
									return &TaskRegistry{
							 | 
						|
										factories: make(map[types.TaskType]types.TaskFactory),
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// Register adds a factory to the registry
							 | 
						|
								func (r *TaskRegistry) Register(taskType types.TaskType, factory types.TaskFactory) {
							 | 
						|
									r.mutex.Lock()
							 | 
						|
									defer r.mutex.Unlock()
							 | 
						|
									r.factories[taskType] = factory
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// Get returns a factory from the registry
							 | 
						|
								func (r *TaskRegistry) Get(taskType types.TaskType) types.TaskFactory {
							 | 
						|
									r.mutex.RLock()
							 | 
						|
									defer r.mutex.RUnlock()
							 | 
						|
									return r.factories[taskType]
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetAll returns all registered factories
							 | 
						|
								func (r *TaskRegistry) GetAll() map[types.TaskType]types.TaskFactory {
							 | 
						|
									r.mutex.RLock()
							 | 
						|
									defer r.mutex.RUnlock()
							 | 
						|
									result := make(map[types.TaskType]types.TaskFactory)
							 | 
						|
									for k, v := range r.factories {
							 | 
						|
										result[k] = v
							 | 
						|
									}
							 | 
						|
									return result
							 | 
						|
								}
							 |