From b64db6716f1a10d4517ee9e34c9a11a18558ec60 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 15 Aug 2023 15:03:47 -0600
Subject: [PATCH] Fix deadlock/race conditions in scheduled tasks reload

---
 tasks/schedule.go | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/tasks/schedule.go b/tasks/schedule.go
index 2af82810..576c33b0 100644
--- a/tasks/schedule.go
+++ b/tasks/schedule.go
@@ -71,15 +71,23 @@ func scheduleHourly(name RecurringTaskName, workFn RecurringTaskFn) {
 	recurLock.Lock()
 	defer recurLock.Unlock()
 	if val, ok := recurDoneChs[name]; ok {
-		val <- true // close that channel
+		// Check if closed, and close if needed
+		select {
+		case <-val:
+			break // already closed
+		default:
+			val <- true // close that channel
+		}
 	}
 	recurDoneChs[name] = ch
 	go func() {
-		defer close(ch)
 		defer func() {
+			close(ch)
 			recurLock.Lock()
 			defer recurLock.Unlock()
-			delete(recurDoneChs, name)
+			if recurDoneChs[name] == ch {
+				delete(recurDoneChs, name)
+			}
 		}()
 
 		for {
-- 
GitLab