in src/go/gcsrunner/start_envoy.go [44:97]
func StartEnvoyAndWait(signalChan chan os.Signal, opts StartEnvoyOptions) error {
startupFlags := []string{
"--service-cluster", "front-envoy",
"--service-node", "front-envoy",
"--disable-hot-restart",
"--config-path", opts.ConfigPath,
"--log-level", opts.LogLevel,
"--log-path", opts.LogPath,
"--log-format", "%L%m%d %T.%e %t %@] [%t][%n]%v",
"--log-format-escaped",
"--allow-unknown-static-fields",
}
if opts.ComponentLogLevel != "" {
startupFlags = append(startupFlags, "--component-log-level", opts.ComponentLogLevel)
}
cmd := execCommand(opts.BinaryPath, startupFlags...)
cmd.Env = append(cmd.Env, "TMPDIR=/tmp")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Start(); err != nil {
return fmt.Errorf("failed to start Envoy: %v", err)
}
envoyExitChan := make(chan error)
go func() {
err := cmd.Wait()
if err == nil {
err = fmt.Errorf("unexpectedly exited OK from Envoy, which should never happen")
}
envoyExitChan <- err
}()
select {
case err := <-envoyExitChan:
return fmt.Errorf("envoy exited: %v", err)
case sig := <-signalChan:
if cmd.Process == nil {
return fmt.Errorf("cmd not started, which should never happen")
}
glog.Errorf("Stopping Envoy due to signal: %v", sig)
// This will always be a signal to stop the process.
if err := cmd.Process.Signal(sig); err != nil {
return fmt.Errorf("failed to signal Envoy: %v", err)
}
select {
case err := <-envoyExitChan:
return err
case <-time.After(opts.TerminateTimeout):
return fmt.Errorf("timed out waiting for Envoy to exit after %v", opts.TerminateTimeout)
}
}
}