You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.0 KiB
99 lines
2.0 KiB
/* |
|
------------------------------------------------------------------------------------------------------------------------ |
|
####### sdk ####### Copyright (c) 2021-2022 losyme ################################################# MIT License ####### |
|
------------------------------------------------------------------------------------------------------------------------ |
|
*/ |
|
|
|
package workers |
|
|
|
import ( |
|
"context" |
|
|
|
"forge.chapril.org/dune/sdk" |
|
"forge.chapril.org/losyme/zombie" |
|
"github.com/Showmax/go-fqdn" |
|
) |
|
|
|
type pool struct { |
|
host string |
|
model sdk.Model |
|
runner sdk.Runner |
|
logger Logger |
|
state *state |
|
workers map[string]*worker |
|
stopCh chan bool |
|
zombie *zombie.GWContext |
|
} |
|
|
|
func newPool(cfg *Config, state *state) *pool { |
|
fqdn, err := fqdn.FqdnHostname() |
|
if err != nil { |
|
fqdn = "?" |
|
} |
|
|
|
zombie := zombie.NewGWContext( |
|
context.Background(), |
|
zombie.WithLogger(cfg.Logger), |
|
) |
|
|
|
return &pool{ |
|
host: fqdn, |
|
model: cfg.Model, |
|
runner: cfg.Runner, |
|
logger: cfg.Logger, |
|
state: state, |
|
workers: make(map[string]*worker), |
|
stopCh: make(chan bool, _maxPoolSize), |
|
zombie: zombie, |
|
} |
|
} |
|
|
|
func (p *pool) size() int { |
|
return len(p.workers) |
|
} |
|
|
|
func (p *pool) startOneWorker(stoppedCh chan<- string) { |
|
worker := newWorker(p.host, p.model, p.runner, p.logger, p.state) |
|
p.workers[worker.id] = worker |
|
|
|
p.zombie.Go( |
|
1, |
|
func(ctx context.Context, _ int) { |
|
worker.run(ctx, p.stopCh, stoppedCh) |
|
}, |
|
"worker", |
|
) |
|
} |
|
|
|
func (p *pool) stopOneWorker() { |
|
p.stopCh <- true |
|
} |
|
|
|
func (p *pool) workerStopped(wID string, end bool) int { |
|
worker, ok := p.workers[wID] |
|
if ok { |
|
delete(p.workers, worker.id) |
|
|
|
if !end && p.logger != nil { |
|
p.logger.Warning("A worker has stopped", "worker", wID) //:::::::::::::::::::::::::::::::::::::::::::::::::: |
|
} |
|
} |
|
|
|
return p.size() |
|
} |
|
|
|
func (p *pool) stop() { |
|
if z := p.zombie; z != nil { |
|
z.Stop() |
|
} |
|
} |
|
|
|
func (p *pool) wait() { |
|
if z := p.zombie; z != nil { |
|
z.Wait() |
|
} |
|
} |
|
|
|
/* |
|
######################################################################################################## @(°_°)@ ####### |
|
*/
|
|
|