From 766abb6226d9351e92a98e3d883c5240fca6db8e Mon Sep 17 00:00:00 2001 From: laodouya Date: Wed, 31 Oct 2018 21:42:03 +0800 Subject: [PATCH 01/25] Update GNTE to newest master --- test/GNTE/GNTE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/GNTE/GNTE b/test/GNTE/GNTE index 956452ace..46a509a58 160000 --- a/test/GNTE/GNTE +++ b/test/GNTE/GNTE @@ -1 +1 @@ -Subproject commit 956452aceb2afdeb3b72ea041aebf1bb367ede56 +Subproject commit 46a509a5800a5acf9f6f243fd259e48551b856c2 From 44fc8e1bc574946f08bc70f5c7c9ef4f5731c470 Mon Sep 17 00:00:00 2001 From: auxten Date: Thu, 1 Nov 2018 17:07:46 +0800 Subject: [PATCH 02/25] Fix log position error when using WithXXX --- utils/log/entrylogwrapper.go | 159 +++++++++++++++++++++++++++++++++++ utils/log/logwrapper.go | 22 +++-- utils/log/logwrapper_test.go | 60 +++++++++++++ 3 files changed, 233 insertions(+), 8 deletions(-) create mode 100644 utils/log/entrylogwrapper.go diff --git a/utils/log/entrylogwrapper.go b/utils/log/entrylogwrapper.go new file mode 100644 index 000000000..125c05b74 --- /dev/null +++ b/utils/log/entrylogwrapper.go @@ -0,0 +1,159 @@ +/* + * Copyright 2018 The CovenantSQL Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package log + +import ( + "time" + + "github.com/sirupsen/logrus" +) + +type Entry logrus.Entry + +func NewEntry(logger *Logger) *Entry { + return &Entry{ + Logger: (*logrus.Logger)(logger), + // Default is five fields, give a little extra room + Data: make(logrus.Fields, 5), + } +} + +// Returns the string representation from the reader and ultimately the +// formatter. +func (entry *Entry) String() (string, error) { + return (*logrus.Entry)(entry).String() +} + +// Add an error as single field (using the key defined in ErrorKey) to the Entry. +func (entry *Entry) WithError(err error) *Entry { + return (*Entry)((*logrus.Entry)(entry).WithError(err)) +} + +// Add a single field to the Entry. +func (entry *Entry) WithField(key string, value interface{}) *Entry { + return (*Entry)((*logrus.Entry)(entry).WithField(key, value)) +} + +// Add a map of fields to the Entry. +func (entry *Entry) WithFields(fields Fields) *Entry { + return (*Entry)((*logrus.Entry)(entry).WithFields((logrus.Fields)(fields))) +} + +// Overrides the time of the Entry. +func (entry *Entry) WithTime(t time.Time) *Entry { + return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t} +} + +func (entry *Entry) Debug(args ...interface{}) { + (*logrus.Entry)(entry).Debug(args...) +} + +func (entry *Entry) Print(args ...interface{}) { + (*logrus.Entry)(entry).Print(args...) +} + +func (entry *Entry) Info(args ...interface{}) { + (*logrus.Entry)(entry).Info(args...) +} + +func (entry *Entry) Warn(args ...interface{}) { + (*logrus.Entry)(entry).Warn(args...) +} + +func (entry *Entry) Warning(args ...interface{}) { + (*logrus.Entry)(entry).Warning(args...) +} + +func (entry *Entry) Error(args ...interface{}) { + (*logrus.Entry)(entry).Error(args...) +} + +func (entry *Entry) Fatal(args ...interface{}) { + (*logrus.Entry)(entry).Fatal(args...) +} + +func (entry *Entry) Panic(args ...interface{}) { + (*logrus.Entry)(entry).Panic(args...) +} + +// Entry Printf family functions + +func (entry *Entry) Debugf(format string, args ...interface{}) { + (*logrus.Entry)(entry).Debugf(format, args...) +} + +func (entry *Entry) Infof(format string, args ...interface{}) { + (*logrus.Entry)(entry).Infof(format, args...) +} + +func (entry *Entry) Printf(format string, args ...interface{}) { + (*logrus.Entry)(entry).Printf(format, args...) +} + +func (entry *Entry) Warnf(format string, args ...interface{}) { + (*logrus.Entry)(entry).Warnf(format, args...) +} + +func (entry *Entry) Warningf(format string, args ...interface{}) { + (*logrus.Entry)(entry).Warningf(format, args...) +} + +func (entry *Entry) Errorf(format string, args ...interface{}) { + (*logrus.Entry)(entry).Errorf(format, args...) +} + +func (entry *Entry) Fatalf(format string, args ...interface{}) { + (*logrus.Entry)(entry).Fatalf(format, args...) +} + +func (entry *Entry) Panicf(format string, args ...interface{}) { + (*logrus.Entry)(entry).Panicf(format, args...) +} + +// Entry Println family functions + +func (entry *Entry) Debugln(args ...interface{}) { + (*logrus.Entry)(entry).Debugln(args...) +} + +func (entry *Entry) Infoln(args ...interface{}) { + (*logrus.Entry)(entry).Infoln(args...) +} + +func (entry *Entry) Println(args ...interface{}) { + (*logrus.Entry)(entry).Println(args...) +} + +func (entry *Entry) Warnln(args ...interface{}) { + (*logrus.Entry)(entry).Warnln(args...) +} + +func (entry *Entry) Warningln(args ...interface{}) { + (*logrus.Entry)(entry).Warningln(args...) +} + +func (entry *Entry) Errorln(args ...interface{}) { + (*logrus.Entry)(entry).Errorln(args...) +} + +func (entry *Entry) Fatalln(args ...interface{}) { + (*logrus.Entry)(entry).Fatalln(args...) +} + +func (entry *Entry) Panicln(args ...interface{}) { + (*logrus.Entry)(entry).Panicln(args...) +} diff --git a/utils/log/logwrapper.go b/utils/log/logwrapper.go index 681a51f9c..95bec51e1 100644 --- a/utils/log/logwrapper.go +++ b/utils/log/logwrapper.go @@ -22,6 +22,7 @@ import ( "path/filepath" "runtime" "strings" + "time" "github.com/sirupsen/logrus" ) @@ -96,11 +97,12 @@ func (hook *CallerHook) caller() (relFuncName, caller string) { line = 0 funcName = "unknown" ) - pcs := make([]uintptr, 10) - if runtime.Callers(7, pcs) > 0 { + pcs := make([]uintptr, 12) + if runtime.Callers(6, pcs) > 0 { frames := runtime.CallersFrames(pcs) for { f, more := frames.Next() + //fmt.Printf("%s:%d %s\n", f.File, f.Line, f.Function) if strings.HasSuffix(f.File, "logwrapper.go") && more { f, _ = frames.Next() file = f.File @@ -159,8 +161,8 @@ func AddHook(hook logrus.Hook) { } // WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. -func WithError(err error) *logrus.Entry { - return logrus.WithField(logrus.ErrorKey, err) +func WithError(err error) *Entry { + return WithField(logrus.ErrorKey, err) } // WithField creates an entry from the standard logger and adds a field to @@ -168,8 +170,8 @@ func WithError(err error) *logrus.Entry { // // Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal // or Panic on the Entry it returns. -func WithField(key string, value interface{}) *logrus.Entry { - return logrus.WithField(key, value) +func WithField(key string, value interface{}) *Entry { + return (*Entry)(logrus.WithField(key, value)) } // WithFields creates an entry from the standard logger and adds multiple @@ -178,8 +180,12 @@ func WithField(key string, value interface{}) *logrus.Entry { // // Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal // or Panic on the Entry it returns. -func WithFields(fields Fields) *logrus.Entry { - return logrus.WithFields(logrus.Fields(fields)) +func WithFields(fields Fields) *Entry { + return (*Entry)(logrus.WithFields(logrus.Fields(fields))) +} + +func WithTime(t time.Time) *Entry { + return (*Entry)(logrus.WithTime(t)) } // Debug logs a message at level Debug on the standard logger. diff --git a/utils/log/logwrapper_test.go b/utils/log/logwrapper_test.go index 5edd00c1b..91e225237 100644 --- a/utils/log/logwrapper_test.go +++ b/utils/log/logwrapper_test.go @@ -19,6 +19,9 @@ package log import ( "fmt" "testing" + "time" + + "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -78,3 +81,60 @@ func TestStandardLogger(t *testing.T) { Panic("Panic") } + +func TestWithField(t *testing.T) { + SetLevel(DebugLevel) + if GetLevel() != DebugLevel { + t.Fail() + } + f := new(Fields) + WithError(errors.New("new")).WithFields(*f).WithTime(time.Now()).Debug("Debug") + + WithFields(*f).Debug("Debug") + WithTime(time.Now()).WithError(errors.New("new")).Debug("Debug") + NewEntry(StandardLogger()).WithTime(time.Now()).String() + + WithField("k", "v").Debug("Debug") + WithField("k", "v").Debugln("Debugln") + WithField("k", "v").Debugf("Debugf %d", 1) + WithField("k", "v").Print("Print") + WithField("k", "v").Println("Println") + WithField("k", "v").Printf("Printf %d", 1) + WithField("k", "v").Info("Info") + WithField("k", "v").Infoln("Infoln") + WithField("k", "v").Infof("Infof %d", 1) + WithField("k", "v").Warning("Warning") + WithField("k", "v").Warningln("Warningln") + WithField("k", "v").Warningf("Warningf %d", 1) + WithField("k", "v").Warn("Warn") + WithField("k", "v").Warnln("Warnln") + WithField("k", "v").Warnln("Warnln") + WithField("k", "v").Warnf("Warnf %d", 1) + WithField("k", "v").Error("Error") + WithField("k", "v").Errorln("Errorln") + WithField("k", "v").Errorf("Errorf %d", 1) + defer func() { + if r := recover(); r != nil { + fmt.Println("Recovered in f", r) + } + defer func() { + if r := recover(); r != nil { + fmt.Println("Recovered in f", r) + } + defer func() { + if r := recover(); r != nil { + fmt.Println("Recovered in f", r) + } + n := NilFormatter{} + a, b := n.Format(&logrus.Entry{}) + if a != nil || b != nil { + t.Fail() + } + }() + WithField("k", "v").Panicf("Panicf %d", 1) + }() + WithField("k", "v").Panicln("Panicln") + }() + + WithField("k", "v").Panic("Panic") +} From 96f78a0e4e88256906e389b807bdb2c12d91ee6d Mon Sep 17 00:00:00 2001 From: auxten Date: Thu, 1 Nov 2018 18:23:13 +0800 Subject: [PATCH 03/25] Wait for ping success before startDBMS --- cmd/cql-minerd/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index 6fe9c0be9..c6725084b 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -27,6 +27,7 @@ import ( "os/signal" "runtime" "runtime/trace" + "sync" "syscall" "time" @@ -216,6 +217,8 @@ func main() { } }() + pingWg := sync.WaitGroup{} + pingWg.Add(1) // start block producer pinger go func() { var localNodeID proto.NodeID @@ -248,6 +251,7 @@ func main() { for _, bpNodeID := range bpNodeIDs { err := rpc.PingBP(localNodeInfo, bpNodeID) if err == nil { + pingWg.Done() return } } @@ -255,6 +259,7 @@ func main() { }() }() + pingWg.Wait() // start dbms var dbms *worker.DBMS if dbms, err = startDBMS(server); err != nil { From 2ec84766d10900e2b495130d76015d5f0e4fbca3 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 13:25:41 +0800 Subject: [PATCH 04/25] Parallel ping BP with timeout in miner --- cmd/cql-minerd/main.go | 70 ++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index c6725084b..53b690935 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -27,15 +27,15 @@ import ( "os/signal" "runtime" "runtime/trace" - "sync" "syscall" "time" + "github.com/CovenantSQL/CovenantSQL/proto" + "github.com/CovenantSQL/CovenantSQL/conf" "github.com/CovenantSQL/CovenantSQL/crypto/asymmetric" "github.com/CovenantSQL/CovenantSQL/crypto/kms" "github.com/CovenantSQL/CovenantSQL/metric" - "github.com/CovenantSQL/CovenantSQL/proto" "github.com/CovenantSQL/CovenantSQL/route" "github.com/CovenantSQL/CovenantSQL/rpc" "github.com/CovenantSQL/CovenantSQL/utils" @@ -217,49 +217,39 @@ func main() { } }() - pingWg := sync.WaitGroup{} - pingWg.Add(1) - // start block producer pinger - go func() { - var localNodeID proto.NodeID - var err error - - // get local node id - if localNodeID, err = kms.GetLocalNodeID(); err != nil { - return - } - - // get local node info - var localNodeInfo *proto.Node - if localNodeInfo, err = kms.GetNodeInfo(localNodeID); err != nil { - return - } - - log.WithField("node", localNodeInfo).Debug("construct local node info") + // get local node id + localNodeID, err := kms.GetLocalNodeID() + if err != nil { + log.Fatal(err) + } - go func() { - for { - select { - case <-time.After(time.Second): - case <-stopCh: - return - } + // get local node info + localNodeInfo, err := kms.GetNodeInfo(localNodeID) + if err != nil { + log.Fatal(err) + } - // send ping requests to block producer - bpNodeIDs := route.GetBPs() + log.WithField("node", localNodeInfo).Debug("construct local node info") - for _, bpNodeID := range bpNodeIDs { - err := rpc.PingBP(localNodeInfo, bpNodeID) - if err == nil { - pingWg.Done() - return - } - } + pingWaitCh := make(chan proto.NodeID) + bpNodeIDs := route.GetBPs() + for _, bpNodeID := range bpNodeIDs { + go func(ch chan proto.NodeID, id proto.NodeID) { + err := rpc.PingBP(localNodeInfo, id) + if err == nil { + ch <- id + return } - }() - }() + }(pingWaitCh, bpNodeID) + } + + select { + case bp := <-pingWaitCh: + log.WithField("BP", bp).Infof("ping BP succeed") + case <-time.After(5 * time.Second): + log.Fatal("ping BP timeout") + } - pingWg.Wait() // start dbms var dbms *worker.DBMS if dbms, err = startDBMS(server); err != nil { From e4311a43f2adefe651eb41c2e999f4552476583d Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 13:54:56 +0800 Subject: [PATCH 05/25] Increase PingBP timeout to 15 second --- cmd/cql-minerd/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index 53b690935..f449e8687 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -246,7 +246,7 @@ func main() { select { case bp := <-pingWaitCh: log.WithField("BP", bp).Infof("ping BP succeed") - case <-time.After(5 * time.Second): + case <-time.After(15 * time.Second): log.Fatal("ping BP timeout") } From 16000fbdf29975c8f175b54130d53041f230e00d Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 14:09:52 +0800 Subject: [PATCH 06/25] Keep trying to ping BP before timeout --- cmd/cql-minerd/main.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index f449e8687..92ff565da 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -235,10 +235,13 @@ func main() { bpNodeIDs := route.GetBPs() for _, bpNodeID := range bpNodeIDs { go func(ch chan proto.NodeID, id proto.NodeID) { - err := rpc.PingBP(localNodeInfo, id) - if err == nil { - ch <- id - return + for { + err := rpc.PingBP(localNodeInfo, id) + if err == nil { + ch <- id + return + } + time.Sleep(time.Second) } }(pingWaitCh, bpNodeID) } From f6d16a9d93028451f496da75340ffd740c99ce5b Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 15:45:23 +0800 Subject: [PATCH 07/25] Move registerNodeToBP before RPC server listen --- cmd/cql-minerd/integration_test.go | 3 +- cmd/cql-minerd/main.go | 38 ------------------ cmd/cql-minerd/node.go | 58 ++++++++++++++++++++++++++++ cmd/cql-observer/observation_test.go | 16 +++++++- cmd/cqld/bootstrap.go | 34 +--------------- 5 files changed, 76 insertions(+), 73 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index 61fbf14e5..d3c68004f 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -332,7 +332,8 @@ func TestFullProcess(t *testing.T) { 3121, 3120, }, time.Millisecond*200) - time.Sleep(2 * time.Second) + time.Sleep(10 * time.Second) + So(err, ShouldBeNil) err = client.Init(FJ(testWorkingDir, "./integration/node_c/config.yaml"), []byte("")) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index 92ff565da..716bd8fee 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -30,8 +30,6 @@ import ( "syscall" "time" - "github.com/CovenantSQL/CovenantSQL/proto" - "github.com/CovenantSQL/CovenantSQL/conf" "github.com/CovenantSQL/CovenantSQL/crypto/asymmetric" "github.com/CovenantSQL/CovenantSQL/crypto/kms" @@ -217,42 +215,6 @@ func main() { } }() - // get local node id - localNodeID, err := kms.GetLocalNodeID() - if err != nil { - log.Fatal(err) - } - - // get local node info - localNodeInfo, err := kms.GetNodeInfo(localNodeID) - if err != nil { - log.Fatal(err) - } - - log.WithField("node", localNodeInfo).Debug("construct local node info") - - pingWaitCh := make(chan proto.NodeID) - bpNodeIDs := route.GetBPs() - for _, bpNodeID := range bpNodeIDs { - go func(ch chan proto.NodeID, id proto.NodeID) { - for { - err := rpc.PingBP(localNodeInfo, id) - if err == nil { - ch <- id - return - } - time.Sleep(time.Second) - } - }(pingWaitCh, bpNodeID) - } - - select { - case bp := <-pingWaitCh: - log.WithField("BP", bp).Infof("ping BP succeed") - case <-time.After(15 * time.Second): - log.Fatal("ping BP timeout") - } - // start dbms var dbms *worker.DBMS if dbms, err = startDBMS(server); err != nil { diff --git a/cmd/cql-minerd/node.go b/cmd/cql-minerd/node.go index c28a31164..7c38bb1a9 100644 --- a/cmd/cql-minerd/node.go +++ b/cmd/cql-minerd/node.go @@ -20,6 +20,11 @@ import ( "fmt" "os" "syscall" + "time" + + "github.com/pkg/errors" + + "github.com/CovenantSQL/CovenantSQL/proto" "github.com/CovenantSQL/CovenantSQL/conf" "github.com/CovenantSQL/CovenantSQL/crypto/kms" @@ -51,6 +56,11 @@ func initNode() (server *rpc.Server, err error) { // init kms routing route.InitKMS(conf.GConf.PubKeyStoreFile) + err = registerNodeToBP(15 * time.Second) + if err != nil { + log.Fatalf("register node to BP failed: %v", err) + } + // init server if server, err = createServer( conf.GConf.PrivateKeyFile, conf.GConf.PubKeyStoreFile, masterKey, conf.GConf.ListenAddr); err != nil { @@ -73,3 +83,51 @@ func createServer(privateKeyPath, pubKeyStorePath string, masterKey []byte, list return } + +func registerNodeToBP(timeout time.Duration) (err error) { + // get local node id + localNodeID, err := kms.GetLocalNodeID() + if err != nil { + err = errors.Wrap(err, "register node to BP") + return + } + + // get local node info + localNodeInfo, err := kms.GetNodeInfo(localNodeID) + if err != nil { + err = errors.Wrap(err, "register node to BP") + return + } + + log.WithField("node", localNodeInfo).Debug("construct local node info") + + pingWaitCh := make(chan proto.NodeID) + bpNodeIDs := route.GetBPs() + for _, bpNodeID := range bpNodeIDs { + go func(ch chan proto.NodeID, id proto.NodeID) { + for { + select { + case <-ch: + return + case <-time.After(time.Second): + } + + err := rpc.PingBP(localNodeInfo, id) + if err == nil { + ch <- id + return + } + } + }(pingWaitCh, bpNodeID) + } + + select { + case bp := <-pingWaitCh: + close(pingWaitCh) + log.WithField("BP", bp).Infof("ping BP succeed") + case <-time.After(timeout): + return errors.New("ping BP timeout") + } + + return +} diff --git a/cmd/cql-observer/observation_test.go b/cmd/cql-observer/observation_test.go index 4db8dc2d9..740ff5a4d 100644 --- a/cmd/cql-observer/observation_test.go +++ b/cmd/cql-observer/observation_test.go @@ -233,11 +233,25 @@ func TestFullProcess(t *testing.T) { log.SetLevel(log.DebugLevel) Convey("test full process", t, func() { + var err error startNodes() defer stopNodes() + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + err = utils.WaitToConnect(ctx, "127.0.0.1", []int{ + 4120, + 4121, + 4122, + 4144, + 4145, + 4146, + }, time.Millisecond*200) + if err != nil { + log.Fatalf("wait for port ready timeout: %v", err) + } + time.Sleep(10 * time.Second) - var err error err = client.Init(FJ(testWorkingDir, "./observation/node_c/config.yaml"), []byte("")) So(err, ShouldBeNil) diff --git a/cmd/cqld/bootstrap.go b/cmd/cqld/bootstrap.go index 9a62c7edb..e885e5d3a 100644 --- a/cmd/cqld/bootstrap.go +++ b/cmd/cqld/bootstrap.go @@ -157,7 +157,7 @@ func runNode(nodeID proto.NodeID, listenAddr string) (err error) { peers, nodeID, 2*time.Second, - 100*time.Millisecond, + 900*time.Millisecond, ) chain, err := bp.NewChain(chainConfig) if err != nil { @@ -242,38 +242,6 @@ func initDBService(kvServer *KayakKVServer, metricService *metric.CollectServer) return } -//FIXME(auxten): clean up ugly periodicPingBlockProducer -func periodicPingBlockProducer() { - var localNodeID proto.NodeID - var err error - - // get local node id - if localNodeID, err = kms.GetLocalNodeID(); err != nil { - return - } - - // get local node info - var localNodeInfo *proto.Node - if localNodeInfo, err = kms.GetNodeInfo(localNodeID); err != nil { - return - } - - log.WithField("node", localNodeInfo).Debug("construct local node info") - - go func() { - for { - time.Sleep(time.Second) - - // send ping requests to block producer - bpNodeIDs := route.GetBPs() - - for _, bpNodeID := range bpNodeIDs { - rpc.PingBP(localNodeInfo, bpNodeID) - } - } - }() -} - func loadGenesis() *types.Block { genesisInfo := conf.GConf.BP.BPGenesis log.WithField("config", genesisInfo).Info("load genesis config") From a86a398547efdc4daa281dc589a1f70a600420ce Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 16:39:22 +0800 Subject: [PATCH 08/25] Use net.DialTimeout in testPortConnectable --- utils/net.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/net.go b/utils/net.go index 8648252ae..3b906c86c 100644 --- a/utils/net.go +++ b/utils/net.go @@ -34,8 +34,8 @@ var ( allocateLock sync.Mutex ) -func testPortConnectable(addr string) bool { - conn, err := net.Dial("tcp", addr) +func testPortConnectable(addr string, timeout time.Duration) bool { + conn, err := net.DialTimeout("tcp", addr, timeout) if err != nil { return false } else { @@ -72,7 +72,7 @@ func WaitToConnect(ctx context.Context, bindAddr string, ports []int, interval t case <-time.After(interval): for _, port := range ports { addr := net.JoinHostPort(bindAddr, fmt.Sprint(port)) - if !testPortConnectable(addr) { + if !testPortConnectable(addr, 500*time.Millisecond) { goto continueCheckC } } From a43dc3f08919179c3647c04c45d7c864a84a12b6 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 17:02:37 +0800 Subject: [PATCH 09/25] Add -failfast -parallel 8 for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 64bb794db..0097cc56c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,7 @@ before_script: - echo $TRAVIS_SECURE_ENV_VARS script: - bash build.sh - - go test -v -race $(go list ./... | grep -v "/vendor/") -coverprofile cover.out + - go test -v -race -failfast -parallel 8 $(go list ./... | grep -v "/vendor/") -coverprofile cover.out - cd rpc && go test -test.bench ^BenchmarkPersistentCaller_Call$ -test.run ^$ && cd - - gocovmerge cover.out $(find cmd -name "*.cover.out") > coverage.txt && rm -f cover.out - bash <(curl -s https://codecov.io/bash) From 297e27beba4470985afe3a74b91b6c75fdec8549 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 17:06:07 +0800 Subject: [PATCH 10/25] Remove useless TestBuild --- cmd/cql-minerd/integration_test.go | 7 ------- cmd/cql-observer/observation_test.go | 7 ------- cmd/cqld/bench_test.go | 8 -------- 3 files changed, 22 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index d3c68004f..5994b5908 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -49,13 +49,6 @@ var nodeCmds []*utils.CMD var FJ = filepath.Join -func TestBuild(t *testing.T) { - Convey("build", t, func() { - log.SetLevel(log.DebugLevel) - So(utils.Build(), ShouldBeNil) - }) -} - func startNodes() { ctx := context.Background() diff --git a/cmd/cql-observer/observation_test.go b/cmd/cql-observer/observation_test.go index 740ff5a4d..fe4061e84 100644 --- a/cmd/cql-observer/observation_test.go +++ b/cmd/cql-observer/observation_test.go @@ -52,13 +52,6 @@ var nodeCmds []*utils.CMD var FJ = filepath.Join -func TestBuild(t *testing.T) { - Convey("build", t, func() { - log.SetLevel(log.DebugLevel) - So(utils.Build(), ShouldBeNil) - }) -} - func startNodes() { // wait for ports to be available var err error diff --git a/cmd/cqld/bench_test.go b/cmd/cqld/bench_test.go index e3a0dd453..f6ffb893d 100644 --- a/cmd/cqld/bench_test.go +++ b/cmd/cqld/bench_test.go @@ -32,7 +32,6 @@ import ( "github.com/CovenantSQL/CovenantSQL/rpc" "github.com/CovenantSQL/CovenantSQL/utils" "github.com/CovenantSQL/CovenantSQL/utils/log" - . "github.com/smartystreets/goconvey/convey" ) var ( @@ -43,13 +42,6 @@ var ( var FJ = filepath.Join -func TestBuild(t *testing.T) { - Convey("build", t, func() { - log.SetLevel(log.DebugLevel) - So(utils.Build(), ShouldBeNil) - }) -} - func start3BPs() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*15) defer cancel() From 3b1062b6e49332ef36dccebbac8d0792de3095ab Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 17:21:46 +0800 Subject: [PATCH 11/25] Put cmd tests first in travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0097cc56c..d81b39872 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,7 @@ before_script: - echo $TRAVIS_SECURE_ENV_VARS script: - bash build.sh + - cd cmd && go test -v -race ./... && cd - - go test -v -race -failfast -parallel 8 $(go list ./... | grep -v "/vendor/") -coverprofile cover.out - cd rpc && go test -test.bench ^BenchmarkPersistentCaller_Call$ -test.run ^$ && cd - - gocovmerge cover.out $(find cmd -name "*.cover.out") > coverage.txt && rm -f cover.out From 6219043f154a5c25b1f8423bb5e0693b29390048 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 17:53:24 +0800 Subject: [PATCH 12/25] Add testPortConnectable log --- cmd/cql-minerd/integration_test.go | 6 +++--- cmd/cql-observer/observation_test.go | 6 +++--- cmd/cqld/bench_test.go | 2 +- utils/net.go | 5 ++++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index 5994b5908..74fef9d8c 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -107,7 +107,7 @@ func startNodes() { 3122, 3121, 3120, - }, time.Millisecond*200) + }, time.Second) if err != nil { log.Fatalf("wait for port ready timeout: %v", err) @@ -324,7 +324,7 @@ func TestFullProcess(t *testing.T) { 3122, 3121, 3120, - }, time.Millisecond*200) + }, 2*time.Second) time.Sleep(10 * time.Second) So(err, ShouldBeNil) @@ -500,7 +500,7 @@ func benchMiner(b *testing.B, minerCount uint16, bypassSign bool) { 3122, 3121, 3120, - }, time.Millisecond*200) + }, 2*time.Second) time.Sleep(time.Second) } diff --git a/cmd/cql-observer/observation_test.go b/cmd/cql-observer/observation_test.go index fe4061e84..32267fa2b 100644 --- a/cmd/cql-observer/observation_test.go +++ b/cmd/cql-observer/observation_test.go @@ -73,7 +73,7 @@ func startNodes() { []string{"-config", FJ(testWorkingDir, "./observation/node_0/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cql-observer/leader.cover.out"), }, - "leader", testWorkingDir, logDir, false, + "leader", testWorkingDir, logDir, true, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { @@ -108,7 +108,7 @@ func startNodes() { 4120, 4121, 4122, - }, time.Millisecond*200) + }, time.Second) if err != nil { log.Fatalf("wait for port ready timeout: %v", err) } @@ -238,7 +238,7 @@ func TestFullProcess(t *testing.T) { 4144, 4145, 4146, - }, time.Millisecond*200) + }, 2*time.Second) if err != nil { log.Fatalf("wait for port ready timeout: %v", err) } diff --git a/cmd/cqld/bench_test.go b/cmd/cqld/bench_test.go index f6ffb893d..0ead03fe0 100644 --- a/cmd/cqld/bench_test.go +++ b/cmd/cqld/bench_test.go @@ -89,7 +89,7 @@ func TestStartBP_CallRPC(t *testing.T) { 2122, 2121, 2120, - }, time.Millisecond*200) + }, time.Second) if err != nil { log.Fatalf("wait for port ready timeout: %v", err) } diff --git a/utils/net.go b/utils/net.go index 3b906c86c..40c6d7a48 100644 --- a/utils/net.go +++ b/utils/net.go @@ -24,6 +24,8 @@ import ( "net" "sync" "time" + + "github.com/CovenantSQL/CovenantSQL/utils/log" ) var ( @@ -37,6 +39,7 @@ var ( func testPortConnectable(addr string, timeout time.Duration) bool { conn, err := net.DialTimeout("tcp", addr, timeout) if err != nil { + log.Infof("test dial to %s failed", addr) return false } else { conn.Close() @@ -72,7 +75,7 @@ func WaitToConnect(ctx context.Context, bindAddr string, ports []int, interval t case <-time.After(interval): for _, port := range ports { addr := net.JoinHostPort(bindAddr, fmt.Sprint(port)) - if !testPortConnectable(addr, 500*time.Millisecond) { + if !testPortConnectable(addr, 100*time.Millisecond) { goto continueCheckC } } From d531ff06161dde75cf1a9371dbc030cc524c0598 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 17:55:04 +0800 Subject: [PATCH 13/25] Remove cmd test before full test --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d81b39872..0097cc56c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,6 @@ before_script: - echo $TRAVIS_SECURE_ENV_VARS script: - bash build.sh - - cd cmd && go test -v -race ./... && cd - - go test -v -race -failfast -parallel 8 $(go list ./... | grep -v "/vendor/") -coverprofile cover.out - cd rpc && go test -test.bench ^BenchmarkPersistentCaller_Call$ -test.run ^$ && cd - - gocovmerge cover.out $(find cmd -name "*.cover.out") > coverage.txt && rm -f cover.out From 49f806d1b272e0d2f70d3a57c671a546ecb65970 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 18:27:58 +0800 Subject: [PATCH 14/25] Make go test parallel 16 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0097cc56c..81282e580 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,7 @@ before_script: - echo $TRAVIS_SECURE_ENV_VARS script: - bash build.sh - - go test -v -race -failfast -parallel 8 $(go list ./... | grep -v "/vendor/") -coverprofile cover.out + - go test -v -race -failfast -parallel 16 $(go list ./... | grep -v "/vendor/") -coverprofile cover.out - cd rpc && go test -test.bench ^BenchmarkPersistentCaller_Call$ -test.run ^$ && cd - - gocovmerge cover.out $(find cmd -name "*.cover.out") > coverage.txt && rm -f cover.out - bash <(curl -s https://codecov.io/bash) From dc5fb3d75b85e10bba7dbf6d3b3480db7a58a084 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 2 Nov 2018 20:35:52 +0800 Subject: [PATCH 15/25] Try not to WaitToConnect in unit test --- cmd/cql-minerd/integration_test.go | 9 +-------- cmd/cql-observer/observation_test.go | 13 ------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index 74fef9d8c..db746dc25 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -317,14 +317,7 @@ func TestFullProcess(t *testing.T) { startNodes() defer stopNodes() var err error - err = utils.WaitToConnect(context.Background(), "127.0.0.1", []int{ - 2144, - 2145, - 2146, - 3122, - 3121, - 3120, - }, 2*time.Second) + time.Sleep(10 * time.Second) So(err, ShouldBeNil) diff --git a/cmd/cql-observer/observation_test.go b/cmd/cql-observer/observation_test.go index 32267fa2b..a0be43d42 100644 --- a/cmd/cql-observer/observation_test.go +++ b/cmd/cql-observer/observation_test.go @@ -229,19 +229,6 @@ func TestFullProcess(t *testing.T) { var err error startNodes() defer stopNodes() - ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) - defer cancel() - err = utils.WaitToConnect(ctx, "127.0.0.1", []int{ - 4120, - 4121, - 4122, - 4144, - 4145, - 4146, - }, 2*time.Second) - if err != nil { - log.Fatalf("wait for port ready timeout: %v", err) - } time.Sleep(10 * time.Second) From 3898e51db0c99e3bce0b740481c481bd75c83dd3 Mon Sep 17 00:00:00 2001 From: auxten Date: Sat, 3 Nov 2018 13:32:16 +0800 Subject: [PATCH 16/25] Switch miner log to debug level for debug --- cmd/cql-minerd/main.go | 2 +- cmd/cql-minerd/node.go | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index 716bd8fee..1da8ac364 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -117,7 +117,7 @@ func initLogs() { func main() { // set random rand.Seed(time.Now().UnixNano()) - log.SetLevel(log.InfoLevel) + log.SetLevel(log.DebugLevel) flag.Parse() if showVersion { diff --git a/cmd/cql-minerd/node.go b/cmd/cql-minerd/node.go index 7c38bb1a9..083aa2641 100644 --- a/cmd/cql-minerd/node.go +++ b/cmd/cql-minerd/node.go @@ -116,7 +116,10 @@ func registerNodeToBP(timeout time.Duration) (err error) { if err == nil { ch <- id return + } else { + log.Warnf("ping BP failed: $v", err) } + } }(pingWaitCh, bpNodeID) } From 3a72395367f14c2de6e8b3afa0cdd34b34e89b86 Mon Sep 17 00:00:00 2001 From: auxten Date: Sat, 3 Nov 2018 13:35:58 +0800 Subject: [PATCH 17/25] Fix typo --- cmd/cql-minerd/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cql-minerd/node.go b/cmd/cql-minerd/node.go index 083aa2641..f3adadfdb 100644 --- a/cmd/cql-minerd/node.go +++ b/cmd/cql-minerd/node.go @@ -117,7 +117,7 @@ func registerNodeToBP(timeout time.Duration) (err error) { ch <- id return } else { - log.Warnf("ping BP failed: $v", err) + log.Warnf("ping BP failed: %v", err) } } From a628f19fd66fa939c662b87629d2dbfdcca6bb17 Mon Sep 17 00:00:00 2001 From: auxten Date: Sat, 3 Nov 2018 15:36:30 +0800 Subject: [PATCH 18/25] Add call stack print for Error, Fatal and Panic --- utils/log/logwrapper.go | 82 +++++++++++++++++++++++++++--------- utils/log/logwrapper_test.go | 18 ++++++++ 2 files changed, 79 insertions(+), 21 deletions(-) diff --git a/utils/log/logwrapper.go b/utils/log/logwrapper.go index 95bec51e1..3c32421f5 100644 --- a/utils/log/logwrapper.go +++ b/utils/log/logwrapper.go @@ -60,11 +60,28 @@ type Logger logrus.Logger type Fields logrus.Fields // CallerHook defines caller awareness hook for logrus. -type CallerHook struct{} +type CallerHook struct { + StackLevels []logrus.Level +} + +// NewCallerHook creates new CallerHook +func NewCallerHook(stackLevels []logrus.Level) *CallerHook { + return &CallerHook{ + StackLevels: stackLevels, + } +} + +// StandardCallerHook is a convenience initializer for LogrusStackHook{} with +// default args. +func StandardCallerHook() *CallerHook { + return NewCallerHook( + []logrus.Level{logrus.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel}, + ) +} // Fire defines hook event handler. func (hook *CallerHook) Fire(entry *logrus.Entry) error { - funcDesc, caller := hook.caller() + funcDesc, caller := hook.caller(entry) fields := strings.SplitN(funcDesc, ".", 2) if len(fields) > 0 { level, ok := PkgDebugLogFilter[fields[0]] @@ -91,24 +108,32 @@ func (hook *CallerHook) Levels() []logrus.Level { } } -func (hook *CallerHook) caller() (relFuncName, caller string) { - var ( - file = "unknown" - line = 0 - funcName = "unknown" - ) +func (hook *CallerHook) caller(entry *logrus.Entry) (relFuncName, caller string) { + var skipFrames int + if len(entry.Data) == 0 { + // When WithField(s) is not used, we have 8 logrus frames to skip. + skipFrames = 8 + } else { + // When WithField(s) is used, we have 6 logrus frames to skip. + skipFrames = 6 + } + pcs := make([]uintptr, 12) - if runtime.Callers(6, pcs) > 0 { - frames := runtime.CallersFrames(pcs) + stacks := make([]runtime.Frame, 0, 12) + if runtime.Callers(skipFrames, pcs) > 0 { + var foundCaller bool + _frames := runtime.CallersFrames(pcs) for { - f, more := frames.Next() + f, more := _frames.Next() //fmt.Printf("%s:%d %s\n", f.File, f.Line, f.Function) - if strings.HasSuffix(f.File, "logwrapper.go") && more { - f, _ = frames.Next() - file = f.File - line = f.Line - funcName = f.Function - break + if !foundCaller && strings.HasSuffix(f.File, "logwrapper.go") && more { + f, _ = _frames.Next() + relFuncName = strings.TrimPrefix(f.Function, "github.com/CovenantSQL/CovenantSQL/") + caller = fmt.Sprintf("%s:%d %s", filepath.Base(f.File), f.Line, relFuncName) + foundCaller = true + } + if foundCaller { + stacks = append(stacks, f) } if !more { break @@ -116,13 +141,28 @@ func (hook *CallerHook) caller() (relFuncName, caller string) { } } - relFuncName = strings.TrimPrefix(funcName, "github.com/CovenantSQL/CovenantSQL/") - funcLocation := fmt.Sprintf("%s:%d %s", filepath.Base(file), line, relFuncName) - return relFuncName, funcLocation + if len(stacks) > 0 { + for _, level := range hook.StackLevels { + if entry.Level == level { + stacksStr := make([]string, 0, len(stacks)) + for i, s := range stacks { + if s.Line > 0 { + fName := strings.TrimPrefix(s.Function, "github.com/CovenantSQL/CovenantSQL/") + stackStr := fmt.Sprintf("#%d %s@%s:%d ", i, fName, filepath.Base(s.File), s.Line) + stacksStr = append(stacksStr, stackStr) + } + } + entry.Data["stack"] = stacksStr + break + } + } + } + + return relFuncName, caller } func init() { - AddHook(&CallerHook{}) + AddHook(StandardCallerHook()) } //var ( diff --git a/utils/log/logwrapper_test.go b/utils/log/logwrapper_test.go index 91e225237..b42061f90 100644 --- a/utils/log/logwrapper_test.go +++ b/utils/log/logwrapper_test.go @@ -21,6 +21,8 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/log" + "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -82,11 +84,27 @@ func TestStandardLogger(t *testing.T) { } +func call0() { + call1() +} + +func call1() { + call2() +} + +func call2() { + WithField("k", "v").Error("Error") + log.Error("call2 error") +} + func TestWithField(t *testing.T) { SetLevel(DebugLevel) if GetLevel() != DebugLevel { t.Fail() } + + call0() + f := new(Fields) WithError(errors.New("new")).WithFields(*f).WithTime(time.Now()).Debug("Debug") From b087a4dda150a644291f5bfdd067b14e3e841a71 Mon Sep 17 00:00:00 2001 From: auxten Date: Sat, 3 Nov 2018 16:08:06 +0800 Subject: [PATCH 19/25] Fix typo --- utils/log/logwrapper_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/utils/log/logwrapper_test.go b/utils/log/logwrapper_test.go index b42061f90..acc6dfc0d 100644 --- a/utils/log/logwrapper_test.go +++ b/utils/log/logwrapper_test.go @@ -21,8 +21,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/log" - "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -94,7 +92,7 @@ func call1() { func call2() { WithField("k", "v").Error("Error") - log.Error("call2 error") + Error("call2 error") } func TestWithField(t *testing.T) { From 8b836c7c22a8ac08cac0b8ce0bd46bfc5f1ade26 Mon Sep 17 00:00:00 2001 From: auxten Date: Sat, 3 Nov 2018 20:31:31 +0800 Subject: [PATCH 20/25] Fix registerNodeToBP race --- cmd/cql-minerd/integration_test.go | 8 ++++---- cmd/cql-minerd/node.go | 9 ++------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index db746dc25..60024948c 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -83,7 +83,7 @@ func startNodes() { []string{"-config", FJ(testWorkingDir, "./integration/node_1/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cql-minerd/follower1.cover.out"), }, - "follower1", testWorkingDir, logDir, true, + "follower1", testWorkingDir, logDir, false, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { @@ -94,7 +94,7 @@ func startNodes() { []string{"-config", FJ(testWorkingDir, "./integration/node_2/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cql-minerd/follower2.cover.out"), }, - "follower2", testWorkingDir, logDir, true, + "follower2", testWorkingDir, logDir, false, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { @@ -147,7 +147,7 @@ func startNodes() { []string{"-config", FJ(testWorkingDir, "./integration/node_miner_1/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cql-minerd/miner1.cover.out"), }, - "miner1", testWorkingDir, logDir, true, + "miner1", testWorkingDir, logDir, false, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { @@ -160,7 +160,7 @@ func startNodes() { []string{"-config", FJ(testWorkingDir, "./integration/node_miner_2/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cql-minerd/miner2.cover.out"), }, - "miner2", testWorkingDir, logDir, true, + "miner2", testWorkingDir, logDir, false, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { diff --git a/cmd/cql-minerd/node.go b/cmd/cql-minerd/node.go index f3adadfdb..04c772dc0 100644 --- a/cmd/cql-minerd/node.go +++ b/cmd/cql-minerd/node.go @@ -106,20 +106,15 @@ func registerNodeToBP(timeout time.Duration) (err error) { for _, bpNodeID := range bpNodeIDs { go func(ch chan proto.NodeID, id proto.NodeID) { for { - select { - case <-ch: - return - case <-time.After(time.Second): - } - err := rpc.PingBP(localNodeInfo, id) if err == nil { + log.Infof("ping BP succeed: %v", localNodeInfo) ch <- id return } else { log.Warnf("ping BP failed: %v", err) } - + time.Sleep(time.Second) } }(pingWaitCh, bpNodeID) } From 1cb9eff301f180e0dcd609789067b185299b1e96 Mon Sep 17 00:00:00 2001 From: auxten Date: Sun, 4 Nov 2018 12:55:33 +0800 Subject: [PATCH 21/25] Stop ping non leader BP node --- cmd/cql-minerd/node.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/cql-minerd/node.go b/cmd/cql-minerd/node.go index 04c772dc0..f1d48b6e6 100644 --- a/cmd/cql-minerd/node.go +++ b/cmd/cql-minerd/node.go @@ -19,9 +19,12 @@ package main import ( "fmt" "os" + "strings" "syscall" "time" + "github.com/CovenantSQL/CovenantSQL/kayak" + "github.com/pkg/errors" "github.com/CovenantSQL/CovenantSQL/proto" @@ -111,6 +114,9 @@ func registerNodeToBP(timeout time.Duration) (err error) { log.Infof("ping BP succeed: %v", localNodeInfo) ch <- id return + } else if strings.Contains(err.Error(), kayak.ErrNotLeader.Error()) { + log.Debug("stop ping non leader BP node") + return } else { log.Warnf("ping BP failed: %v", err) } From e3699928a13bd5862809e290db59748d2b2c8f17 Mon Sep 17 00:00:00 2001 From: auxten Date: Sun, 4 Nov 2018 15:18:43 +0800 Subject: [PATCH 22/25] Make genesis block just one day ago in test mode --- conf/config.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/conf/config.go b/conf/config.go index 29ae8f1da..044873340 100644 --- a/conf/config.go +++ b/conf/config.go @@ -177,5 +177,12 @@ func LoadConfig(configPath string) (config *Config, err error) { if config.Miner != nil && !path.IsAbs(config.Miner.RootDir) { config.Miner.RootDir = path.Join(configDir, config.Miner.RootDir) } + /* + The `go test -race` makes BP catch up block too slow, so let's make + genesis block just one day ago in test mode + */ + if config.IsTestMode { + config.BP.BPGenesis.Timestamp = time.Now().AddDate(0, 0, -1) + } return } From b269da2940b01433d962b2b1d03f0b99d49aebb4 Mon Sep 17 00:00:00 2001 From: auxten Date: Sun, 4 Nov 2018 15:28:01 +0800 Subject: [PATCH 23/25] Make golint happy --- cmd/cql-minerd/node.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/cql-minerd/node.go b/cmd/cql-minerd/node.go index f1d48b6e6..f18d705f2 100644 --- a/cmd/cql-minerd/node.go +++ b/cmd/cql-minerd/node.go @@ -114,13 +114,14 @@ func registerNodeToBP(timeout time.Duration) (err error) { log.Infof("ping BP succeed: %v", localNodeInfo) ch <- id return - } else if strings.Contains(err.Error(), kayak.ErrNotLeader.Error()) { + } + if strings.Contains(err.Error(), kayak.ErrNotLeader.Error()) { log.Debug("stop ping non leader BP node") return - } else { - log.Warnf("ping BP failed: %v", err) } - time.Sleep(time.Second) + + log.Warnf("ping BP failed: %v", err) + time.Sleep(3 * time.Second) } }(pingWaitCh, bpNodeID) } From 7443e2f85a05758809d2258e45043f05df08dc8f Mon Sep 17 00:00:00 2001 From: auxten Date: Sun, 4 Nov 2018 15:37:53 +0800 Subject: [PATCH 24/25] Add nil test for config.BP --- conf/config.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conf/config.go b/conf/config.go index 044873340..59e4a8e0c 100644 --- a/conf/config.go +++ b/conf/config.go @@ -182,7 +182,9 @@ func LoadConfig(configPath string) (config *Config, err error) { genesis block just one day ago in test mode */ if config.IsTestMode { - config.BP.BPGenesis.Timestamp = time.Now().AddDate(0, 0, -1) + if config.BP != nil { + config.BP.BPGenesis.Timestamp = time.Now().AddDate(0, 0, -1) + } } return } From 23617e8840aee32d5e994bc7f1ad89df6d9227a7 Mon Sep 17 00:00:00 2001 From: auxten Date: Sun, 4 Nov 2018 16:15:05 +0800 Subject: [PATCH 25/25] Format imports --- cmd/cql-minerd/node.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cmd/cql-minerd/node.go b/cmd/cql-minerd/node.go index f18d705f2..2b7808e0a 100644 --- a/cmd/cql-minerd/node.go +++ b/cmd/cql-minerd/node.go @@ -23,17 +23,14 @@ import ( "syscall" "time" - "github.com/CovenantSQL/CovenantSQL/kayak" - - "github.com/pkg/errors" - - "github.com/CovenantSQL/CovenantSQL/proto" - "github.com/CovenantSQL/CovenantSQL/conf" "github.com/CovenantSQL/CovenantSQL/crypto/kms" + "github.com/CovenantSQL/CovenantSQL/kayak" + "github.com/CovenantSQL/CovenantSQL/proto" "github.com/CovenantSQL/CovenantSQL/route" "github.com/CovenantSQL/CovenantSQL/rpc" "github.com/CovenantSQL/CovenantSQL/utils/log" + "github.com/pkg/errors" "golang.org/x/crypto/ssh/terminal" )