summaryrefslogtreecommitdiff
path: root/pipe_factory.go
diff options
context:
space:
mode:
authorValery Piashchynski <[email protected]>2020-12-17 02:34:44 +0300
committerValery Piashchynski <[email protected]>2020-12-17 02:34:44 +0300
commit9d5fe4f6a98b30fd73be8259f84fa595ac994a71 (patch)
treee49c46b03d8facc73e96f1b6247d83367cc65398 /pipe_factory.go
parent1033c25b6bfc752d6059e446510f651e22cbf49b (diff)
huge refactor
Diffstat (limited to 'pipe_factory.go')
-rwxr-xr-xpipe_factory.go161
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
-}