diff --git a/rpc/leak_test.go b/rpc/leak_test.go index 91b96159c..5b4a4544d 100644 --- a/rpc/leak_test.go +++ b/rpc/leak_test.go @@ -32,19 +32,22 @@ import ( func TestSessionPool_SessionBroken(t *testing.T) { log.SetLevel(log.DebugLevel) - utils.Build() var err error + err = utils.Build() + if err != nil { + t.Errorf("build failed: %v", err) + } conf.GConf, err = conf.LoadConfig(FJ(testWorkingDir, "./leak/client.yaml")) if err != nil { t.Errorf("load config from %s failed: %s", FJ(testWorkingDir, "./leak/client.yaml"), err) } log.Debugf("GConf: %##v", conf.GConf) - os.Remove(conf.GConf.PubKeyStoreFile) - os.Remove(FJ(testWorkingDir, "./leak/leader/dht.db")) - os.Remove(FJ(testWorkingDir, "./leak/leader/dht.db-shm")) - os.Remove(FJ(testWorkingDir, "./leak/leader/dht.db-wal")) - os.Remove(FJ(testWorkingDir, "./leak/kayak.db")) - os.RemoveAll(FJ(testWorkingDir, "./leak/kayak.ldb")) + _ = os.Remove(conf.GConf.PubKeyStoreFile) + _ = os.Remove(FJ(testWorkingDir, "./leak/leader/dht.db")) + _ = os.Remove(FJ(testWorkingDir, "./leak/leader/dht.db-shm")) + _ = os.Remove(FJ(testWorkingDir, "./leak/leader/dht.db-wal")) + _ = os.Remove(FJ(testWorkingDir, "./leak/kayak.db")) + _ = os.RemoveAll(FJ(testWorkingDir, "./leak/kayak.ldb")) leader, err := utils.RunCommandNB( FJ(baseDir, "./bin/cqld"), @@ -53,7 +56,8 @@ func TestSessionPool_SessionBroken(t *testing.T) { ) defer func() { - leader.Cmd.Process.Signal(syscall.SIGKILL) + _ = leader.LogFD.Close() + _ = leader.Cmd.Process.Signal(syscall.SIGKILL) }() log.Debugf("leader pid %d", leader.Cmd.Process.Pid) diff --git a/utils/exec.go b/utils/exec.go index 9509b538f..c533cd3bc 100644 --- a/utils/exec.go +++ b/utils/exec.go @@ -33,6 +33,7 @@ var FJ = filepath.Join type CMD struct { Cmd *exec.Cmd LogPath string + LogFD *os.File } // GetProjectSrcDir gets the src code root @@ -70,6 +71,9 @@ func RunCommand(bin string, args []string, processName string, workingDir string }).WithError(err).Error("start command failed") return } + defer func() { + _ = cmd.LogFD.Close() + }() err = cmd.Cmd.Wait() if err != nil { log.WithFields(log.Fields{ @@ -84,52 +88,36 @@ func RunCommand(bin string, args []string, processName string, workingDir string // RunCommandNB starts a non-blocking command func RunCommandNB(bin string, args []string, processName string, workingDir string, logDir string, toStd bool) (cmd *CMD, err error) { cmd = new(CMD) - cmd.LogPath = FJ(logDir, processName+".log") - logFD, err := os.Create(cmd.LogPath) + err = os.Chdir(workingDir) if err != nil { - log.WithField("path", cmd.LogPath).WithError(err).Error("create log file failed") + log.WithField("wd", workingDir).Error("change working dir failed") return } - err = os.Chdir(workingDir) + cmd.LogPath = FJ(logDir, processName+".log") + cmd.LogFD, err = os.Create(cmd.LogPath) if err != nil { - log.WithField("wd", workingDir).Error("change working dir failed") + log.WithField("path", cmd.LogPath).WithError(err).Error("create log file failed") return } + cmd.Cmd = exec.Command(bin, args...) - stdoutIn, _ := cmd.Cmd.StdoutPipe() - stderrIn, _ := cmd.Cmd.StderrPipe() - var stdout, stderr io.Writer if toStd { - stdout = io.MultiWriter(os.Stdout, logFD) - stderr = io.MultiWriter(os.Stderr, logFD) + cmd.Cmd.Stdout = io.MultiWriter(os.Stdout, cmd.LogFD) + cmd.Cmd.Stderr = io.MultiWriter(os.Stderr, cmd.LogFD) } else { - stdout = logFD - stderr = logFD + cmd.Cmd.Stdout = cmd.LogFD + cmd.Cmd.Stderr = cmd.LogFD } err = cmd.Cmd.Start() if err != nil { log.WithError(err).Error("cmd.Start() failed") + _ = cmd.LogFD.Close() + cmd = nil return } - go func() { - _, err := io.Copy(stdout, stdoutIn) - if err != nil { - log.WithError(err).Error("failed to capture stdout") - return - } - }() - - go func() { - _, err := io.Copy(stderr, stderrIn) - if err != nil { - log.WithError(err).Error("failed to capture stderr") - return - } - }() - return }