From c94551f816e3cac6200558bdd2b7774f8ad41af4 Mon Sep 17 00:00:00 2001 From: Brian Seymour Date: Thu, 20 Apr 2017 20:39:29 -0700 Subject: [PATCH] possible cause of observed deadlock: removed possibility of communicating over the idle_workers channel with a lock and ending up in closenotify case causing a deadlock --- src/dispenserd/queue.go | 1 + src/dispenserd/service.go | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/dispenserd/queue.go b/src/dispenserd/queue.go index 463dbbb..8b70965 100644 --- a/src/dispenserd/queue.go +++ b/src/dispenserd/queue.go @@ -132,6 +132,7 @@ func InsertJob(job job) { } if idle_workers[lane] > 0 { + mu.Unlock() listeners[lane] <- 1 } else { mu.Unlock() diff --git a/src/dispenserd/service.go b/src/dispenserd/service.go index f133ce8..e11a337 100644 --- a/src/dispenserd/service.go +++ b/src/dispenserd/service.go @@ -9,7 +9,6 @@ import ( ) var listeners = map[string]chan int{"main": make(chan int)} -var ready = make(chan int) type generic_payload struct { Status string `json:"status"` @@ -209,16 +208,24 @@ func ServiceReceiveBlock(res http.ResponseWriter, req *http.Request) { for { select { case <-listeners[current_lane]: - if len(queue[current_lane]) == 0 { + mu.Lock() + + // empty queue or no workers means do nothing + if len(queue[current_lane]) == 0 || idle_workers[current_lane] == 0 { mu.Unlock() continue } + idle_workers[current_lane] -= 1 + send_job() + return case <-cn.CloseNotify(): mu.Lock() - idle_workers[current_lane] -= 1 + if idle_workers[current_lane] > 0 { + idle_workers[current_lane] -= 1 + } mu.Unlock() return