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
This commit is contained in:
Steven Allen 2019-03-27 09:49:47 +00:00
parent 6433bf68f3
commit 29d5b4af70

View File

@ -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.