func StartEnvoyAndWait()

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)
		}
	}
}