From 273e4ce3e6b2944a7a6ae6fb2dee6dd2f3b2fe27 Mon Sep 17 00:00:00 2001 From: noot Date: Thu, 28 Oct 2021 17:58:57 -0400 Subject: [PATCH 1/7] add blockQueue logs, increase cap --- dot/sync/chain_processor.go | 2 ++ dot/sync/chain_sync.go | 2 ++ dot/sync/syncer.go | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dot/sync/chain_processor.go b/dot/sync/chain_processor.go index 9333a4e600..90110340b4 100644 --- a/dot/sync/chain_processor.go +++ b/dot/sync/chain_processor.go @@ -87,7 +87,9 @@ func (s *chainProcessor) processReadyBlocks() { default: } + logger.Trace("going to pop ready block from queue") bd := s.readyBlocks.pop() + logger.Trace("popped ready block", "block", bd) if bd == nil { continue } diff --git a/dot/sync/chain_sync.go b/dot/sync/chain_sync.go index 38a87ef4be..a5320cfda4 100644 --- a/dot/sync/chain_sync.go +++ b/dot/sync/chain_sync.go @@ -688,7 +688,9 @@ func handleReadyBlock(bd *types.BlockData, pendingBlocks DisjointBlockSet, ready for _, rb := range ready { pendingBlocks.removeBlock(rb.Hash) + logger.Trace("pushing ready block to queue...", "number", bd.Header.Number) readyBlocks.push(rb) + logger.Trace("pushed ready block to queue", "number", bd.Header.Number) } } diff --git a/dot/sync/syncer.go b/dot/sync/syncer.go index 9c4330f45b..59661558b0 100644 --- a/dot/sync/syncer.go +++ b/dot/sync/syncer.go @@ -85,7 +85,7 @@ func NewService(cfg *Config) (*Service, error) { handler = log.CallerFileHandler(handler) logger.SetHandler(log.LvlFilterHandler(cfg.LogLvl, handler)) - readyBlocks := newBlockQueue(maxResponseSize * 30) + readyBlocks := newBlockQueue(maxResponseSize * 64) pendingBlocks := newDisjointBlockSet(pendingBlocksLimit) chainSync := newChainSync(cfg.BlockState, cfg.Network, readyBlocks, pendingBlocks, cfg.MinPeers, cfg.SlotDuration) chainProcessor := newChainProcessor(readyBlocks, pendingBlocks, cfg.BlockState, cfg.StorageState, cfg.TransactionState, cfg.BabeVerifier, cfg.FinalityGadget, cfg.BlockImportHandler) From 08508d617458ca5a1f0a0c6d2bef7194564f0eaa Mon Sep 17 00:00:00 2001 From: noot Date: Mon, 1 Nov 2021 13:47:38 -0400 Subject: [PATCH 2/7] move stuff, add logs --- dot/sync/chain_processor.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/dot/sync/chain_processor.go b/dot/sync/chain_processor.go index 90110340b4..50b42f5179 100644 --- a/dot/sync/chain_processor.go +++ b/dot/sync/chain_processor.go @@ -94,6 +94,7 @@ func (s *chainProcessor) processReadyBlocks() { continue } + logger.Trace("processing block data", "hash", bd.Hash) if err := s.processBlockData(bd); err != nil { logger.Error("ready block failed", "hash", bd.Hash, "error", err) @@ -113,16 +114,17 @@ func (s *chainProcessor) processReadyBlocks() { // processBlockData processes the BlockData from a BlockResponse and returns the index of the last BlockData it handled on success, // or the index of the block data that errored on failure. func (s *chainProcessor) processBlockData(bd *types.BlockData) error { + defer func() { + logger.Info("returning from processBlockData", "hash", bd.Hash) + }() + if bd == nil { return ErrNilBlockData } - err := s.blockState.CompareAndSetBlockData(bd) - if err != nil { - return fmt.Errorf("failed to compare and set data: %w", err) - } - + logger.Info("processBlockData HasHeader") hasHeader, _ := s.blockState.HasHeader(bd.Hash) + logger.Info("processBlockData hasBody") hasBody, _ := s.blockState.HasBlockBody(bd.Hash) if hasHeader && hasBody { // TODO: fix this; sometimes when the node shuts down the "best block" isn't stored properly, @@ -166,8 +168,10 @@ func (s *chainProcessor) processBlockData(bd *types.BlockData) error { return nil } + logger.Debug("processBlockData: processing block", "hash", bd.Hash) + if bd.Header != nil && bd.Body != nil { - if err = s.handleHeader(bd.Header); err != nil { + if err := s.handleHeader(bd.Header); err != nil { return err } @@ -178,9 +182,7 @@ func (s *chainProcessor) processBlockData(bd *types.BlockData) error { Body: *bd.Body, } - logger.Debug("processing block", "hash", bd.Hash) - - if err = s.handleBlock(block); err != nil { + if err := s.handleBlock(block); err != nil { logger.Error("failed to handle block", "number", block.Header.Number, "error", err) return err } @@ -193,6 +195,10 @@ func (s *chainProcessor) processBlockData(bd *types.BlockData) error { s.handleJustification(bd.Header, *bd.Justification) } + if err := s.blockState.CompareAndSetBlockData(bd); err != nil { + return fmt.Errorf("failed to compare and set data: %w", err) + } + return nil } From 58d6d3d3e6e081b84806f88616616c2b2de35d53 Mon Sep 17 00:00:00 2001 From: noot Date: Mon, 1 Nov 2021 20:37:20 -0400 Subject: [PATCH 3/7] remove GetBlockBody lock --- dot/state/block.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dot/state/block.go b/dot/state/block.go index 355bee3f72..2a527700f8 100644 --- a/dot/state/block.go +++ b/dot/state/block.go @@ -327,6 +327,7 @@ func (bs *BlockState) GetBlockByHash(hash common.Hash) (*types.Block, error) { if err != nil { return nil, err } + return &types.Block{Header: *header, Body: *blockBody}, nil } @@ -360,8 +361,8 @@ func (bs *BlockState) HasBlockBody(hash common.Hash) (bool, error) { // GetBlockBody will return Body for a given hash func (bs *BlockState) GetBlockBody(hash common.Hash) (*types.Body, error) { - bs.RLock() - defer bs.RUnlock() + // bs.RLock() + // defer bs.RUnlock() block, has := bs.getUnfinalisedBlock(hash) if has { From 4b6de75b1fbdc806ddd3141b43f59928cab29b5d Mon Sep 17 00:00:00 2001 From: noot Date: Tue, 2 Nov 2021 08:45:53 -0400 Subject: [PATCH 4/7] cleanup --- dot/state/block.go | 3 --- dot/sync/chain_processor.go | 11 +---------- dot/sync/chain_sync.go | 2 -- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/dot/state/block.go b/dot/state/block.go index 2a527700f8..d09d91de68 100644 --- a/dot/state/block.go +++ b/dot/state/block.go @@ -361,9 +361,6 @@ func (bs *BlockState) HasBlockBody(hash common.Hash) (bool, error) { // GetBlockBody will return Body for a given hash func (bs *BlockState) GetBlockBody(hash common.Hash) (*types.Body, error) { - // bs.RLock() - // defer bs.RUnlock() - block, has := bs.getUnfinalisedBlock(hash) if has { return &block.Body, nil diff --git a/dot/sync/chain_processor.go b/dot/sync/chain_processor.go index 50b42f5179..bc7972ea45 100644 --- a/dot/sync/chain_processor.go +++ b/dot/sync/chain_processor.go @@ -87,14 +87,11 @@ func (s *chainProcessor) processReadyBlocks() { default: } - logger.Trace("going to pop ready block from queue") bd := s.readyBlocks.pop() - logger.Trace("popped ready block", "block", bd) if bd == nil { continue } - logger.Trace("processing block data", "hash", bd.Hash) if err := s.processBlockData(bd); err != nil { logger.Error("ready block failed", "hash", bd.Hash, "error", err) @@ -114,17 +111,11 @@ func (s *chainProcessor) processReadyBlocks() { // processBlockData processes the BlockData from a BlockResponse and returns the index of the last BlockData it handled on success, // or the index of the block data that errored on failure. func (s *chainProcessor) processBlockData(bd *types.BlockData) error { - defer func() { - logger.Info("returning from processBlockData", "hash", bd.Hash) - }() - if bd == nil { return ErrNilBlockData } - logger.Info("processBlockData HasHeader") hasHeader, _ := s.blockState.HasHeader(bd.Hash) - logger.Info("processBlockData hasBody") hasBody, _ := s.blockState.HasBlockBody(bd.Hash) if hasHeader && hasBody { // TODO: fix this; sometimes when the node shuts down the "best block" isn't stored properly, @@ -168,7 +159,7 @@ func (s *chainProcessor) processBlockData(bd *types.BlockData) error { return nil } - logger.Debug("processBlockData: processing block", "hash", bd.Hash) + logger.Debug("processing block data", "hash", bd.Hash) if bd.Header != nil && bd.Body != nil { if err := s.handleHeader(bd.Header); err != nil { diff --git a/dot/sync/chain_sync.go b/dot/sync/chain_sync.go index a5320cfda4..38a87ef4be 100644 --- a/dot/sync/chain_sync.go +++ b/dot/sync/chain_sync.go @@ -688,9 +688,7 @@ func handleReadyBlock(bd *types.BlockData, pendingBlocks DisjointBlockSet, ready for _, rb := range ready { pendingBlocks.removeBlock(rb.Hash) - logger.Trace("pushing ready block to queue...", "number", bd.Header.Number) readyBlocks.push(rb) - logger.Trace("pushed ready block to queue", "number", bd.Header.Number) } } From 6318263b2b3779b683cfbaa3dbe389a8e17b56f8 Mon Sep 17 00:00:00 2001 From: noot Date: Tue, 2 Nov 2021 08:54:03 -0400 Subject: [PATCH 5/7] cleanup --- dot/sync/syncer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/sync/syncer.go b/dot/sync/syncer.go index 59661558b0..9c4330f45b 100644 --- a/dot/sync/syncer.go +++ b/dot/sync/syncer.go @@ -85,7 +85,7 @@ func NewService(cfg *Config) (*Service, error) { handler = log.CallerFileHandler(handler) logger.SetHandler(log.LvlFilterHandler(cfg.LogLvl, handler)) - readyBlocks := newBlockQueue(maxResponseSize * 64) + readyBlocks := newBlockQueue(maxResponseSize * 30) pendingBlocks := newDisjointBlockSet(pendingBlocksLimit) chainSync := newChainSync(cfg.BlockState, cfg.Network, readyBlocks, pendingBlocks, cfg.MinPeers, cfg.SlotDuration) chainProcessor := newChainProcessor(readyBlocks, pendingBlocks, cfg.BlockState, cfg.StorageState, cfg.TransactionState, cfg.BabeVerifier, cfg.FinalityGadget, cfg.BlockImportHandler) From 2424b06cca14f6341d180dfdfc13ec7d3b96b27f Mon Sep 17 00:00:00 2001 From: noot Date: Wed, 3 Nov 2021 15:53:20 -0400 Subject: [PATCH 6/7] update handleFinalisedBlock to get store block in db, then delete from memory --- dot/state/block.go | 4 ++++ dot/state/block_finalisation.go | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dot/state/block.go b/dot/state/block.go index 5695d83d8a..09632c733a 100644 --- a/dot/state/block.go +++ b/dot/state/block.go @@ -221,6 +221,10 @@ func (bs *BlockState) getAndDeleteUnfinalisedBlock(hash common.Hash) (*types.Blo return block.(*types.Block), true } +func (bs *BlockState) deleteUnfinalisedBlock(hash common.Hash) { + bs.unfinalisedBlocks.Delete(hash) +} + // HasHeader returns if the db contains a header with the given hash func (bs *BlockState) HasHeader(hash common.Hash) (bool, error) { if bs.hasUnfinalisedBlock(hash) { diff --git a/dot/state/block_finalisation.go b/dot/state/block_finalisation.go index aaeb9ffcfc..2e85ac37d4 100644 --- a/dot/state/block_finalisation.go +++ b/dot/state/block_finalisation.go @@ -226,7 +226,7 @@ func (bs *BlockState) handleFinalisedBlock(curr common.Hash) error { continue } - block, has := bs.getAndDeleteUnfinalisedBlock(hash) + block, has := bs.getUnfinalisedBlock(hash) if !has { return fmt.Errorf("failed to find block in unfinalised block map, block=%s", hash) } @@ -251,6 +251,8 @@ func (bs *BlockState) handleFinalisedBlock(curr common.Hash) error { if err = batch.Put(headerHashKey(block.Header.Number.Uint64()), hash.ToBytes()); err != nil { return err } + + bs.deleteUnfinalisedBlock(hash) } return batch.Flush() From 6cc02641c3325a015c090ca6b2e2b95727404203 Mon Sep 17 00:00:00 2001 From: noot Date: Wed, 3 Nov 2021 16:11:02 -0400 Subject: [PATCH 7/7] fix lint --- dot/core/service.go | 1 - lib/runtime/test_helpers.go | 13 +++++++++---- scripts/install-lint.sh | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dot/core/service.go b/dot/core/service.go index 289881e8dc..f79dd56f5e 100644 --- a/dot/core/service.go +++ b/dot/core/service.go @@ -324,7 +324,6 @@ func (s *Service) handleBlocksAsync() { } s.maintainTransactionPool(block) - case <-s.ctx.Done(): return } diff --git a/lib/runtime/test_helpers.go b/lib/runtime/test_helpers.go index c6e969e69d..59da6fd68d 100644 --- a/lib/runtime/test_helpers.go +++ b/lib/runtime/test_helpers.go @@ -89,9 +89,6 @@ func GetRuntimeBlob(testRuntimeFilePath, testRuntimeURL string) (n int64, err er if err != nil { return 0, err } - defer func() { - _ = out.Close() - }() /* #nosec */ resp, err := http.Get(testRuntimeURL) @@ -103,7 +100,15 @@ func GetRuntimeBlob(testRuntimeFilePath, testRuntimeURL string) (n int64, err er }() n, err = io.Copy(out, resp.Body) - return n, err + if err != nil { + return 0, err + } + + if err = out.Close(); err != nil { + return 0, err + } + + return n, nil } // TestRuntimeNetwork ... diff --git a/scripts/install-lint.sh b/scripts/install-lint.sh index 30b7c6baaa..bd1e4cf175 100755 --- a/scripts/install-lint.sh +++ b/scripts/install-lint.sh @@ -6,7 +6,7 @@ fi if ! command -v golangci-lint &> /dev/null then - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.41.0 + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.43.0 fi export PATH=$PATH:$(go env GOPATH)/bin \ No newline at end of file