From 9f00055c5b74d021a5d7a92c42f91e22aaecd07f Mon Sep 17 00:00:00 2001 From: tony Date: Fri, 17 Jan 2020 13:47:38 +0800 Subject: [PATCH 1/4] add adaptive bandwith to solo --- cmd/thor/{node => bandwidth}/bandwidth.go | 12 ++++++------ cmd/thor/flags.go | 2 +- cmd/thor/node/node.go | 3 ++- cmd/thor/solo/solo.go | 13 ++++++++++++- packer/packer.go | 7 ++++++- 5 files changed, 27 insertions(+), 10 deletions(-) rename cmd/thor/{node => bandwidth}/bandwidth.go (83%) diff --git a/cmd/thor/node/bandwidth.go b/cmd/thor/bandwidth/bandwidth.go similarity index 83% rename from cmd/thor/node/bandwidth.go rename to cmd/thor/bandwidth/bandwidth.go index bd4859a3e..54c6f5712 100644 --- a/cmd/thor/node/bandwidth.go +++ b/cmd/thor/bandwidth/bandwidth.go @@ -3,7 +3,7 @@ // Distributed under the GNU Lesser General Public License v3.0 software license, see the accompanying // file LICENSE or -package node +package bandwidth import ( "sync" @@ -13,19 +13,19 @@ import ( "github.com/vechain/thor/thor" ) -// bandwidth is gas per second. -type bandwidth struct { +// Bandwidth is gas per second. +type Bandwidth struct { value uint64 // gas per second lock sync.Mutex } -func (b *bandwidth) Value() uint64 { +func (b *Bandwidth) Value() uint64 { b.lock.Lock() defer b.lock.Unlock() return b.value } -func (b *bandwidth) Update(header *block.Header, elapsed time.Duration) (uint64, bool) { +func (b *Bandwidth) Update(header *block.Header, elapsed time.Duration) (uint64, bool) { b.lock.Lock() defer b.lock.Unlock() @@ -52,7 +52,7 @@ func (b *bandwidth) Update(header *block.Header, elapsed time.Duration) (uint64, return b.value, true } -func (b *bandwidth) SuggestGasLimit() uint64 { +func (b *Bandwidth) SuggestGasLimit() uint64 { b.lock.Lock() defer b.lock.Unlock() diff --git a/cmd/thor/flags.go b/cmd/thor/flags.go index 577350008..a9f9d4740 100644 --- a/cmd/thor/flags.go +++ b/cmd/thor/flags.go @@ -87,7 +87,7 @@ var ( gasLimitFlag = cli.IntFlag{ Name: "gas-limit", Value: 10000000, - Usage: "block gas limit", + Usage: "block gas limit(adaptive if set to 0)", } importMasterKeyFlag = cli.BoolFlag{ Name: "import", diff --git a/cmd/thor/node/node.go b/cmd/thor/node/node.go index ba523e01e..97e7b3bca 100644 --- a/cmd/thor/node/node.go +++ b/cmd/thor/node/node.go @@ -23,6 +23,7 @@ import ( "github.com/vechain/thor/block" "github.com/vechain/thor/cache" "github.com/vechain/thor/chain" + "github.com/vechain/thor/cmd/thor/bandwidth" "github.com/vechain/thor/co" "github.com/vechain/thor/comm" "github.com/vechain/thor/consensus" @@ -52,7 +53,7 @@ type Node struct { targetGasLimit uint64 skipLogs bool logDBFailed bool - bandwidth bandwidth + bandwidth bandwidth.Bandwidth } func New( diff --git a/cmd/thor/solo/solo.go b/cmd/thor/solo/solo.go index 876ef1b0d..848fe7f43 100644 --- a/cmd/thor/solo/solo.go +++ b/cmd/thor/solo/solo.go @@ -17,6 +17,7 @@ import ( "github.com/pkg/errors" "github.com/vechain/thor/block" "github.com/vechain/thor/chain" + "github.com/vechain/thor/cmd/thor/bandwidth" "github.com/vechain/thor/co" "github.com/vechain/thor/genesis" "github.com/vechain/thor/logdb" @@ -27,7 +28,7 @@ import ( "github.com/vechain/thor/txpool" ) -var log = log15.New() +var log = log15.New("pkg", "solo") // Solo mode is the standalone client without p2p server type Solo struct { @@ -37,6 +38,7 @@ type Solo struct { logDB *logdb.LogDB bestBlockCh chan *block.Block gasLimit uint64 + bandwith bandwidth.Bandwidth onDemand bool skipLogs bool } @@ -134,6 +136,11 @@ func (s *Solo) packing(pendingTxs tx.Transactions) error { } }() + if s.gasLimit == 0 { + suggested := s.bandwith.SuggestGasLimit() + s.packer.SetTargetGasLimit(suggested) + } + flow, err := s.packer.Mock(best.Header(), uint64(time.Now().Unix()), s.gasLimit) if err != nil { return errors.WithMessage(err, "mock packer") @@ -185,6 +192,10 @@ func (s *Solo) packing(pendingTxs tx.Transactions) error { commitElapsed := mclock.Now() - startTime - execElapsed + if v, updated := s.bandwith.Update(b.Header(), time.Duration(execElapsed+commitElapsed)); updated { + log.Debug("bandwidth updated", "gps", v) + } + blockID := b.Header().ID() log.Info("📦 new block packed", "txs", len(receipts), diff --git a/packer/packer.go b/packer/packer.go index 42205889c..1f7157b8d 100644 --- a/packer/packer.go +++ b/packer/packer.go @@ -148,6 +148,11 @@ func (p *Packer) Mock(parent *block.Header, targetTime uint64, gasLimit uint64) features |= tx.DelegationFeature } + gl := gasLimit + if gasLimit == 0 { + gl = p.gasLimit(parent.GasLimit()) + } + rt := runtime.New( p.repo.NewChain(parent.ID()), state, @@ -156,7 +161,7 @@ func (p *Packer) Mock(parent *block.Header, targetTime uint64, gasLimit uint64) Signer: p.nodeMaster, Number: parent.Number() + 1, Time: targetTime, - GasLimit: gasLimit, + GasLimit: gl, TotalScore: parent.TotalScore() + 1, }, p.forkConfig) From db24c96476b496a593f3d877ce58ca0001d9d4fb Mon Sep 17 00:00:00 2001 From: tony Date: Fri, 17 Jan 2020 13:51:34 +0800 Subject: [PATCH 2/4] fix: add cache option to solo --- cmd/thor/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/thor/main.go b/cmd/thor/main.go index 81de78185..2562a87ef 100644 --- a/cmd/thor/main.go +++ b/cmd/thor/main.go @@ -89,6 +89,7 @@ func main() { Usage: "client runs in solo mode for test & dev", Flags: []cli.Flag{ dataDirFlag, + cacheFlag, apiAddrFlag, apiCorsFlag, apiTimeoutFlag, From 28b300e5d531a9b179b8dc38ab26a8915332ab93 Mon Sep 17 00:00:00 2001 From: tony Date: Fri, 17 Jan 2020 13:52:14 +0800 Subject: [PATCH 3/4] add pruner to solo --- cmd/thor/main.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/thor/main.go b/cmd/thor/main.go index 2562a87ef..5afeaa331 100644 --- a/cmd/thor/main.go +++ b/cmd/thor/main.go @@ -104,6 +104,7 @@ func main() { skipLogsFlag, txPoolLimitFlag, txPoolLimitPerAccountFlag, + disablePrunerFlag, }, Action: soloAction, }, @@ -306,6 +307,11 @@ func soloAction(ctx *cli.Context) error { printSoloStartupMessage(gene, repo, instanceDir, apiURL, forkConfig) + if !ctx.Bool(disablePrunerFlag.Name) { + pruner := pruner.New(mainDB, repo) + defer func() { log.Info("stopping pruner..."); pruner.Stop() }() + } + return solo.New(repo, state.NewStater(mainDB), logDB, From 3f3557cdb72865aa2e38d603e5dbc98293df7542 Mon Sep 17 00:00:00 2001 From: qianbin Date: Mon, 20 Jan 2020 22:19:47 +0800 Subject: [PATCH 4/4] solo: typo --- cmd/thor/solo/solo.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/thor/solo/solo.go b/cmd/thor/solo/solo.go index 848fe7f43..5d98103da 100644 --- a/cmd/thor/solo/solo.go +++ b/cmd/thor/solo/solo.go @@ -38,7 +38,7 @@ type Solo struct { logDB *logdb.LogDB bestBlockCh chan *block.Block gasLimit uint64 - bandwith bandwidth.Bandwidth + bandwidth bandwidth.Bandwidth onDemand bool skipLogs bool } @@ -137,7 +137,7 @@ func (s *Solo) packing(pendingTxs tx.Transactions) error { }() if s.gasLimit == 0 { - suggested := s.bandwith.SuggestGasLimit() + suggested := s.bandwidth.SuggestGasLimit() s.packer.SetTargetGasLimit(suggested) } @@ -192,7 +192,7 @@ func (s *Solo) packing(pendingTxs tx.Transactions) error { commitElapsed := mclock.Now() - startTime - execElapsed - if v, updated := s.bandwith.Update(b.Header(), time.Duration(execElapsed+commitElapsed)); updated { + if v, updated := s.bandwidth.Update(b.Header(), time.Duration(execElapsed+commitElapsed)); updated { log.Debug("bandwidth updated", "gps", v) }