func (s *GardenServer) streamInput(decoder *json.Decoder, in *io.PipeWriter, process garden.Process, connCloseCh chan struct{}) { for { var payload transport.ProcessPayload err := decoder.Decode(&payload) if err != nil { close(connCloseCh) in.CloseWithError(errors.New("Connection closed")) return } switch { case payload.TTY != nil: process.SetTTY(*payload.TTY) case payload.Source != nil: if payload.Data == nil { in.Close() return } else { _, err := in.Write([]byte(*payload.Data)) if err != nil { return } } case payload.Signal != nil: s.logger.Info("stream-input-process-signal", lager.Data{"payload": payload}) switch *payload.Signal { case garden.SignalKill: err = process.Signal(garden.SignalKill) if err != nil { s.logger.Error("stream-input-process-signal-kill-failed", err, lager.Data{"payload": payload}) } case garden.SignalTerminate: err = process.Signal(garden.SignalTerminate) if err != nil { s.logger.Error("stream-input-process-signal-terminate-failed", err, lager.Data{"payload": payload}) } default: s.logger.Error("stream-input-unknown-process-payload-signal", nil, lager.Data{"payload": payload}) in.Close() return } default: s.logger.Error("stream-input-unknown-process-payload", nil, lager.Data{"payload": payload}) in.Close() return } } }
JustBeforeEach(func() { var err error buff = gbytes.NewBuffer() process, err = container.Run(garden.ProcessSpec{ User: "******", Path: "sh", Args: []string{ "-c", "while true; do echo stillhere; sleep 1; done", }, }, garden.ProcessIO{Stdout: buff}) Expect(err).ToNot(HaveOccurred()) Eventually(buff).Should(gbytes.Say("stillhere")) // make sure we dont kill before the process is spawned to avoid false-positives Expect(process.Signal(garden.SignalKill)).To(Succeed()) }) It("goes away", func(done Done) { Expect(process.Wait()).NotTo(Equal(0)) Consistently(buff, "5s").ShouldNot(gbytes.Say("stillhere")) close(done) }, 30) }) }) It("avoids a race condition when sending a kill signal", func(done Done) { for i := 0; i < 20; i++ { process, err := container.Run(garden.ProcessSpec{ User: "******", Path: "sh",