From 77353092cfe5a631e1b05468fe54d40054d89346 Mon Sep 17 00:00:00 2001 From: auxten Date: Thu, 3 Jan 2019 17:41:28 +0800 Subject: [PATCH 01/12] Fix matchProvidersWithUser inconsistent --- blockproducer/metastate.go | 78 +++++++++++++++++++++--------- blockproducer/metastate_test.go | 84 +++++++++++++++++++++++++++++++-- 2 files changed, 138 insertions(+), 24 deletions(-) diff --git a/blockproducer/metastate.go b/blockproducer/metastate.go index bb74b0937..5869e72b1 100644 --- a/blockproducer/metastate.go +++ b/blockproducer/metastate.go @@ -18,6 +18,7 @@ package blockproducer import ( "bytes" + "sort" "time" pi "github.com/CovenantSQL/CovenantSQL/blockproducer/interfaces" @@ -44,6 +45,20 @@ type metaState struct { dirty, readonly *metaIndex } +// MinerInfos is MinerInfo array +type MinerInfos []*types.MinerInfo + +// Len returns the length of the uints array. +func (x MinerInfos) Len() int { return len(x) } + +// Less returns true if MinerInfo i is less than node j. +func (x MinerInfos) Less(i, j int) bool { + return x[i].NodeID < x[j].NodeID +} + +// Swap exchanges MinerInfo i and j. +func (x MinerInfos) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + func newMetaState() *metaState { return &metaState{ dirty: newMetaIndex(), @@ -641,7 +656,7 @@ func (s *metaState) matchProvidersWithUser(tx *types.CreateDatabase) (err error) return } - miners := make([]*types.MinerInfo, 0, minerCount) + miners := make(MinerInfos, 0, minerCount) for _, m := range tx.ResourceMeta.TargetMiners { if po, loaded := s.loadProviderObject(m); !loaded { @@ -669,28 +684,14 @@ func (s *metaState) matchProvidersWithUser(tx *types.CreateDatabase) (err error) err = errors.Wrapf(err, "miners match target are not enough %d:%d", len(miners), minerCount) return } - // try old miners first - for _, po := range s.readonly.provider { - miners, _ = filterAndAppendMiner(miners, po, tx, sender) - // if got enough, break - if uint64(len(miners)) == minerCount { - break - } - } - // try fresh miners - if uint64(len(miners)) < minerCount { - for _, po := range s.dirty.provider { - miners, _ = filterAndAppendMiner(miners, po, tx, sender) - // if got enough, break - if uint64(len(miners)) == minerCount { - break - } - } - } - if uint64(len(miners)) < minerCount { - err = ErrNoEnoughMiner + var newMiners MinerInfos + // create new merged map + newMiners, err = s.filterNMiners(tx, sender, int(minerCount)-len(miners)) + if err != nil { return } + + miners = append(miners, newMiners...) } // generate new sqlchain id and address @@ -763,6 +764,41 @@ func (s *metaState) matchProvidersWithUser(tx *types.CreateDatabase) (err error) return } +func (s *metaState) filterNMiners( + tx *types.CreateDatabase, + user proto.AccountAddress, + minerCount int) ( + m MinerInfos, err error, +) { + // create new merged map + allProviderMap := make(map[proto.AccountAddress]*types.ProviderProfile) + for k, v := range s.readonly.provider { + allProviderMap[k] = v + } + for k, v := range s.dirty.provider { + allProviderMap[k] = v + } + + // delete selected target miners + for _, m := range tx.ResourceMeta.TargetMiners { + delete(allProviderMap, m) + } + + // suppose 1/4 miners match + newMiners := make(MinerInfos, 0, len(allProviderMap)/4) + // filter all miners to slice and sort + for _, po := range allProviderMap { + newMiners, _ = filterAndAppendMiner(newMiners, po, tx, user) + } + if len(newMiners) < minerCount { + err = ErrNoEnoughMiner + return + } + + sort.Slice(newMiners, newMiners.Less) + return newMiners[:minerCount], nil +} + func filterAndAppendMiner( miners []*types.MinerInfo, po *types.ProviderProfile, diff --git a/blockproducer/metastate_test.go b/blockproducer/metastate_test.go index 53ed86379..4c44b8745 100644 --- a/blockproducer/metastate_test.go +++ b/blockproducer/metastate_test.go @@ -31,6 +31,8 @@ import ( "github.com/CovenantSQL/CovenantSQL/proto" "github.com/CovenantSQL/CovenantSQL/route" "github.com/CovenantSQL/CovenantSQL/types" + "github.com/CovenantSQL/CovenantSQL/utils/log" + "github.com/pkg/errors" . "github.com/smartystreets/goconvey/convey" ) @@ -639,7 +641,7 @@ func TestMetaState(t *testing.T) { types.NewBaseAccount( &types.Account{ Address: addr2, - TokenBalance: [types.SupportTokenNumber]uint64{10000000, 100}, + TokenBalance: [types.SupportTokenNumber]uint64{10000000000, 100}, }, ), types.NewBaseAccount( @@ -755,7 +757,7 @@ func TestMetaState(t *testing.T) { Owner: addr3, ResourceMeta: types.ResourceMeta{ TargetMiners: []proto.AccountAddress{addr2}, - Node: 10, + Node: 2, Space: 9, Memory: 9, LoadAvgPerCPU: 0.1, @@ -764,11 +766,30 @@ func TestMetaState(t *testing.T) { }, Nonce: 1, GasPrice: 1, - AdvancePayment: uint64(conf.GConf.QPS) * uint64(conf.GConf.BillingPeriod) * 10, + AdvancePayment: uint64(conf.GConf.QPS) * uint64(conf.GConf.BillingPeriod) * 2, }, } err = invalidCd7.Sign(privKey3) So(err, ShouldBeNil) + invalidCd8 := types.CreateDatabase{ + CreateDatabaseHeader: types.CreateDatabaseHeader{ + Owner: addr2, + ResourceMeta: types.ResourceMeta{ + TargetMiners: []proto.AccountAddress{addr2}, + Node: 2, + Space: 9, + Memory: 9, + LoadAvgPerCPU: 0.1, + UseEventualConsistency: false, + ConsistencyLevel: 0, + }, + Nonce: 1, + GasPrice: 1, + AdvancePayment: uint64(conf.GConf.QPS) * uint64(conf.GConf.BillingPeriod) * 2, + }, + } + err = invalidCd8.Sign(privKey2) + So(err, ShouldBeNil) err = ms.apply(&invalidPs) So(errors.Cause(err), ShouldEqual, ErrInsufficientBalance) @@ -833,6 +854,63 @@ func TestMetaState(t *testing.T) { } err = ms.apply(&invalidCd7) So(errors.Cause(err), ShouldEqual, ErrNoEnoughMiner) + + ms.readonly.provider[proto.AccountAddress(hash.HashH([]byte("9")))] = &types.ProviderProfile{ + TargetUser: []proto.AccountAddress{addr2}, + GasPrice: 1, + LoadAvgPerCPU: 0.001, + Memory: 100, + Space: 100, + TokenType: 0, + NodeID: "0001111", + } + ms.dirty.provider[proto.AccountAddress(hash.HashH([]byte("9")))] = &types.ProviderProfile{ + TargetUser: []proto.AccountAddress{addr2}, + GasPrice: 1, + LoadAvgPerCPU: 0.001, + Memory: 100, + Space: 100, + TokenType: 0, + NodeID: "0002111", + } + ms.dirty.provider[proto.AccountAddress(hash.HashH([]byte("10")))] = &types.ProviderProfile{ + TargetUser: []proto.AccountAddress{addr2}, + GasPrice: 1, + LoadAvgPerCPU: 0.001, + Memory: 100, + Space: 100, + TokenType: 0, + NodeID: "0003111", + } + ms.dirty.provider[proto.AccountAddress(hash.HashH([]byte("11")))] = &types.ProviderProfile{ + TargetUser: []proto.AccountAddress{addr2}, + GasPrice: 1, + LoadAvgPerCPU: 0.001, + Memory: 100, + Space: 100, + TokenType: 0, + NodeID: "0000003", + } + ms.dirty.provider[proto.AccountAddress(hash.HashH([]byte("12")))] = &types.ProviderProfile{ + TargetUser: []proto.AccountAddress{addr2}, + GasPrice: 1, + LoadAvgPerCPU: 0.001, + Memory: 100, + Space: 100, + TokenType: 0, + NodeID: "0000001", + } + err = ms.apply(&invalidCd8) + So(err, ShouldBeNil) + dbID := proto.FromAccountAndNonce(addr2, uint32(invalidCd8.Nonce)) + + mIDs := make([]string, 0) + for _, m := range ms.dirty.databases[dbID].Miners { + mIDs = append(mIDs, string(m.NodeID)) + } + log.Debugf("mIDs: %v", mIDs) + So(mIDs, ShouldContain, "0000003") + So(mIDs, ShouldContain, "0000001") }) Convey("When SQLChain create", func() { ps := types.ProvideService{ From 138b8b7ee90d89bbe4bc1244b4cf83cc713ada7f Mon Sep 17 00:00:00 2001 From: auxten Date: Thu, 3 Jan 2019 17:53:12 +0800 Subject: [PATCH 02/12] Fix dirty provider value nil --- blockproducer/metastate.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/blockproducer/metastate.go b/blockproducer/metastate.go index 5869e72b1..0be7978d0 100644 --- a/blockproducer/metastate.go +++ b/blockproducer/metastate.go @@ -748,7 +748,7 @@ func (s *metaState) matchProvidersWithUser(tx *types.CreateDatabase) (err error) Owner: sender, Users: users, EncodedGenesis: enc.Bytes(), - Miners: miners[:], + Miners: miners, } if _, loaded := s.loadSQLChainObject(dbID); loaded { @@ -757,8 +757,8 @@ func (s *metaState) matchProvidersWithUser(tx *types.CreateDatabase) (err error) } s.dirty.accounts[dbAddr] = &types.Account{Address: dbAddr} s.dirty.databases[dbID] = sp - for _, miner := range tx.ResourceMeta.TargetMiners { - s.deleteProviderObject(miner) + for _, miner := range miners { + s.deleteProviderObject(miner.Address) } log.Infof("success create sqlchain with database ID: %s", dbID) return @@ -776,6 +776,9 @@ func (s *metaState) filterNMiners( allProviderMap[k] = v } for k, v := range s.dirty.provider { + if v == nil { + delete(allProviderMap, k) + } allProviderMap[k] = v } From a0f2411080bc205a22c50e2b7fc3983462f4edb1 Mon Sep 17 00:00:00 2001 From: auxten Date: Thu, 3 Jan 2019 18:29:55 +0800 Subject: [PATCH 03/12] Rename conf.GConf.Miner.MetricCollectInterval to conf.GConf.Miner.ProvideServiceInterval --- cmd/cql-minerd/main.go | 4 ++-- cmd/cql-utils/confgen.go | 2 +- cmd/cql-utils/keygen.go | 2 +- conf/config.go | 6 +++--- test/GNTE/conf/node_miner_10.250.100.2/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.3/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.4/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.5/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.6/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.7/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.8/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.9/config.yaml | 2 +- test/fuse/node_miner_0/config.yaml | 2 +- test/fuse/node_miner_1/config.yaml | 2 +- test/fuse/node_miner_2/config.yaml | 2 +- test/integration/node_miner_0/config.yaml | 2 +- test/integration/node_miner_1/config.yaml | 2 +- test/integration/node_miner_2/config.yaml | 2 +- test/mainchain/node_miner_0/config.yaml | 2 +- test/mainchain/node_miner_1/config.yaml | 2 +- test/mainchain/node_miner_2/config.yaml | 2 +- test/observation/node_miner_0/config.yaml | 2 +- test/observation/node_miner_1/config.yaml | 2 +- test/observation/node_miner_2/config.yaml | 2 +- test/service/node_miner_0/config.yaml | 2 +- test/service/node_miner_1/config.yaml | 2 +- test/service/node_miner_2/config.yaml | 2 +- 27 files changed, 30 insertions(+), 30 deletions(-) diff --git a/cmd/cql-minerd/main.go b/cmd/cql-minerd/main.go index 44e42c4e3..dd60cebc5 100644 --- a/cmd/cql-minerd/main.go +++ b/cmd/cql-minerd/main.go @@ -139,7 +139,7 @@ func main() { if conf.GConf.Miner == nil { log.Fatal("miner config does not exists") } - if conf.GConf.Miner.MetricCollectInterval.Seconds() <= 0 { + if conf.GConf.Miner.ProvideServiceInterval.Seconds() <= 0 { log.Fatal("miner metric collect interval is invalid") } if conf.GConf.Miner.MaxReqTimeGap.Seconds() <= 0 { @@ -188,7 +188,7 @@ func main() { // start prometheus collector reg := metric.StartMetricCollector() - tick := time.NewTicker(conf.GConf.Miner.MetricCollectInterval) + tick := time.NewTicker(conf.GConf.Miner.ProvideServiceInterval) defer tick.Stop() for { diff --git a/cmd/cql-utils/confgen.go b/cmd/cql-utils/confgen.go index 1033eba5f..0c8ee487c 100644 --- a/cmd/cql-utils/confgen.go +++ b/cmd/cql-utils/confgen.go @@ -51,7 +51,7 @@ func runConfgen() { if _, err := os.Stat(workingRoot); err == nil { reader := bufio.NewReader(os.Stdin) - fmt.Println("The directory has already existed. \nDo you want to delete it? (y or n, press Enter for default n):") + fmt.Println("The directory already exists. \nDo you want to delete it? (y or n, press Enter for default n):") t, err := reader.ReadString('\n') t = strings.Trim(t, "\n") if err != nil { diff --git a/cmd/cql-utils/keygen.go b/cmd/cql-utils/keygen.go index 816477bde..ac237c344 100644 --- a/cmd/cql-utils/keygen.go +++ b/cmd/cql-utils/keygen.go @@ -31,7 +31,7 @@ import ( func runKeygen() *asymmetric.PublicKey { if _, err := os.Stat(privateKeyFile); err == nil { reader := bufio.NewReader(os.Stdin) - fmt.Println("Private key file has already existed. \nDo you want to delete it? (y or n, press Enter for default n):") + fmt.Println("Private key file already exists. \nDo you want to delete it? (y or n, press Enter for default n):") t, err := reader.ReadString('\n') t = strings.Trim(t, "\n") if err != nil { diff --git a/conf/config.go b/conf/config.go index e268d8b6b..44dd83a6a 100644 --- a/conf/config.go +++ b/conf/config.go @@ -97,9 +97,9 @@ type MinerDatabaseFixture struct { // MinerInfo for miner config. type MinerInfo struct { // node basic config. - RootDir string `yaml:"RootDir"` - MaxReqTimeGap time.Duration `yaml:"MaxReqTimeGap,omitempty"` - MetricCollectInterval time.Duration `yaml:"MetricCollectInterval,omitempty"` + RootDir string `yaml:"RootDir"` + MaxReqTimeGap time.Duration `yaml:"MaxReqTimeGap,omitempty"` + ProvideServiceInterval time.Duration `yaml:"ProvideServiceInterval,omitempty"` // when test mode, fixture database config is used. IsTestMode bool `yaml:"IsTestMode,omitempty"` diff --git a/test/GNTE/conf/node_miner_10.250.100.2/config.yaml b/test/GNTE/conf/node_miner_10.250.100.2/config.yaml index a11649d39..545c96c05 100644 --- a/test/GNTE/conf/node_miner_10.250.100.2/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.3/config.yaml b/test/GNTE/conf/node_miner_10.250.100.3/config.yaml index 8096dab25..81788cd2d 100644 --- a/test/GNTE/conf/node_miner_10.250.100.3/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.3/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.4/config.yaml b/test/GNTE/conf/node_miner_10.250.100.4/config.yaml index b420ac11b..ac72f85d5 100644 --- a/test/GNTE/conf/node_miner_10.250.100.4/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.4/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.5/config.yaml b/test/GNTE/conf/node_miner_10.250.100.5/config.yaml index f20d7ee53..32f16e057 100755 --- a/test/GNTE/conf/node_miner_10.250.100.5/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.5/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.6/config.yaml b/test/GNTE/conf/node_miner_10.250.100.6/config.yaml index f5fc6a3ad..14b096c02 100755 --- a/test/GNTE/conf/node_miner_10.250.100.6/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.6/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.7/config.yaml b/test/GNTE/conf/node_miner_10.250.100.7/config.yaml index ea248251f..9db057252 100755 --- a/test/GNTE/conf/node_miner_10.250.100.7/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.7/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.8/config.yaml b/test/GNTE/conf/node_miner_10.250.100.8/config.yaml index e38b3dd3a..d31c44eb9 100755 --- a/test/GNTE/conf/node_miner_10.250.100.8/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.8/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.9/config.yaml b/test/GNTE/conf/node_miner_10.250.100.9/config.yaml index 6969421de..1e9d5ed5e 100755 --- a/test/GNTE/conf/node_miner_10.250.100.9/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.9/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/fuse/node_miner_0/config.yaml b/test/fuse/node_miner_0/config.yaml index 2e30e01bc..ce2182200 100644 --- a/test/fuse/node_miner_0/config.yaml +++ b/test/fuse/node_miner_0/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/fuse/node_miner_1/config.yaml b/test/fuse/node_miner_1/config.yaml index 639638c2d..573e462e0 100644 --- a/test/fuse/node_miner_1/config.yaml +++ b/test/fuse/node_miner_1/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/fuse/node_miner_2/config.yaml b/test/fuse/node_miner_2/config.yaml index f44645a7a..3d3e5925e 100644 --- a/test/fuse/node_miner_2/config.yaml +++ b/test/fuse/node_miner_2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/integration/node_miner_0/config.yaml b/test/integration/node_miner_0/config.yaml index e157a3150..b6f8c7c60 100644 --- a/test/integration/node_miner_0/config.yaml +++ b/test/integration/node_miner_0/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "60s" + ProvideServiceInterval: "60s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/integration/node_miner_1/config.yaml b/test/integration/node_miner_1/config.yaml index d18225403..feaa3cf2e 100644 --- a/test/integration/node_miner_1/config.yaml +++ b/test/integration/node_miner_1/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "60s" + ProvideServiceInterval: "60s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/integration/node_miner_2/config.yaml b/test/integration/node_miner_2/config.yaml index b2281fa63..848b569ad 100644 --- a/test/integration/node_miner_2/config.yaml +++ b/test/integration/node_miner_2/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "60s" + ProvideServiceInterval: "60s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/mainchain/node_miner_0/config.yaml b/test/mainchain/node_miner_0/config.yaml index d7a472603..582684d3b 100644 --- a/test/mainchain/node_miner_0/config.yaml +++ b/test/mainchain/node_miner_0/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/mainchain/node_miner_1/config.yaml b/test/mainchain/node_miner_1/config.yaml index 072081777..ddd7bb97d 100644 --- a/test/mainchain/node_miner_1/config.yaml +++ b/test/mainchain/node_miner_1/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/mainchain/node_miner_2/config.yaml b/test/mainchain/node_miner_2/config.yaml index 0a6439acf..344dc97bc 100644 --- a/test/mainchain/node_miner_2/config.yaml +++ b/test/mainchain/node_miner_2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/observation/node_miner_0/config.yaml b/test/observation/node_miner_0/config.yaml index 79d4fc45c..f3c0e7e56 100644 --- a/test/observation/node_miner_0/config.yaml +++ b/test/observation/node_miner_0/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/observation/node_miner_1/config.yaml b/test/observation/node_miner_1/config.yaml index f0d0c820a..cfffe5c76 100644 --- a/test/observation/node_miner_1/config.yaml +++ b/test/observation/node_miner_1/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/observation/node_miner_2/config.yaml b/test/observation/node_miner_2/config.yaml index 842e1943e..60eee0609 100644 --- a/test/observation/node_miner_2/config.yaml +++ b/test/observation/node_miner_2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/service/node_miner_0/config.yaml b/test/service/node_miner_0/config.yaml index fdc8a5071..494dc2188 100644 --- a/test/service/node_miner_0/config.yaml +++ b/test/service/node_miner_0/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/service/node_miner_1/config.yaml b/test/service/node_miner_1/config.yaml index 66ff28b03..a287dbba9 100644 --- a/test/service/node_miner_1/config.yaml +++ b/test/service/node_miner_1/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/service/node_miner_2/config.yaml b/test/service/node_miner_2/config.yaml index 0de85ccca..732986985 100644 --- a/test/service/node_miner_2/config.yaml +++ b/test/service/node_miner_2/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - MetricCollectInterval: "1h" + ProvideServiceInterval: "1h" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: From db3a2a0a9af0fba3c2f1daa3e74262716157d23f Mon Sep 17 00:00:00 2001 From: auxten Date: Thu, 3 Jan 2019 18:31:53 +0800 Subject: [PATCH 04/12] Make ProvideServiceInterval: "3s" --- test/GNTE/conf/node_miner_10.250.100.2/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.3/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.4/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.5/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.6/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.7/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.8/config.yaml | 2 +- test/GNTE/conf/node_miner_10.250.100.9/config.yaml | 2 +- test/fuse/node_miner_0/config.yaml | 2 +- test/fuse/node_miner_1/config.yaml | 2 +- test/fuse/node_miner_2/config.yaml | 2 +- test/integration/node_miner_0/config.yaml | 2 +- test/integration/node_miner_1/config.yaml | 2 +- test/integration/node_miner_2/config.yaml | 2 +- test/mainchain/node_miner_0/config.yaml | 2 +- test/mainchain/node_miner_1/config.yaml | 2 +- test/mainchain/node_miner_2/config.yaml | 2 +- test/observation/node_miner_0/config.yaml | 2 +- test/observation/node_miner_1/config.yaml | 2 +- test/observation/node_miner_2/config.yaml | 2 +- test/service/node_miner_0/config.yaml | 2 +- test/service/node_miner_1/config.yaml | 2 +- test/service/node_miner_2/config.yaml | 2 +- 23 files changed, 23 insertions(+), 23 deletions(-) diff --git a/test/GNTE/conf/node_miner_10.250.100.2/config.yaml b/test/GNTE/conf/node_miner_10.250.100.2/config.yaml index 545c96c05..0c709e7ac 100644 --- a/test/GNTE/conf/node_miner_10.250.100.2/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.3/config.yaml b/test/GNTE/conf/node_miner_10.250.100.3/config.yaml index 81788cd2d..b6ebc02f1 100644 --- a/test/GNTE/conf/node_miner_10.250.100.3/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.3/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.4/config.yaml b/test/GNTE/conf/node_miner_10.250.100.4/config.yaml index ac72f85d5..330dc9d4c 100644 --- a/test/GNTE/conf/node_miner_10.250.100.4/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.4/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.5/config.yaml b/test/GNTE/conf/node_miner_10.250.100.5/config.yaml index 32f16e057..ac34392e6 100755 --- a/test/GNTE/conf/node_miner_10.250.100.5/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.5/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.6/config.yaml b/test/GNTE/conf/node_miner_10.250.100.6/config.yaml index 14b096c02..2a7b3c565 100755 --- a/test/GNTE/conf/node_miner_10.250.100.6/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.6/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.7/config.yaml b/test/GNTE/conf/node_miner_10.250.100.7/config.yaml index 9db057252..fdf93b28c 100755 --- a/test/GNTE/conf/node_miner_10.250.100.7/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.7/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.8/config.yaml b/test/GNTE/conf/node_miner_10.250.100.8/config.yaml index d31c44eb9..b6b28aaf9 100755 --- a/test/GNTE/conf/node_miner_10.250.100.8/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.8/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/GNTE/conf/node_miner_10.250.100.9/config.yaml b/test/GNTE/conf/node_miner_10.250.100.9/config.yaml index 1e9d5ed5e..1a1aeb2c5 100755 --- a/test/GNTE/conf/node_miner_10.250.100.9/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.9/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "60s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/fuse/node_miner_0/config.yaml b/test/fuse/node_miner_0/config.yaml index ce2182200..32678ede6 100644 --- a/test/fuse/node_miner_0/config.yaml +++ b/test/fuse/node_miner_0/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/fuse/node_miner_1/config.yaml b/test/fuse/node_miner_1/config.yaml index 573e462e0..4aa76ab72 100644 --- a/test/fuse/node_miner_1/config.yaml +++ b/test/fuse/node_miner_1/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/fuse/node_miner_2/config.yaml b/test/fuse/node_miner_2/config.yaml index 3d3e5925e..77db277e5 100644 --- a/test/fuse/node_miner_2/config.yaml +++ b/test/fuse/node_miner_2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/integration/node_miner_0/config.yaml b/test/integration/node_miner_0/config.yaml index b6f8c7c60..fb25c6e67 100644 --- a/test/integration/node_miner_0/config.yaml +++ b/test/integration/node_miner_0/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "60s" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/integration/node_miner_1/config.yaml b/test/integration/node_miner_1/config.yaml index feaa3cf2e..0abecf0b5 100644 --- a/test/integration/node_miner_1/config.yaml +++ b/test/integration/node_miner_1/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "60s" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/integration/node_miner_2/config.yaml b/test/integration/node_miner_2/config.yaml index 848b569ad..ef2f44802 100644 --- a/test/integration/node_miner_2/config.yaml +++ b/test/integration/node_miner_2/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "60s" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/mainchain/node_miner_0/config.yaml b/test/mainchain/node_miner_0/config.yaml index 582684d3b..720727b5f 100644 --- a/test/mainchain/node_miner_0/config.yaml +++ b/test/mainchain/node_miner_0/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/mainchain/node_miner_1/config.yaml b/test/mainchain/node_miner_1/config.yaml index ddd7bb97d..1abdd2084 100644 --- a/test/mainchain/node_miner_1/config.yaml +++ b/test/mainchain/node_miner_1/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/mainchain/node_miner_2/config.yaml b/test/mainchain/node_miner_2/config.yaml index 344dc97bc..5bcb8245d 100644 --- a/test/mainchain/node_miner_2/config.yaml +++ b/test/mainchain/node_miner_2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/observation/node_miner_0/config.yaml b/test/observation/node_miner_0/config.yaml index f3c0e7e56..f7bcd4ec0 100644 --- a/test/observation/node_miner_0/config.yaml +++ b/test/observation/node_miner_0/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/observation/node_miner_1/config.yaml b/test/observation/node_miner_1/config.yaml index cfffe5c76..2ffead7aa 100644 --- a/test/observation/node_miner_1/config.yaml +++ b/test/observation/node_miner_1/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/observation/node_miner_2/config.yaml b/test/observation/node_miner_2/config.yaml index 60eee0609..1c368533f 100644 --- a/test/observation/node_miner_2/config.yaml +++ b/test/observation/node_miner_2/config.yaml @@ -37,7 +37,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/service/node_miner_0/config.yaml b/test/service/node_miner_0/config.yaml index 494dc2188..cc513845f 100644 --- a/test/service/node_miner_0/config.yaml +++ b/test/service/node_miner_0/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/service/node_miner_1/config.yaml b/test/service/node_miner_1/config.yaml index a287dbba9..4a85f4797 100644 --- a/test/service/node_miner_1/config.yaml +++ b/test/service/node_miner_1/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: diff --git a/test/service/node_miner_2/config.yaml b/test/service/node_miner_2/config.yaml index 732986985..82f2fe38f 100644 --- a/test/service/node_miner_2/config.yaml +++ b/test/service/node_miner_2/config.yaml @@ -50,7 +50,7 @@ Miner: IsTestMode: true RootDir: "./data" MaxReqTimeGap: "2s" - ProvideServiceInterval: "1h" + ProvideServiceInterval: "3s" KnownNodes: - ID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 Nonce: From 26f0ae5f05b13acc9ad3f2dabac587a3de1aa8b1 Mon Sep 17 00:00:00 2001 From: auxten Date: Thu, 3 Jan 2019 18:43:59 +0800 Subject: [PATCH 05/12] Fix put dirty --- blockproducer/metastate.go | 3 ++- cmd/cqld/bench_test.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/blockproducer/metastate.go b/blockproducer/metastate.go index 0be7978d0..851f81231 100644 --- a/blockproducer/metastate.go +++ b/blockproducer/metastate.go @@ -778,8 +778,9 @@ func (s *metaState) filterNMiners( for k, v := range s.dirty.provider { if v == nil { delete(allProviderMap, k) + } else { + allProviderMap[k] = v } - allProviderMap[k] = v } // delete selected target miners diff --git a/cmd/cqld/bench_test.go b/cmd/cqld/bench_test.go index 37771d128..a965db27f 100644 --- a/cmd/cqld/bench_test.go +++ b/cmd/cqld/bench_test.go @@ -83,7 +83,7 @@ func start3BPs() { []string{"-config", FJ(testWorkingDir, "./node_1/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cqld/follower1.cover.out"), }, - "follower1", testWorkingDir, logDir, false, + "follower1", testWorkingDir, logDir, true, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { @@ -97,7 +97,7 @@ func start3BPs() { []string{"-config", FJ(testWorkingDir, "./node_2/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cqld/follower2.cover.out"), }, - "follower2", testWorkingDir, logDir, false, + "follower2", testWorkingDir, logDir, true, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { From 03cc17319dda19c3df494a5d306cf3a9a41e8f3a Mon Sep 17 00:00:00 2001 From: zeqing-guo Date: Thu, 3 Jan 2019 19:38:42 +0800 Subject: [PATCH 06/12] Fix bug: billing incorrect --- blockproducer/metastate.go | 21 +++++++++++++++++++-- blockproducer/metastate_test.go | 8 ++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/blockproducer/metastate.go b/blockproducer/metastate.go index 571624189..af414a2c6 100644 --- a/blockproducer/metastate.go +++ b/blockproducer/metastate.go @@ -1019,15 +1019,32 @@ func (s *metaState) updateBilling(tx *types.UpdateBilling) (err error) { miner.PendingIncome += userMap[user.Address][miner.Address] * newProfile.GasPrice } } else { - rate := 1 - float64(user.AdvancePayment)/float64(costMap[user.Address]*newProfile.GasPrice) + rate := float64(user.AdvancePayment) / float64(costMap[user.Address]*newProfile.GasPrice) user.AdvancePayment = 0 user.Status = types.Arrears for _, miner := range newProfile.Miners { income := userMap[user.Address][miner.Address] * newProfile.GasPrice minerIncome := uint64(float64(income) * rate) miner.PendingIncome += minerIncome + if miner.UserArrears == nil { + miner.UserArrears = make([]*types.UserArrears, 0) + } + exist := false for i := range miner.UserArrears { - miner.UserArrears[i].Arrears += (income - minerIncome) + if miner.UserArrears[i].User == user.Address { + exist = true + diff := income - minerIncome + miner.UserArrears[i].Arrears += diff + user.Arrears += diff + } + } + if !exist { + diff := income - minerIncome + miner.UserArrears = append(miner.UserArrears, &types.UserArrears{ + User: user.Address, + Arrears: diff, + }) + user.Arrears += diff } } } diff --git a/blockproducer/metastate_test.go b/blockproducer/metastate_test.go index af69842a9..6005353c6 100644 --- a/blockproducer/metastate_test.go +++ b/blockproducer/metastate_test.go @@ -785,7 +785,7 @@ func TestMetaState(t *testing.T) { }, Nonce: 1, GasPrice: 1, - AdvancePayment: uint64(conf.GConf.QPS) * uint64(conf.GConf.BillingPeriod) * 2, + AdvancePayment: uint64(conf.GConf.QPS) * uint64(conf.GConf.BillingBlockCount) * 2, }, } err = invalidCd8.Sign(privKey2) @@ -1174,7 +1174,7 @@ func TestMetaState(t *testing.T) { sqlchain, loaded := ms.loadSQLChainObject(dbID) So(loaded, ShouldBeTrue) So(len(sqlchain.Miners), ShouldEqual, 1) - So(sqlchain.Miners[0].PendingIncome, ShouldEqual, 125) + So(sqlchain.Miners[0].PendingIncome, ShouldEqual, 100) users = [3]*types.UserCost{ &types.UserCost{ User: addr1, @@ -1221,8 +1221,8 @@ func TestMetaState(t *testing.T) { sqlchain, loaded = ms.loadSQLChainObject(dbID) So(loaded, ShouldBeTrue) So(len(sqlchain.Miners), ShouldEqual, 1) - So(sqlchain.Miners[0].PendingIncome, ShouldEqual, 115) - So(sqlchain.Miners[0].ReceivedIncome, ShouldEqual, 125) + So(sqlchain.Miners[0].PendingIncome, ShouldEqual, 100) + So(sqlchain.Miners[0].ReceivedIncome, ShouldEqual, 100) }) }) }) From 6cb491a645db4d35a73146ab9155d8d41d864186 Mon Sep 17 00:00:00 2001 From: zeqing-guo Date: Thu, 3 Jan 2019 20:16:15 +0800 Subject: [PATCH 07/12] Wait for a longer time if AdvancePayment have not changed --- blockproducer/metastate.go | 2 +- cmd/cql-minerd/integration_test.go | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/blockproducer/metastate.go b/blockproducer/metastate.go index af414a2c6..eb22f8248 100644 --- a/blockproducer/metastate.go +++ b/blockproducer/metastate.go @@ -979,7 +979,7 @@ func (s *metaState) updateBilling(tx *types.UpdateBilling) (err error) { err = errors.Wrap(ErrDatabaseNotFound, "update billing failed") return } - log.Debugf("update billing addr: %s, tx: %v", tx.GetAccountAddress(), tx) + log.Debugf("update billing addr: %s, user: %d, tx: %v", tx.GetAccountAddress(), len(tx.Users), tx) if newProfile.GasPrice == 0 { return diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index 48a8b92e1..26991be27 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -543,11 +543,16 @@ func TestFullProcess(t *testing.T) { So(err, ShouldBeNil) for _, user := range profileResp.Profile.Users { log.Infof("user (%s) left advance payment: %d", user.Address.String(), user.AdvancePayment) + if user.AdvancePayment == testAdvancePayment { + time.Sleep(20 * time.Second) + } So(user.AdvancePayment, ShouldNotEqual, testAdvancePayment) } + getIncome := false for _, miner := range profileResp.Profile.Miners { - So(miner.PendingIncome != 0 || miner.ReceivedIncome != 0, ShouldBeTrue) + getIncome = getIncome || (miner.PendingIncome != 0 || miner.ReceivedIncome != 0) } + So(getIncome, ShouldBeTrue) err = db.Close() So(err, ShouldBeNil) From d8105e3b21521c18575fbf72efbd2dfb5c1c60c2 Mon Sep 17 00:00:00 2001 From: zeqing-guo Date: Fri, 4 Jan 2019 09:44:54 +0800 Subject: [PATCH 08/12] Wait for a longer time if AdvancePayment have not changed --- cmd/cql-minerd/integration_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index 6cc50159d..2892fd526 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -545,7 +545,12 @@ func TestFullProcess(t *testing.T) { log.Infof("user (%s) left advance payment: %d", user.Address.String(), user.AdvancePayment) if user.AdvancePayment == testAdvancePayment { time.Sleep(20 * time.Second) + break } + } + err = rpc.RequestBP(route.MCCQuerySQLChainProfile.String(), profileReq, profileResp) + So(err, ShouldBeNil) + for _, user := range profileResp.Profile.Users { So(user.AdvancePayment, ShouldNotEqual, testAdvancePayment) } getIncome := false From d729681b77b7c264de0a00b19bb821f4b7cf72c6 Mon Sep 17 00:00:00 2001 From: Qi Xiao Date: Fri, 4 Jan 2019 10:58:29 +0800 Subject: [PATCH 09/12] Print configured directory in `confgen` prompt --- cmd/cql-utils/confgen.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/cql-utils/confgen.go b/cmd/cql-utils/confgen.go index 0c8ee487c..32583ea72 100644 --- a/cmd/cql-utils/confgen.go +++ b/cmd/cql-utils/confgen.go @@ -51,7 +51,8 @@ func runConfgen() { if _, err := os.Stat(workingRoot); err == nil { reader := bufio.NewReader(os.Stdin) - fmt.Println("The directory already exists. \nDo you want to delete it? (y or n, press Enter for default n):") + fmt.Printf("The directory \"%s\" already exists. \nDo you want to delete it? (y or n, press Enter for default n):\n", + workingRoot) t, err := reader.ReadString('\n') t = strings.Trim(t, "\n") if err != nil { From 43cadee18498a470fd0c9e07d873037b8f557161 Mon Sep 17 00:00:00 2001 From: Qi Xiao Date: Fri, 4 Jan 2019 10:59:42 +0800 Subject: [PATCH 10/12] Print configured key file path in `keygen` prompt --- cmd/cql-utils/keygen.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/cql-utils/keygen.go b/cmd/cql-utils/keygen.go index ac237c344..30bea4811 100644 --- a/cmd/cql-utils/keygen.go +++ b/cmd/cql-utils/keygen.go @@ -31,7 +31,8 @@ import ( func runKeygen() *asymmetric.PublicKey { if _, err := os.Stat(privateKeyFile); err == nil { reader := bufio.NewReader(os.Stdin) - fmt.Println("Private key file already exists. \nDo you want to delete it? (y or n, press Enter for default n):") + fmt.Printf("Private key file \"%s\" already exists. \nDo you want to delete it? (y or n, press Enter for default n):\n", + privateKeyFile) t, err := reader.ReadString('\n') t = strings.Trim(t, "\n") if err != nil { From eabd4bb9646f04e927f84fc1e774bd5b548c5fe3 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 4 Jan 2019 10:59:58 +0800 Subject: [PATCH 11/12] Mute follower logs --- cmd/cqld/bench_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/cqld/bench_test.go b/cmd/cqld/bench_test.go index a965db27f..37771d128 100644 --- a/cmd/cqld/bench_test.go +++ b/cmd/cqld/bench_test.go @@ -83,7 +83,7 @@ func start3BPs() { []string{"-config", FJ(testWorkingDir, "./node_1/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cqld/follower1.cover.out"), }, - "follower1", testWorkingDir, logDir, true, + "follower1", testWorkingDir, logDir, false, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { @@ -97,7 +97,7 @@ func start3BPs() { []string{"-config", FJ(testWorkingDir, "./node_2/config.yaml"), "-test.coverprofile", FJ(baseDir, "./cmd/cqld/follower2.cover.out"), }, - "follower2", testWorkingDir, logDir, true, + "follower2", testWorkingDir, logDir, false, ); err == nil { nodeCmds = append(nodeCmds, cmd) } else { From 8abdd58d88423a2e0124d220084ab0b359d00c34 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 4 Jan 2019 11:33:21 +0800 Subject: [PATCH 12/12] Add and fix WaitDatabaseCreation WaitBPChainService --- blockproducer/rpc.go | 6 ++---- client/clientbench_test.go | 11 +++++++++++ client/driver_test.go | 3 ++- cmd/cql-minerd/integration_test.go | 23 +++++++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/blockproducer/rpc.go b/blockproducer/rpc.go index 0225b1ab2..ac1b2e47f 100644 --- a/blockproducer/rpc.go +++ b/blockproducer/rpc.go @@ -158,14 +158,13 @@ func WaitDatabaseCreation( req = &types.QuerySQLChainProfileReq{ DBID: dbID, } - resp = &types.QuerySQLChainProfileResp{} ) defer ticker.Stop() for { select { case <-ticker.C: if err = rpc.RequestBP( - route.MCCQuerySQLChainProfile.String(), req, resp, + route.MCCQuerySQLChainProfile.String(), req, nil, ); err != nil { if !strings.Contains(err.Error(), ErrDatabaseNotFound.Error()) { // err != nil && err != ErrDatabaseNotFound (unexpected error) @@ -195,14 +194,13 @@ func WaitBPChainService(ctx context.Context, period time.Duration) (err error) { req = &types.FetchBlockReq{ Height: 0, // Genesis block } - resp = &types.FetchTxBillingResp{} ) defer ticker.Stop() for { select { case <-ticker.C: if err = rpc.RequestBP( - route.MCCFetchBlock.String(), req, resp, + route.MCCFetchBlock.String(), req, nil, ); err == nil || !strings.Contains(err.Error(), "can't find service") { return } diff --git a/client/clientbench_test.go b/client/clientbench_test.go index 7b5282eb9..906db71f9 100644 --- a/client/clientbench_test.go +++ b/client/clientbench_test.go @@ -17,12 +17,15 @@ package client import ( + "context" "database/sql" "os" "path/filepath" "sync" "testing" + "time" + "github.com/CovenantSQL/CovenantSQL/blockproducer" "github.com/CovenantSQL/CovenantSQL/utils" "github.com/CovenantSQL/CovenantSQL/utils/log" ) @@ -52,6 +55,14 @@ func BenchmarkCovenantSQLDriver(b *testing.B) { } }) + // wait for chain service + var ctx1, cancel1 = context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel1() + err = blockproducer.WaitBPChainService(ctx1, 3*time.Second) + if err != nil { + b.Fatalf("wait for chain service failed: %v", err) + } + // create meta := ResourceMeta{} meta.Node = 3 diff --git a/client/driver_test.go b/client/driver_test.go index 19dbb59c4..fcbfd710d 100644 --- a/client/driver_test.go +++ b/client/driver_test.go @@ -23,13 +23,14 @@ import ( "testing" "time" + . "github.com/smartystreets/goconvey/convey" + "github.com/CovenantSQL/CovenantSQL/crypto" "github.com/CovenantSQL/CovenantSQL/crypto/asymmetric" "github.com/CovenantSQL/CovenantSQL/crypto/kms" "github.com/CovenantSQL/CovenantSQL/proto" "github.com/CovenantSQL/CovenantSQL/route" "github.com/CovenantSQL/CovenantSQL/utils/log" - . "github.com/smartystreets/goconvey/convey" ) func TestInit(t *testing.T) { diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index 2892fd526..04e897266 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -376,6 +376,13 @@ func TestFullProcess(t *testing.T) { GasPrice: testGasPrice, AdvancePayment: testAdvancePayment, } + // wait for chain service + var ctx1, cancel1 = context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel1() + err = bp.WaitBPChainService(ctx1, 3*time.Second) + if err != nil { + t.Fatalf("wait for chain service failed: %v", err) + } dsn, err := client.Create(meta) So(err, ShouldBeNil) @@ -716,6 +723,14 @@ func benchMiner(b *testing.B, minerCount uint16, bypassSign bool) { // create meta := client.ResourceMeta{} meta.Node = minerCount + // wait for chain service + var ctx1, cancel1 = context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel1() + err = bp.WaitBPChainService(ctx1, 3*time.Second) + if err != nil { + b.Fatalf("wait for chain service failed: %v", err) + } + dsn, err = client.Create(meta) So(err, ShouldBeNil) log.Infof("the created database dsn is %v", dsn) @@ -805,6 +820,14 @@ func benchGNTEMiner(b *testing.B, minerCount uint16, bypassSign bool) { meta := client.ResourceMeta{} meta.Node = minerCount meta.AdvancePayment = 1000000000 + // wait for chain service + var ctx1, cancel1 = context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel1() + err = bp.WaitBPChainService(ctx1, 3*time.Second) + if err != nil { + b.Fatalf("wait for chain service failed: %v", err) + } + dsn, err = client.Create(meta) So(err, ShouldBeNil) log.Infof("the created database dsn is %v", dsn)