From 29d5b4af700192358dc95060027522f1fb8ba4b4 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 27 Mar 2019 09:49:47 +0000 Subject: [PATCH] dialQueue: start the control loop later Don't start the control loop till we start the queue. The _in_ queue will still work, we just won't start processing peers from it until we start the control loop. fixes #311 --- dial_queue.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/dial_queue.go b/dial_queue.go index 6635d8206..07adddf86 100644 --- a/dial_queue.go +++ b/dial_queue.go @@ -110,18 +110,13 @@ func newDialQueue(params *dqParams) (*dialQueue, error) { dieCh: make(chan struct{}, params.config.maxParallelism), } - go dq.control() return dq, nil } // Start initiates action on this dial queue. It should only be called once; subsequent calls are ignored. func (dq *dialQueue) Start() { dq.startOnce.Do(func() { - tgt := int(dq.dqParams.config.minParallelism) - for i := 0; i < tgt; i++ { - go dq.worker() - } - dq.nWorkers = uint(tgt) + go dq.control() }) } @@ -139,6 +134,16 @@ func (dq *dialQueue) control() { waiting = nil }() + // start workers + + tgt := int(dq.dqParams.config.minParallelism) + for i := 0; i < tgt; i++ { + go dq.worker() + } + dq.nWorkers = uint(tgt) + + // control workers + for { // First process any backlog of dial jobs and waiters -- making progress is the priority. // This block is copied below; couldn't find a more concise way of doing this.