Browse Source
reorganized the codebase to move the simulation framework and tests into their own dedicated package
worker-execute-ec-tasks
reorganized the codebase to move the simulation framework and tests into their own dedicated package
worker-execute-ec-tasks
6 changed files with 122 additions and 470 deletions
-
70weed/admin/task/example_usage.go
-
84weed/admin/task/simulation/comprehensive_simulation.go
-
56weed/admin/task/simulation/comprehensive_simulation_test.go
-
4weed/admin/task/simulation/simulation_runner.go
-
81weed/admin/task/simulation/system_demo_test.go
-
297weed/admin/task/simulation_runner.go
@ -1,297 +0,0 @@ |
|||
package task |
|||
|
|||
import ( |
|||
"fmt" |
|||
"time" |
|||
|
|||
"github.com/seaweedfs/seaweedfs/weed/glog" |
|||
) |
|||
|
|||
// SimulationRunner orchestrates the execution of simulation scenarios
|
|||
type SimulationRunner struct { |
|||
simulator *TaskSimulator |
|||
} |
|||
|
|||
// NewSimulationRunner creates a new simulation runner
|
|||
func NewSimulationRunner() *SimulationRunner { |
|||
return &SimulationRunner{ |
|||
simulator: NewTaskSimulator(), |
|||
} |
|||
} |
|||
|
|||
// RunAllScenarios runs all predefined simulation scenarios
|
|||
func (sr *SimulationRunner) RunAllScenarios() error { |
|||
glog.Infof("Starting comprehensive task distribution system simulation") |
|||
|
|||
// Create standard scenarios
|
|||
sr.simulator.CreateStandardScenarios() |
|||
|
|||
scenarios := []string{ |
|||
"worker_timeout_during_ec", |
|||
"stuck_vacuum_task", |
|||
"duplicate_task_prevention", |
|||
"master_admin_divergence", |
|||
} |
|||
|
|||
var allResults []*SimulationResult |
|||
|
|||
for _, scenarioName := range scenarios { |
|||
glog.Infof("Running scenario: %s", scenarioName) |
|||
|
|||
result, err := sr.simulator.RunScenario(scenarioName) |
|||
if err != nil { |
|||
glog.Errorf("Failed to run scenario %s: %v", scenarioName, err) |
|||
continue |
|||
} |
|||
|
|||
allResults = append(allResults, result) |
|||
|
|||
// Brief pause between scenarios
|
|||
time.Sleep(5 * time.Second) |
|||
} |
|||
|
|||
// Generate and log comprehensive report
|
|||
report := sr.simulator.GenerateSimulationReport() |
|||
glog.Infof("Simulation Report:\n%s", report) |
|||
|
|||
// Summary
|
|||
sr.logSummary(allResults) |
|||
|
|||
return nil |
|||
} |
|||
|
|||
// RunSpecificScenario runs a specific simulation scenario
|
|||
func (sr *SimulationRunner) RunSpecificScenario(scenarioName string) (*SimulationResult, error) { |
|||
// Ensure standard scenarios are available
|
|||
sr.simulator.CreateStandardScenarios() |
|||
|
|||
return sr.simulator.RunScenario(scenarioName) |
|||
} |
|||
|
|||
// logSummary logs a summary of all simulation results
|
|||
func (sr *SimulationRunner) logSummary(results []*SimulationResult) { |
|||
totalTasks := 0 |
|||
totalCompleted := 0 |
|||
totalFailed := 0 |
|||
totalTimeouts := 0 |
|||
totalDuplicates := 0 |
|||
totalInconsistencies := 0 |
|||
successfulScenarios := 0 |
|||
|
|||
for _, result := range results { |
|||
totalTasks += result.TasksCreated |
|||
totalCompleted += result.TasksCompleted |
|||
totalFailed += result.TasksFailed |
|||
totalTimeouts += result.WorkerTimeouts |
|||
totalDuplicates += result.DuplicatesFound |
|||
totalInconsistencies += result.StateInconsistencies |
|||
|
|||
if result.Success { |
|||
successfulScenarios++ |
|||
} |
|||
} |
|||
|
|||
glog.Infof("=== SIMULATION SUMMARY ===") |
|||
glog.Infof("Scenarios Run: %d", len(results)) |
|||
glog.Infof("Successful Scenarios: %d", successfulScenarios) |
|||
glog.Infof("Total Tasks Created: %d", totalTasks) |
|||
glog.Infof("Total Tasks Completed: %d", totalCompleted) |
|||
glog.Infof("Total Tasks Failed: %d", totalFailed) |
|||
glog.Infof("Total Worker Timeouts: %d", totalTimeouts) |
|||
glog.Infof("Total Duplicates Found: %d", totalDuplicates) |
|||
glog.Infof("Total State Inconsistencies: %d", totalInconsistencies) |
|||
|
|||
if totalTasks > 0 { |
|||
completionRate := float64(totalCompleted) / float64(totalTasks) * 100.0 |
|||
glog.Infof("Task Completion Rate: %.2f%%", completionRate) |
|||
} |
|||
|
|||
if len(results) > 0 { |
|||
scenarioSuccessRate := float64(successfulScenarios) / float64(len(results)) * 100.0 |
|||
glog.Infof("Scenario Success Rate: %.2f%%", scenarioSuccessRate) |
|||
} |
|||
|
|||
glog.Infof("========================") |
|||
} |
|||
|
|||
// CreateCustomScenario allows creating custom simulation scenarios
|
|||
func (sr *SimulationRunner) CreateCustomScenario( |
|||
name string, |
|||
description string, |
|||
workerCount int, |
|||
volumeCount int, |
|||
duration time.Duration, |
|||
failurePatterns []*FailurePattern, |
|||
) { |
|||
scenario := &SimulationScenario{ |
|||
Name: name, |
|||
Description: description, |
|||
WorkerCount: workerCount, |
|||
VolumeCount: volumeCount, |
|||
Duration: duration, |
|||
FailurePatterns: failurePatterns, |
|||
TestCases: []*TestCase{}, // Can be populated separately
|
|||
} |
|||
|
|||
sr.simulator.RegisterScenario(scenario) |
|||
glog.Infof("Created custom scenario: %s", name) |
|||
} |
|||
|
|||
// ValidateSystemBehavior validates that the system behaves correctly under various conditions
|
|||
func (sr *SimulationRunner) ValidateSystemBehavior() error { |
|||
glog.Infof("Starting system behavior validation") |
|||
|
|||
validationTests := []struct { |
|||
name string |
|||
testFunc func() error |
|||
}{ |
|||
{"Volume State Consistency", sr.validateVolumeStateConsistency}, |
|||
{"Task Assignment Logic", sr.validateTaskAssignmentLogic}, |
|||
{"Failure Recovery", sr.validateFailureRecovery}, |
|||
{"Duplicate Prevention", sr.validateDuplicatePrevention}, |
|||
{"Resource Management", sr.validateResourceManagement}, |
|||
} |
|||
|
|||
var errors []string |
|||
|
|||
for _, test := range validationTests { |
|||
glog.Infof("Running validation test: %s", test.name) |
|||
if err := test.testFunc(); err != nil { |
|||
errors = append(errors, fmt.Sprintf("%s: %v", test.name, err)) |
|||
} |
|||
} |
|||
|
|||
if len(errors) > 0 { |
|||
return fmt.Errorf("validation failed with %d errors: %v", len(errors), errors) |
|||
} |
|||
|
|||
glog.Infof("All system behavior validation tests passed") |
|||
return nil |
|||
} |
|||
|
|||
// validateVolumeStateConsistency validates volume state tracking
|
|||
func (sr *SimulationRunner) validateVolumeStateConsistency() error { |
|||
// Test volume reservation and release
|
|||
// Test pending change tracking
|
|||
// Test master reconciliation
|
|||
|
|||
glog.V(1).Infof("Volume state consistency validation passed") |
|||
return nil |
|||
} |
|||
|
|||
// validateTaskAssignmentLogic validates task assignment
|
|||
func (sr *SimulationRunner) validateTaskAssignmentLogic() error { |
|||
// Test worker selection algorithm
|
|||
// Test capability matching
|
|||
// Test load balancing
|
|||
|
|||
glog.V(1).Infof("Task assignment logic validation passed") |
|||
return nil |
|||
} |
|||
|
|||
// validateFailureRecovery validates failure recovery mechanisms
|
|||
func (sr *SimulationRunner) validateFailureRecovery() error { |
|||
// Test worker timeout handling
|
|||
// Test task stuck detection
|
|||
// Test retry logic
|
|||
|
|||
glog.V(1).Infof("Failure recovery validation passed") |
|||
return nil |
|||
} |
|||
|
|||
// validateDuplicatePrevention validates duplicate task prevention
|
|||
func (sr *SimulationRunner) validateDuplicatePrevention() error { |
|||
// Test duplicate detection
|
|||
// Test task fingerprinting
|
|||
// Test race condition handling
|
|||
|
|||
glog.V(1).Infof("Duplicate prevention validation passed") |
|||
return nil |
|||
} |
|||
|
|||
// validateResourceManagement validates resource management
|
|||
func (sr *SimulationRunner) validateResourceManagement() error { |
|||
// Test capacity planning
|
|||
// Test worker load balancing
|
|||
// Test resource exhaustion handling
|
|||
|
|||
glog.V(1).Infof("Resource management validation passed") |
|||
return nil |
|||
} |
|||
|
|||
// DemonstrateSystemCapabilities runs a demonstration of system capabilities
|
|||
func (sr *SimulationRunner) DemonstrateSystemCapabilities() { |
|||
glog.Infof("=== DEMONSTRATING TASK DISTRIBUTION SYSTEM CAPABILITIES ===") |
|||
|
|||
demonstrations := []struct { |
|||
name string |
|||
desc string |
|||
action func() |
|||
}{ |
|||
{ |
|||
"High Availability", |
|||
"System continues operating even when workers fail", |
|||
sr.demonstrateHighAvailability, |
|||
}, |
|||
{ |
|||
"Load Balancing", |
|||
"Tasks are distributed evenly across available workers", |
|||
sr.demonstrateLoadBalancing, |
|||
}, |
|||
{ |
|||
"State Reconciliation", |
|||
"System maintains consistency between admin server and master", |
|||
sr.demonstrateStateReconciliation, |
|||
}, |
|||
{ |
|||
"Failure Recovery", |
|||
"System recovers gracefully from various failure scenarios", |
|||
sr.demonstrateFailureRecovery, |
|||
}, |
|||
{ |
|||
"Scalability", |
|||
"System handles increasing load and worker count", |
|||
sr.demonstrateScalability, |
|||
}, |
|||
} |
|||
|
|||
for _, demo := range demonstrations { |
|||
glog.Infof("\n--- %s ---", demo.name) |
|||
glog.Infof("Description: %s", demo.desc) |
|||
demo.action() |
|||
time.Sleep(2 * time.Second) // Brief pause between demonstrations
|
|||
} |
|||
|
|||
glog.Infof("=== DEMONSTRATION COMPLETE ===") |
|||
} |
|||
|
|||
func (sr *SimulationRunner) demonstrateHighAvailability() { |
|||
glog.Infof("High Availability Features:") |
|||
glog.Infof("✓ Workers can fail without affecting overall system operation") |
|||
glog.Infof("✓ Tasks are automatically reassigned when workers become unavailable") |
|||
glog.Infof("✓ System maintains service even with 50 percent worker failure rate") |
|||
} |
|||
|
|||
func (sr *SimulationRunner) demonstrateLoadBalancing() { |
|||
glog.Infof("✓ Tasks distributed based on worker capacity and performance") |
|||
glog.Infof("✓ High-priority tasks assigned to most reliable workers") |
|||
glog.Infof("✓ System prevents worker overload through capacity tracking") |
|||
} |
|||
|
|||
func (sr *SimulationRunner) demonstrateStateReconciliation() { |
|||
glog.Infof("✓ Volume state changes reported to master server") |
|||
glog.Infof("✓ In-progress tasks considered in capacity planning") |
|||
glog.Infof("✓ Consistent view maintained across all system components") |
|||
} |
|||
|
|||
func (sr *SimulationRunner) demonstrateFailureRecovery() { |
|||
glog.Infof("✓ Stuck tasks detected and recovered automatically") |
|||
glog.Infof("✓ Failed tasks retried with exponential backoff") |
|||
glog.Infof("✓ Duplicate tasks prevented through fingerprinting") |
|||
} |
|||
|
|||
func (sr *SimulationRunner) demonstrateScalability() { |
|||
glog.Infof("✓ System scales horizontally by adding more workers") |
|||
glog.Infof("✓ No single point of failure in worker architecture") |
|||
glog.Infof("✓ Admin server handles increasing task volume efficiently") |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue