Merge pull request #4536 from gyuho/tidy_cleanup

etcd-agent: tidy cleanup before SIGKILL
This commit is contained in:
Gyu-Ho Lee 2016-02-16 13:25:40 -08:00
commit 82c3600cfa

View File

@ -21,6 +21,7 @@ import (
"os"
"os/exec"
"path"
"syscall"
"time"
"github.com/coreos/etcd/pkg/netutil"
@ -80,20 +81,39 @@ func (a *Agent) stop() error {
if a.state != stateStarted {
return nil
}
err := a.cmd.Process.Kill()
if err != nil {
return err
}
_, err = a.cmd.Process.Wait()
if err != nil {
return err
err := sigtermAndWait(a.cmd)
if err != nil {
return err
}
a.state = stateStopped
return nil
}
func sigtermAndWait(cmd *exec.Cmd) error {
err := cmd.Process.Signal(syscall.SIGTERM)
if err != nil {
return err
}
errc := make(chan error)
go func() {
_, err := cmd.Process.Wait()
errc <- err
close(errc)
}()
select {
case <-time.After(5 * time.Second):
cmd.Process.Kill()
case err := <-errc:
return err
}
err = <-errc
return err
}
// restart restarts the stopped etcd process.
func (a *Agent) restart() error {
a.cmd = exec.Command(a.cmd.Path, a.cmd.Args[1:]...)