From 8b2a9f0433e938133e43108275e8968950cb5754 Mon Sep 17 00:00:00 2001 From: auxten Date: Tue, 25 Dec 2018 11:36:06 +0800 Subject: [PATCH 1/3] Fix RunCommandNB pipe issue --- utils/exec.go | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/utils/exec.go b/utils/exec.go index 9509b538f..3f405668b 100644 --- a/utils/exec.go +++ b/utils/exec.go @@ -97,16 +97,13 @@ func RunCommandNB(bin string, args []string, processName string, workingDir stri 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, logFD) + cmd.Cmd.Stderr = io.MultiWriter(os.Stderr, logFD) } else { - stdout = logFD - stderr = logFD + cmd.Cmd.Stdout = logFD + cmd.Cmd.Stderr = logFD } err = cmd.Cmd.Start() @@ -115,21 +112,5 @@ func RunCommandNB(bin string, args []string, processName string, workingDir stri 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 } From e05d2fc8959c5370caa79107db68171f083634c8 Mon Sep 17 00:00:00 2001 From: auxten Date: Tue, 25 Dec 2018 13:06:44 +0800 Subject: [PATCH 2/3] Put LogFD in CMD struct for RunCommandNB defer close --- cmd/cql-adapter/storage/sqlite3.go | 1 + cmd/cql-faucet/persistence.go | 1 + cmd/cql-minerd/main.go | 1 + crypto/hash/hashfuncs.go | 1 + rpc/leak_test.go | 20 ++++++++++++-------- storage/storage.go | 1 + utils/exec.go | 25 ++++++++++++++++--------- xenomint/xxx_test.go | 1 + 8 files changed, 34 insertions(+), 17 deletions(-) diff --git a/cmd/cql-adapter/storage/sqlite3.go b/cmd/cql-adapter/storage/sqlite3.go index aac13f94d..d9be539d8 100644 --- a/cmd/cql-adapter/storage/sqlite3.go +++ b/cmd/cql-adapter/storage/sqlite3.go @@ -24,6 +24,7 @@ import ( "math/rand" "os" "path/filepath" + // Import sqlite3 manually. _ "github.com/CovenantSQL/go-sqlite3-encrypt" ) diff --git a/cmd/cql-faucet/persistence.go b/cmd/cql-faucet/persistence.go index dfdc3d458..140a6c6d6 100644 --- a/cmd/cql-faucet/persistence.go +++ b/cmd/cql-faucet/persistence.go @@ -26,6 +26,7 @@ import ( "github.com/CovenantSQL/CovenantSQL/conf" "github.com/CovenantSQL/CovenantSQL/utils/log" uuid "github.com/satori/go.uuid" + // Load sqlite3 database driver. _ "github.com/CovenantSQL/go-sqlite3-encrypt" ) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index eb8016255..f1fc11c16 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -26,6 +26,7 @@ import ( "os" "os/signal" "runtime" + //"runtime/trace" "syscall" "time" diff --git a/crypto/hash/hashfuncs.go b/crypto/hash/hashfuncs.go index d3cd98561..af14cf46d 100644 --- a/crypto/hash/hashfuncs.go +++ b/crypto/hash/hashfuncs.go @@ -19,6 +19,7 @@ package hash import ( "encoding/binary" "hash/fnv" + // "crypto/sha256" benchmark is at least 10% faster on // i7-4870HQ CPU @ 2.50GHz than "github.com/minio/sha256-simd" "crypto/sha256" diff --git a/rpc/leak_test.go b/rpc/leak_test.go index 91b96159c..0ffe4d1e9 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 { + log.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/storage/storage.go b/storage/storage.go index 7e36bad0e..e059819af 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -26,6 +26,7 @@ import ( "github.com/CovenantSQL/CovenantSQL/twopc" "github.com/CovenantSQL/CovenantSQL/utils/log" + // Register CovenantSQL/go-sqlite3-encrypt engine. _ "github.com/CovenantSQL/go-sqlite3-encrypt" ) diff --git a/utils/exec.go b/utils/exec.go index 3f405668b..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,31 +88,34 @@ 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...) if toStd { - cmd.Cmd.Stdout = io.MultiWriter(os.Stdout, logFD) - cmd.Cmd.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 { - cmd.Cmd.Stdout = logFD - cmd.Cmd.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 } diff --git a/xenomint/xxx_test.go b/xenomint/xxx_test.go index 13a973878..6e19f1b08 100644 --- a/xenomint/xxx_test.go +++ b/xenomint/xxx_test.go @@ -22,6 +22,7 @@ import ( "os" "path" "sync/atomic" + //"runtime/trace" "sync" "syscall" From c9c94e9b20c735ce46d4b8779bf74f4b920c2b7b Mon Sep 17 00:00:00 2001 From: auxten Date: Tue, 25 Dec 2018 13:33:12 +0800 Subject: [PATCH 3/3] Fix typo --- rpc/leak_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc/leak_test.go b/rpc/leak_test.go index 0ffe4d1e9..5b4a4544d 100644 --- a/rpc/leak_test.go +++ b/rpc/leak_test.go @@ -35,7 +35,7 @@ func TestSessionPool_SessionBroken(t *testing.T) { var err error err = utils.Build() if err != nil { - log.Errorf("build failed: %v", err) + t.Errorf("build failed: %v", err) } conf.GConf, err = conf.LoadConfig(FJ(testWorkingDir, "./leak/client.yaml")) if err != nil {