mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-26 06:36:43 +00:00
* initial * linters * linters * remove timeout * update pool * change pool size function * check nil * check nil * fix tests * Use execution pool from server in all handlers * simplify things * test fix * add support for cli, config * add to cli and config * merge base branch * debug statements * fix bug * atomic pointer timeout * add apis * update workerpool * fix issues * change params * fix issues * fix ipc issue * remove execution pool from IPC * revert * fix tests * mutex * refactor flag and value names * ordering fix * refactor flag and value names * update default ep size to 40 * fix bor start issues * revert file changes * debug statements * fix bug * update workerpool * atomic pointer timeout * add apis * Merge branch 'add-execution-pool' of github.com:maticnetwork/bor into arpit/add-execution-pool * fix issues * change params * fix issues * fix ipc issue * remove execution pool from IPC * revert * merge base branch * Merge branch 'add-execution-pool' of github.com:maticnetwork/bor into arpit/add-execution-pool * mutex * fix tests * Merge branch 'arpit/add-execution-pool' of github.com:maticnetwork/bor into arpit/add-execution-pool * Change default size of execution pool to 40 * refactor flag and value names * fix merge conflicts * ordering fix * refactor flag and value names * update default ep size to 40 * fix bor start issues * revert file changes * fix linters * fix go.mod * change sec to ms * change default value for ep timeout * fix node api calls * comment setter for ep timeout --------- Co-authored-by: Evgeny Danienko <6655321@bk.ru> Co-authored-by: Jerry <jerrycgh@gmail.com> Co-authored-by: Manav Darji <manavdarji.india@gmail.com>
99 lines
1.4 KiB
Go
99 lines
1.4 KiB
Go
package rpc
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"github.com/JekaMas/workerpool"
|
|
)
|
|
|
|
type SafePool struct {
|
|
executionPool *atomic.Pointer[workerpool.WorkerPool]
|
|
|
|
sync.RWMutex
|
|
|
|
timeout time.Duration
|
|
size int
|
|
|
|
// Skip sending task to execution pool
|
|
fastPath bool
|
|
}
|
|
|
|
func NewExecutionPool(initialSize int, timeout time.Duration) *SafePool {
|
|
sp := &SafePool{
|
|
size: initialSize,
|
|
timeout: timeout,
|
|
}
|
|
|
|
if initialSize == 0 {
|
|
sp.fastPath = true
|
|
|
|
return sp
|
|
}
|
|
|
|
var ptr atomic.Pointer[workerpool.WorkerPool]
|
|
|
|
p := workerpool.New(initialSize)
|
|
ptr.Store(p)
|
|
sp.executionPool = &ptr
|
|
|
|
return sp
|
|
}
|
|
|
|
func (s *SafePool) Submit(ctx context.Context, fn func() error) (<-chan error, bool) {
|
|
if s.fastPath {
|
|
go func() {
|
|
_ = fn()
|
|
}()
|
|
|
|
return nil, true
|
|
}
|
|
|
|
if s.executionPool == nil {
|
|
return nil, false
|
|
}
|
|
|
|
pool := s.executionPool.Load()
|
|
if pool == nil {
|
|
return nil, false
|
|
}
|
|
|
|
return pool.Submit(ctx, fn, s.Timeout()), true
|
|
}
|
|
|
|
func (s *SafePool) ChangeSize(n int) {
|
|
oldPool := s.executionPool.Swap(workerpool.New(n))
|
|
|
|
if oldPool != nil {
|
|
go func() {
|
|
oldPool.StopWait()
|
|
}()
|
|
}
|
|
|
|
s.Lock()
|
|
s.size = n
|
|
s.Unlock()
|
|
}
|
|
|
|
func (s *SafePool) ChangeTimeout(n time.Duration) {
|
|
s.Lock()
|
|
defer s.Unlock()
|
|
|
|
s.timeout = n
|
|
}
|
|
|
|
func (s *SafePool) Timeout() time.Duration {
|
|
s.RLock()
|
|
defer s.RUnlock()
|
|
|
|
return s.timeout
|
|
}
|
|
|
|
func (s *SafePool) Size() int {
|
|
s.RLock()
|
|
defer s.RUnlock()
|
|
|
|
return s.size
|
|
}
|