diff options
author | Valery Piashchynski <[email protected]> | 2020-12-17 02:34:44 +0300 |
---|---|---|
committer | Valery Piashchynski <[email protected]> | 2020-12-17 02:34:44 +0300 |
commit | 9d5fe4f6a98b30fd73be8259f84fa595ac994a71 (patch) | |
tree | e49c46b03d8facc73e96f1b6247d83367cc65398 /pipe_factory.go | |
parent | 1033c25b6bfc752d6059e446510f651e22cbf49b (diff) |
huge refactor
Diffstat (limited to 'pipe_factory.go')
-rwxr-xr-x | pipe_factory.go | 161 |
1 files changed, 0 insertions, 161 deletions
diff --git a/pipe_factory.go b/pipe_factory.go deleted file mode 100755 index db00c989..00000000 --- a/pipe_factory.go +++ /dev/null @@ -1,161 +0,0 @@ -package roadrunner - -import ( - "context" - "os/exec" - - "github.com/spiral/errors" - "github.com/spiral/goridge/v3" - "go.uber.org/multierr" -) - -// PipeFactory connects to stack using standard -// streams (STDIN, STDOUT pipes). -type PipeFactory struct{} - -// NewPipeFactory returns new factory instance and starts -// listening - -// todo: review tests -func NewPipeFactory() Factory { - return &PipeFactory{} -} - -type SpawnResult struct { - w WorkerBase - err error -} - -// SpawnWorker creates new WorkerProcess and connects it to goridge relay, -// method Wait() must be handled on level above. -func (f *PipeFactory) SpawnWorkerWithContext(ctx context.Context, cmd *exec.Cmd) (WorkerBase, error) { - c := make(chan SpawnResult) - const op = errors.Op("spawn worker with context") - go func() { - w, err := InitBaseWorker(cmd) - if err != nil { - c <- SpawnResult{ - w: nil, - err: errors.E(op, err), - } - return - } - - // TODO why out is in? - in, err := cmd.StdoutPipe() - if err != nil { - c <- SpawnResult{ - w: nil, - err: errors.E(op, err), - } - return - } - - // TODO why in is out? - out, err := cmd.StdinPipe() - if err != nil { - c <- SpawnResult{ - w: nil, - err: errors.E(op, err), - } - return - } - - // Init new PIPE relay - relay := goridge.NewPipeRelay(in, out) - w.AttachRelay(relay) - - // Start the worker - err = w.Start() - if err != nil { - c <- SpawnResult{ - w: nil, - err: errors.E(op, err), - } - return - } - - // errors bundle - pid, err := fetchPID(relay) - if pid != w.Pid() || err != nil { - err = multierr.Combine( - err, - w.Kill(), - w.Wait(), - ) - c <- SpawnResult{ - w: nil, - err: errors.E(op, err), - } - return - } - - // everything ok, set ready state - w.State().Set(StateReady) - - // return worker - c <- SpawnResult{ - w: w, - err: nil, - } - }() - - select { - case <-ctx.Done(): - return nil, ctx.Err() - case res := <-c: - if res.err != nil { - return nil, res.err - } - return res.w, nil - } -} - -func (f *PipeFactory) SpawnWorker(cmd *exec.Cmd) (WorkerBase, error) { - const op = errors.Op("spawn worker") - w, err := InitBaseWorker(cmd) - if err != nil { - return nil, errors.E(op, err) - } - - // TODO why out is in? - in, err := cmd.StdoutPipe() - if err != nil { - return nil, errors.E(op, err) - } - - // TODO why in is out? - out, err := cmd.StdinPipe() - if err != nil { - return nil, errors.E(op, err) - } - - // Init new PIPE relay - relay := goridge.NewPipeRelay(in, out) - w.AttachRelay(relay) - - // Start the worker - err = w.Start() - if err != nil { - return nil, errors.E(op, err) - } - - // errors bundle - if pid, err := fetchPID(relay); pid != w.Pid() { - err = multierr.Combine( - err, - w.Kill(), - w.Wait(), - ) - return nil, errors.E(op, err) - } - - // everything ok, set ready state - w.State().Set(StateReady) - return w, nil -} - -// Close the factory. -func (f *PipeFactory) Close(ctx context.Context) error { - return nil -} |