* Make EC detection context aware * Update register.go * Speed up EC detection planning * Add tests for EC detection planner * optimizations detection.go: extracted ParseCollectionFilter (exported) and feed it into the detection loop so both detection and tracing share the same parsing/whitelisting logic; the detection loop now iterates on a sorted list of volume IDs, checks the context at every iteration, and only sets hasMore when there are still unprocessed groups after hitting maxResults, keeping runtime bounded while still scheduling planned tasks before returning the results. erasure_coding_handler.go: dropped the duplicated inline filter parsing in emitErasureCodingDetectionDecisionTrace and now reuse erasurecodingtask.ParseCollectionFilter, and the summary suffix logic now only accounts for the hasMore case that can actually happen. detection_test.go: updated the helper topology builder to use master_pb.VolumeInformationMessage (matching the current protobuf types) and tightened the cancellation/max-results tests so they reliably exercise the detection logic (cancel before calling Detection, and provide enough disks so one result is produced before the limit). * use working directory * fix compilation * fix compilation * rename * go vet * fix getenv * address comments, fix error
97 lines
3.1 KiB
Go
97 lines
3.1 KiB
Go
package erasure_coding
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/worker_pb"
|
|
"github.com/seaweedfs/seaweedfs/weed/security"
|
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
"github.com/seaweedfs/seaweedfs/weed/worker/tasks"
|
|
"github.com/seaweedfs/seaweedfs/weed/worker/tasks/base"
|
|
"github.com/seaweedfs/seaweedfs/weed/worker/types"
|
|
)
|
|
|
|
// Global variable to hold the task definition for configuration updates
|
|
var globalTaskDef *base.TaskDefinition
|
|
|
|
// Auto-register this task when the package is imported
|
|
func init() {
|
|
RegisterErasureCodingTask()
|
|
|
|
// Register config updater
|
|
tasks.AutoRegisterConfigUpdater(types.TaskTypeErasureCoding, UpdateConfigFromPersistence)
|
|
}
|
|
|
|
// RegisterErasureCodingTask registers the erasure coding task with the new architecture
|
|
func RegisterErasureCodingTask() {
|
|
// Create configuration instance
|
|
config := NewDefaultConfig()
|
|
|
|
// Create shared gRPC dial option using TLS configuration
|
|
dialOpt := security.LoadClientTLS(util.GetViper(), "grpc.worker")
|
|
|
|
// Create complete task definition
|
|
taskDef := &base.TaskDefinition{
|
|
Type: types.TaskTypeErasureCoding,
|
|
Name: "erasure_coding",
|
|
DisplayName: "Erasure Coding",
|
|
Description: "Applies erasure coding to volumes for data protection",
|
|
Icon: "fas fa-shield-alt text-success",
|
|
Capabilities: []string{"erasure_coding", "data_protection"},
|
|
|
|
Config: config,
|
|
ConfigSpec: GetConfigSpec(),
|
|
CreateTask: func(params *worker_pb.TaskParams) (types.Task, error) {
|
|
if params == nil {
|
|
return nil, fmt.Errorf("task parameters are required")
|
|
}
|
|
if len(params.Sources) == 0 {
|
|
return nil, fmt.Errorf("at least one source is required for erasure coding task")
|
|
}
|
|
return NewErasureCodingTask(
|
|
fmt.Sprintf("erasure_coding-%d", params.VolumeId),
|
|
params.Sources[0].Node, // Use first source node
|
|
params.VolumeId,
|
|
params.Collection,
|
|
dialOpt,
|
|
), nil
|
|
},
|
|
DetectionFunc: func(metrics []*types.VolumeHealthMetrics, clusterInfo *types.ClusterInfo, config base.TaskConfig) ([]*types.TaskDetectionResult, error) {
|
|
results, _, err := Detection(context.Background(), metrics, clusterInfo, config, 0)
|
|
return results, err
|
|
},
|
|
ScanInterval: 1 * time.Hour,
|
|
SchedulingFunc: Scheduling,
|
|
MaxConcurrent: 1,
|
|
RepeatInterval: 24 * time.Hour,
|
|
}
|
|
|
|
// Store task definition globally for configuration updates
|
|
globalTaskDef = taskDef
|
|
|
|
// Register everything with a single function call!
|
|
base.RegisterTask(taskDef)
|
|
}
|
|
|
|
// UpdateConfigFromPersistence updates the erasure coding configuration from persistence
|
|
func UpdateConfigFromPersistence(configPersistence interface{}) error {
|
|
if globalTaskDef == nil {
|
|
return fmt.Errorf("erasure coding task not registered")
|
|
}
|
|
|
|
// Load configuration from persistence
|
|
newConfig := LoadConfigFromPersistence(configPersistence)
|
|
if newConfig == nil {
|
|
return fmt.Errorf("failed to load configuration from persistence")
|
|
}
|
|
|
|
// Update the task definition's config
|
|
globalTaskDef.Config = newConfig
|
|
|
|
glog.V(1).Infof("Updated erasure coding task configuration from persistence")
|
|
return nil
|
|
}
|