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