From bd637a14aa2527adf30e9a41af51f3cff6186731 Mon Sep 17 00:00:00 2001 From: Andy Pan Date: Mon, 18 Sep 2023 22:27:00 +0800 Subject: [PATCH] bug: return the error from Pool.Submit/PoolWithFunc.Invoke accordingly --- pool.go | 13 +++++++------ pool_func.go | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/pool.go b/pool.go index bdf34541..a3608bf0 100644 --- a/pool.go +++ b/pool.go @@ -219,11 +219,12 @@ func (p *Pool) Submit(task func()) error { if p.IsClosed() { return ErrPoolClosed } - if w := p.retrieveWorker(); w != nil { + + w, err := p.retrieveWorker() + if w != nil { w.inputFunc(task) - return nil } - return ErrPoolOverload + return err } // Running returns the number of workers currently running. @@ -332,7 +333,7 @@ func (p *Pool) addWaiting(delta int) { } // retrieveWorker returns an available worker to run the tasks. -func (p *Pool) retrieveWorker() (w worker) { +func (p *Pool) retrieveWorker() (w worker, err error) { p.lock.Lock() retry: @@ -354,7 +355,7 @@ retry: // Bail out early if it's in nonblocking mode or the number of pending callers reaches the maximum limit value. if p.options.Nonblocking || (p.options.MaxBlockingTasks != 0 && p.Waiting() >= p.options.MaxBlockingTasks) { p.lock.Unlock() - return + return nil, ErrPoolOverload } // Otherwise, we'll have to keep them blocked and wait for at least one worker to be put back into pool. @@ -364,7 +365,7 @@ retry: if p.IsClosed() { p.lock.Unlock() - return + return nil, ErrPoolClosed } goto retry diff --git a/pool_func.go b/pool_func.go index e41ae0e5..4934bb04 100644 --- a/pool_func.go +++ b/pool_func.go @@ -225,11 +225,12 @@ func (p *PoolWithFunc) Invoke(args interface{}) error { if p.IsClosed() { return ErrPoolClosed } - if w := p.retrieveWorker(); w != nil { + + w, err := p.retrieveWorker() + if w != nil { w.inputParam(args) - return nil } - return ErrPoolOverload + return err } // Running returns the number of workers currently running. @@ -338,7 +339,7 @@ func (p *PoolWithFunc) addWaiting(delta int) { } // retrieveWorker returns an available worker to run the tasks. -func (p *PoolWithFunc) retrieveWorker() (w worker) { +func (p *PoolWithFunc) retrieveWorker() (w worker, err error) { p.lock.Lock() retry: @@ -360,7 +361,7 @@ retry: // Bail out early if it's in nonblocking mode or the number of pending callers reaches the maximum limit value. if p.options.Nonblocking || (p.options.MaxBlockingTasks != 0 && p.Waiting() >= p.options.MaxBlockingTasks) { p.lock.Unlock() - return + return nil, ErrPoolOverload } // Otherwise, we'll have to keep them blocked and wait for at least one worker to be put back into pool. @@ -370,7 +371,7 @@ retry: if p.IsClosed() { p.lock.Unlock() - return + return nil, ErrPoolClosed } goto retry