diff --git a/lib/rob/schedulers/v1/sink.go b/lib/rob/schedulers/v1/sink.go
index 93b9ecfb87abf9a0f3b208a1751cc8d27e42393d..e68a80fc8937979590b70b3a42b0b66e47f6e72e 100644
--- a/lib/rob/schedulers/v1/sink.go
+++ b/lib/rob/schedulers/v1/sink.go
@@ -111,13 +111,14 @@ func (T *Sink) _next() *Source {
 	for {
 		runtime, source, ok := T.queue.Min()
 		if !ok {
+			// unlock to allow work to be added to queue (or stolen) while we wait
+			T.mu.Unlock()
 			// attempt to steal
 			source = T.stealer.steal(T)
 			if source != nil {
+				T.mu.Lock()
 				T._assign(source)
 			} else {
-				// unlock to allow work to be added to queue while we wait
-				T.mu.Unlock()
 				select {
 				case <-T.ready:
 				case <-time.After(stealPeriod):