Browse Source

Merge pull request #4536 from gyuho/tidy_cleanup

etcd-agent: tidy cleanup before SIGKILL
Gyu-Ho Lee 10 years ago
parent
commit
82c3600cfa
1 changed files with 25 additions and 5 deletions
  1. 25 5
      tools/functional-tester/etcd-agent/agent.go

+ 25 - 5
tools/functional-tester/etcd-agent/agent.go

@@ -21,6 +21,7 @@ import (
 	"os"
 	"os/exec"
 	"path"
+	"syscall"
 	"time"
 
 	"github.com/coreos/etcd/pkg/netutil"
@@ -80,18 +81,37 @@ func (a *Agent) stop() error {
 	if a.state != stateStarted {
 		return nil
 	}
-	err := a.cmd.Process.Kill()
+
+	err := sigtermAndWait(a.cmd)
 	if err != nil {
 		return err
 	}
-	_, err = a.cmd.Process.Wait()
+
+	a.state = stateStopped
+	return nil
+}
+
+func sigtermAndWait(cmd *exec.Cmd) error {
+	err := cmd.Process.Signal(syscall.SIGTERM)
 	if err != nil {
 		return err
-
 	}
 
-	a.state = stateStopped
-	return nil
+	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.