diff options
Diffstat (limited to 'worker.go')
-rw-r--r-- | worker.go | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -127,7 +127,7 @@ func (w *Worker) Wait() error { return &exec.ExitError{ProcessState: w.endState} } -// Stop sends soft termination command to the worker and waits for process completion. +// Detach sends soft termination command to the worker and waits for process completion. func (w *Worker) Stop() error { select { case <-w.waitDone: @@ -137,7 +137,7 @@ func (w *Worker) Stop() error { defer w.mu.Unlock() w.state.set(StateStopping) - err := sendPayload(w.rl, &stopCommand{Stop: true}) + err := sendControl(w.rl, &stopCommand{Stop: true}) <-w.waitDone return err @@ -164,34 +164,39 @@ func (w *Worker) Kill() error { // errors. Method might return JobError indicating issue with payload. func (w *Worker) Exec(rqs *Payload) (rsp *Payload, err error) { w.mu.Lock() - defer w.mu.Unlock() if rqs == nil { + w.mu.Unlock() return nil, fmt.Errorf("payload can not be empty") } if w.state.Value() != StateReady { + w.mu.Unlock() return nil, fmt.Errorf("worker is not ready (%s)", w.state.String()) } w.state.set(StateWorking) - defer w.state.registerExec() rsp, err = w.execPayload(rqs) if err != nil { if _, ok := err.(JobError); !ok { w.state.set(StateErrored) + w.state.registerExec() + w.mu.Unlock() return nil, err } } - // todo: attach when payload is complete - // todo: new status - w.state.set(StateReady) + w.state.registerExec() + w.mu.Unlock() return rsp, err } +func (w *Worker) markInvalid() { + w.state.set(StateInvalid) +} + func (w *Worker) start() error { if err := w.cmd.Start(); err != nil { close(w.waitDone) @@ -220,7 +225,8 @@ func (w *Worker) start() error { } func (w *Worker) execPayload(rqs *Payload) (rsp *Payload, err error) { - if err := sendPayload(w.rl, rqs.Context); err != nil { + // two things + if err := sendControl(w.rl, rqs.Context); err != nil { return nil, errors.Wrap(err, "header error") } |