Weekend fun with memory leaks

This commit is contained in:
2025-09-07 03:02:34 +01:00
parent e17b820368
commit c9a23dc6c0
13 changed files with 353 additions and 83 deletions
+33 -2
View File
@@ -381,12 +381,16 @@ type TaskRegistry struct {
// GlobalTaskRegistry is the singleton instance for managing all background tasks
var (
globalTaskRegistry *TaskRegistry
globalTaskRegistryOnce sync.Once
globalTaskRegistry *TaskRegistry
globalTaskRegistryOnce sync.Once
globalTaskRegistryMutex sync.Mutex // Protect reset operations
)
// GetGlobalTaskRegistry returns the singleton task registry
func GetGlobalTaskRegistry() *TaskRegistry {
globalTaskRegistryMutex.Lock()
defer globalTaskRegistryMutex.Unlock()
globalTaskRegistryOnce.Do(func() {
logger := GetSingletonNoOpLogger()
circuitBreaker := NewTaskCircuitBreaker(3, 30*time.Second, logger)
@@ -399,6 +403,33 @@ func GetGlobalTaskRegistry() *TaskRegistry {
return globalTaskRegistry
}
// ResetGlobalTaskRegistry resets the global task registry for testing
// This should only be used in tests to prevent task exhaustion
func ResetGlobalTaskRegistry() {
globalTaskRegistryMutex.Lock()
defer globalTaskRegistryMutex.Unlock()
if globalTaskRegistry != nil {
// Stop all existing tasks
globalTaskRegistry.mu.Lock()
for _, task := range globalTaskRegistry.tasks {
if task != nil {
task.Stop()
}
}
globalTaskRegistry.tasks = make(map[string]*BackgroundTask)
// Reset circuit breaker counters
atomic.StoreInt32(&globalTaskRegistry.cb.concurrentTasks, 0)
globalTaskRegistry.cb.tasksMu.Lock()
globalTaskRegistry.cb.activeTasks = make(map[string]struct{})
globalTaskRegistry.cb.tasksMu.Unlock()
globalTaskRegistry.mu.Unlock()
}
// Reset the singleton so next call creates fresh instance
globalTaskRegistryOnce = sync.Once{}
globalTaskRegistry = nil
}
// RegisterTask registers a new background task with the registry
// and wraps the task function to track execution
func (tr *TaskRegistry) RegisterTask(name string, task *BackgroundTask) error {