@ -70,7 +70,11 @@ func (p *WorkerPool) Push(data Data) {
atomic . AddInt64 ( & p . numInQueue , 1 )
atomic . AddInt64 ( & p . numInQueue , 1 )
p . lock . Lock ( )
p . lock . Lock ( )
if p . blockTimeout > 0 && p . boostTimeout > 0 && ( p . numberOfWorkers <= p . maxNumberOfWorkers || p . maxNumberOfWorkers < 0 ) {
if p . blockTimeout > 0 && p . boostTimeout > 0 && ( p . numberOfWorkers <= p . maxNumberOfWorkers || p . maxNumberOfWorkers < 0 ) {
if p . numberOfWorkers == 0 {
p . zeroBoost ( )
} else {
p . lock . Unlock ( )
p . lock . Unlock ( )
}
p . pushBoost ( data )
p . pushBoost ( data )
} else {
} else {
p . lock . Unlock ( )
p . lock . Unlock ( )
@ -78,6 +82,40 @@ func (p *WorkerPool) Push(data Data) {
}
}
}
}
func ( p * WorkerPool ) zeroBoost ( ) {
ctx , cancel := context . WithCancel ( p . baseCtx )
mq := GetManager ( ) . GetManagedQueue ( p . qid )
boost := p . boostWorkers
if ( boost + p . numberOfWorkers ) > p . maxNumberOfWorkers && p . maxNumberOfWorkers >= 0 {
boost = p . maxNumberOfWorkers - p . numberOfWorkers
}
if mq != nil {
log . Warn ( "WorkerPool: %d (for %s) has zero workers - adding %d temporary workers for %s" , p . qid , mq . Name , boost , p . boostTimeout )
start := time . Now ( )
pid := mq . RegisterWorkers ( boost , start , true , start . Add ( p . boostTimeout ) , cancel , false )
go func ( ) {
select {
case <- ctx . Done ( ) :
case <- time . After ( p . boostTimeout ) :
}
mq . RemoveWorkers ( pid )
cancel ( )
} ( )
} else {
log . Warn ( "WorkerPool: %d has zero workers - adding %d temporary workers for %s" , p . qid , p . boostWorkers , p . boostTimeout )
go func ( ) {
select {
case <- ctx . Done ( ) :
case <- time . After ( p . boostTimeout ) :
}
cancel ( )
} ( )
}
p . lock . Unlock ( )
p . addWorkers ( ctx , boost )
}
func ( p * WorkerPool ) pushBoost ( data Data ) {
func ( p * WorkerPool ) pushBoost ( data Data ) {
select {
select {
case p . dataChan <- data :
case p . dataChan <- data :
@ -112,7 +150,7 @@ func (p *WorkerPool) pushBoost(data Data) {
log . Warn ( "WorkerPool: %d (for %s) Channel blocked for %v - adding %d temporary workers for %s, block timeout now %v" , p . qid , mq . Name , ourTimeout , boost , p . boostTimeout , p . blockTimeout )
log . Warn ( "WorkerPool: %d (for %s) Channel blocked for %v - adding %d temporary workers for %s, block timeout now %v" , p . qid , mq . Name , ourTimeout , boost , p . boostTimeout , p . blockTimeout )
start := time . Now ( )
start := time . Now ( )
pid := mq . RegisterWorkers ( boost , start , fals e, start , cancel , false )
pid := mq . RegisterWorkers ( boost , start , tru e, start . Add ( p . boostTimeout ) , cancel , false )
go func ( ) {
go func ( ) {
<- ctx . Done ( )
<- ctx . Done ( )
mq . RemoveWorkers ( pid )
mq . RemoveWorkers ( pid )