admin: Refactor task destination planning (#7063)
* refactor planning into task detection * refactoring worker tasks * refactor * compiles, but only balance task is registered * compiles, but has nil exception * avoid nil logger * add back ec task * setting ec log directory * implement balance and vacuum tasks * EC tasks will no longer fail with "file not found" errors * Use ReceiveFile API to send locally generated shards * distributing shard files and ecx,ecj,vif files * generate .ecx files correctly * do not mount all possible EC shards (0-13) on every destination * use constants * delete all replicas * rename files * pass in volume size to tasks
This commit is contained in:
@@ -58,7 +58,7 @@ func (s *GenericScheduler) GetTaskType() types.TaskType {
|
||||
}
|
||||
|
||||
// CanScheduleNow determines if a task can be scheduled using the task definition's function
|
||||
func (s *GenericScheduler) CanScheduleNow(task *types.Task, runningTasks []*types.Task, availableWorkers []*types.Worker) bool {
|
||||
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)
|
||||
}
|
||||
@@ -66,7 +66,7 @@ func (s *GenericScheduler) CanScheduleNow(task *types.Task, runningTasks []*type
|
||||
}
|
||||
|
||||
// defaultCanSchedule provides default scheduling logic
|
||||
func (s *GenericScheduler) defaultCanSchedule(task *types.Task, runningTasks []*types.Task, availableWorkers []*types.Worker) bool {
|
||||
func (s *GenericScheduler) defaultCanSchedule(task *types.TaskInput, runningTasks []*types.TaskInput, availableWorkers []*types.WorkerData) bool {
|
||||
if !s.taskDef.Config.IsEnabled() {
|
||||
return false
|
||||
}
|
||||
@@ -103,7 +103,7 @@ func (s *GenericScheduler) defaultCanSchedule(task *types.Task, runningTasks []*
|
||||
}
|
||||
|
||||
// GetPriority returns the priority for this task
|
||||
func (s *GenericScheduler) GetPriority(task *types.Task) types.TaskPriority {
|
||||
func (s *GenericScheduler) GetPriority(task *types.TaskInput) types.TaskPriority {
|
||||
return task.Priority
|
||||
}
|
||||
|
||||
|
||||
@@ -29,13 +29,28 @@ func NewGenericFactory(taskDef *TaskDefinition) *GenericFactory {
|
||||
}
|
||||
|
||||
// Create creates a task instance using the task definition
|
||||
func (f *GenericFactory) Create(params types.TaskParams) (types.TaskInterface, error) {
|
||||
func (f *GenericFactory) Create(params *worker_pb.TaskParams) (types.Task, error) {
|
||||
if f.taskDef.CreateTask == nil {
|
||||
return nil, fmt.Errorf("no task creation function defined for %s", f.taskDef.Type)
|
||||
}
|
||||
return f.taskDef.CreateTask(params)
|
||||
}
|
||||
|
||||
// Type returns the task type
|
||||
func (f *GenericFactory) Type() string {
|
||||
return string(f.taskDef.Type)
|
||||
}
|
||||
|
||||
// Description returns a description of what this task does
|
||||
func (f *GenericFactory) Description() string {
|
||||
return f.taskDef.Description
|
||||
}
|
||||
|
||||
// Capabilities returns the task capabilities
|
||||
func (f *GenericFactory) Capabilities() []string {
|
||||
return f.taskDef.Capabilities
|
||||
}
|
||||
|
||||
// GenericSchemaProvider provides config schema from TaskDefinition
|
||||
type GenericSchemaProvider struct {
|
||||
taskDef *TaskDefinition
|
||||
@@ -149,7 +164,8 @@ func validateTaskDefinition(taskDef *TaskDefinition) error {
|
||||
if taskDef.Config == nil {
|
||||
return fmt.Errorf("task config is required")
|
||||
}
|
||||
// CreateTask is optional for tasks that use the typed task system
|
||||
// The typed system registers tasks separately via types.RegisterGlobalTypedTask()
|
||||
if taskDef.CreateTask == nil {
|
||||
return fmt.Errorf("task creation function is required")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -26,14 +26,14 @@ type TaskDefinition struct {
|
||||
ConfigSpec ConfigSpec
|
||||
|
||||
// Task creation
|
||||
CreateTask func(params types.TaskParams) (types.TaskInterface, error)
|
||||
CreateTask func(params *worker_pb.TaskParams) (types.Task, error)
|
||||
|
||||
// Detection logic
|
||||
DetectionFunc func(metrics []*types.VolumeHealthMetrics, info *types.ClusterInfo, config TaskConfig) ([]*types.TaskDetectionResult, error)
|
||||
ScanInterval time.Duration
|
||||
|
||||
// Scheduling logic
|
||||
SchedulingFunc func(task *types.Task, running []*types.Task, workers []*types.Worker, config TaskConfig) bool
|
||||
SchedulingFunc func(task *types.TaskInput, running []*types.TaskInput, workers []*types.WorkerData, config TaskConfig) bool
|
||||
MaxConcurrent int
|
||||
RepeatInterval time.Duration
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user