diff --git a/README.md b/README.md index 5ddc70a79e9d40dd79e57107bb03d459d10fb0e8..7a830d801e310cca60d5991a8e6d2fcd16b2c530 100644 --- a/README.md +++ b/README.md @@ -316,6 +316,14 @@ you'll have to change one if you want to run both at the same time. use `--help` Reserved for future use: **gRPC ports**: `9092` consensus engine, `9093` snapshot downloader, `9094` TxPool +### How to get diagnostic for bug report? + +- Get stack trace: `kill -SIGUSR1 <pid>`, get trace and stop: `kill -6 <pid>` +- Get CPU profiling: add `--pprof flag` + run `go tool pprof -png http://127.0.0.1:6060/debug/pprof/profile\?seconds\=20 > cpu.png` +- Get RAM profiling: add `--pprof flag` + run `go tool pprof -inuse_space -png http://127.0.0.1:6060/debug/pprof/heap > mem.png` + Getting in touch ================ diff --git a/cmd/prometheus/dashboards/erigon.json b/cmd/prometheus/dashboards/erigon.json index e8633bea71d03116cfcb9a5b16f324161cd0cf5e..58591174036863e608fe6ec4977f0347cc1216e7 100644 --- a/cmd/prometheus/dashboards/erigon.json +++ b/cmd/prometheus/dashboards/erigon.json @@ -22,7 +22,7 @@ "gnetId": null, "graphTooltip": 0, "id": 1, - "iteration": 1631701154074, + "iteration": 1631842473201, "links": [], "panels": [ { @@ -2388,32 +2388,7 @@ }, "unit": "s" }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "pool_new_block: turbogeth16c.weblogix.it:6060" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": true - } - } - ] - } - ] + "overrides": [] }, "gridPos": { "h": 8, @@ -2637,7 +2612,7 @@ }, "gridPos": { "h": 6, - "w": 7, + "w": 8, "x": 0, "y": 67 }, @@ -2722,8 +2697,8 @@ }, "gridPos": { "h": 6, - "w": 7, - "x": 7, + "w": 8, + "x": 8, "y": 67 }, "id": 180, @@ -2809,14 +2784,40 @@ "value": 80 } ] - } + }, + "unit": "short" }, - "overrides": [] + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "keys: turbogeth16c.weblogix.it:6060 " + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] }, "gridPos": { "h": 6, - "w": 7, - "x": 14, + "w": 8, + "x": 16, "y": 67 }, "id": 181, @@ -2836,7 +2837,7 @@ "targets": [ { "exemplar": true, - "expr": "rate(cache_keys_total{name=\"txpool\",instance=~\"$instance\"}[1m])", + "expr": "cache_keys_total{name=\"txpool\",instance=~\"$instance\"}", "hide": false, "interval": "", "legendFormat": "keys: {{ instance }} ", @@ -2847,7 +2848,7 @@ "expr": "rate(cache_timeout_total{name=\"txpool\",instance=~\"$instance\"}[1m])", "hide": false, "interval": "", - "legendFormat": "timeout: {{ instance }} ", + "legendFormat": "timeout/sec: {{ instance }} ", "refId": "B" } ], @@ -2910,7 +2911,7 @@ "gridPos": { "h": 6, "w": 8, - "x": 7, + "x": 8, "y": 73 }, "id": 178, @@ -4949,7 +4950,7 @@ "auto_count": 30, "auto_min": "10s", "current": { - "selected": true, + "selected": false, "text": "1m", "value": "1m" }, @@ -5024,7 +5025,7 @@ ] }, "time": { - "from": "now-1h", + "from": "now-12h", "to": "now" }, "timepicker": { @@ -5054,5 +5055,5 @@ "timezone": "", "title": "Erigon Prometheus", "uid": "FPpjH6Hik", - "version": 34 + "version": 35 } \ No newline at end of file diff --git a/cmd/sentry/download/downloader.go b/cmd/sentry/download/downloader.go index 31de56b07fd1cd48fc5ae80a3fe8644b39dfe614..9e30c1a5266867a19f9ad72943932754b1a46b47 100644 --- a/cmd/sentry/download/downloader.go +++ b/cmd/sentry/download/downloader.go @@ -385,7 +385,7 @@ func (cs *ControlServerImpl) newBlockHashes66(ctx context.Context, req *proto_se //log.Info(fmt.Sprintf("NewBlockHashes from [%s]", gointerfaces.ConvertH512ToBytes(req.PeerId))) var request eth.NewBlockHashesPacket if err := rlp.DecodeBytes(req.Data, &request); err != nil { - return fmt.Errorf("decode NewBlockHashes66: %v", err) + return fmt.Errorf("decode NewBlockHashes66: %w", err) } for _, announce := range request { cs.Hd.SaveExternalAnnounce(announce.Hash) @@ -403,7 +403,7 @@ func (cs *ControlServerImpl) newBlockHashes66(ctx context.Context, req *proto_se }, }) if err != nil { - return fmt.Errorf("encode header request: %v", err) + return fmt.Errorf("encode header request: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: req.PeerId, @@ -417,7 +417,7 @@ func (cs *ControlServerImpl) newBlockHashes66(ctx context.Context, req *proto_se if isPeerNotFoundErr(err) { continue } - return fmt.Errorf("send header request: %v", err) + return fmt.Errorf("send header request: %w", err) } } return nil @@ -430,7 +430,7 @@ func (cs *ControlServerImpl) newBlockHashes65(ctx context.Context, req *proto_se //log.Info(fmt.Sprintf("NewBlockHashes from [%s]", gointerfaces.ConvertH512ToBytes(req.PeerId))) var request eth.NewBlockHashesPacket if err := rlp.DecodeBytes(req.Data, &request); err != nil { - return fmt.Errorf("decode newBlockHashes65: %v", err) + return fmt.Errorf("decode newBlockHashes65: %w", err) } for _, announce := range request { cs.Hd.SaveExternalAnnounce(announce.Hash) @@ -445,7 +445,7 @@ func (cs *ControlServerImpl) newBlockHashes65(ctx context.Context, req *proto_se Origin: eth.HashOrNumber{Hash: announce.Hash}, }) if err != nil { - return fmt.Errorf("encode header request: %v", err) + return fmt.Errorf("encode header request: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: req.PeerId, @@ -459,7 +459,7 @@ func (cs *ControlServerImpl) newBlockHashes65(ctx context.Context, req *proto_se if isPeerNotFoundErr(err) { continue } - return fmt.Errorf("send header request: %v", err) + return fmt.Errorf("send header request: %w", err) } } return nil @@ -492,7 +492,7 @@ func (cs *ControlServerImpl) blockHeaders66(ctx context.Context, in *proto_sentr // Parse the entire request from scratch var request eth.BlockHeadersPacket66 if err := rlp.DecodeBytes(in.Data, &request); err != nil { - return fmt.Errorf("decode 5 BlockHeadersPacket66: %v", err) + return fmt.Errorf("decode 5 BlockHeadersPacket66: %w", err) } headers := request.BlockHeadersPacket var heighestBlock uint64 @@ -534,7 +534,7 @@ func (cs *ControlServerImpl) blockHeaders66(ctx context.Context, in *proto_sentr } } } else { - return fmt.Errorf("singleHeaderAsSegment failed: %v", err) + return fmt.Errorf("singleHeaderAsSegment failed: %w", err) } outreq := proto_sentry.PeerMinBlockRequest{ PeerId: in.PeerId, @@ -567,7 +567,7 @@ func (cs *ControlServerImpl) blockHeaders65(ctx context.Context, in *proto_sentr // Parse the entire request from scratch var request eth.BlockHeadersPacket if err := rlp.DecodeBytes(in.Data, &request); err != nil { - return fmt.Errorf("decode 5 BlockHeadersPacket66: %v", err) + return fmt.Errorf("decode 5 BlockHeadersPacket66: %w", err) } headers := request var heighestBlock uint64 @@ -609,7 +609,7 @@ func (cs *ControlServerImpl) blockHeaders65(ctx context.Context, in *proto_sentr } } } else { - return fmt.Errorf("singleHeaderAsSegment failed: %v", err) + return fmt.Errorf("singleHeaderAsSegment failed: %w", err) } outreq := proto_sentry.PeerMinBlockRequest{ PeerId: in.PeerId, @@ -643,7 +643,7 @@ func (cs *ControlServerImpl) newBlock65(ctx context.Context, inreq *proto_sentry // Parse the entire request from scratch var request eth.NewBlockPacket if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { - return fmt.Errorf("decode 4 NewBlockMsg: %v", err) + return fmt.Errorf("decode 4 NewBlockMsg: %w", err) } if segments, penalty, err := cs.Hd.SingleHeaderAsSegment(headerRaw, request.Block.Header()); err == nil { if penalty == headerdownload.NoPenalty { @@ -663,7 +663,7 @@ func (cs *ControlServerImpl) newBlock65(ctx context.Context, inreq *proto_sentry } } } else { - return fmt.Errorf("singleHeaderAsSegment failed: %v", err) + return fmt.Errorf("singleHeaderAsSegment failed: %w", err) } cs.Bd.AddToPrefetch(request.Block) outreq := proto_sentry.PeerMinBlockRequest{ @@ -680,7 +680,7 @@ func (cs *ControlServerImpl) newBlock65(ctx context.Context, inreq *proto_sentry func (cs *ControlServerImpl) blockBodies66(inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var request eth.BlockRawBodiesPacket66 if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { - return fmt.Errorf("decode BlockBodiesPacket66: %v", err) + return fmt.Errorf("decode BlockBodiesPacket66: %w", err) } txs, uncles := request.BlockRawBodiesPacket.Unpack() cs.Bd.DeliverBodies(txs, uncles, uint64(len(inreq.Data)), string(gointerfaces.ConvertH512ToBytes(inreq.PeerId))) @@ -690,7 +690,7 @@ func (cs *ControlServerImpl) blockBodies66(inreq *proto_sentry.InboundMessage, s func (cs *ControlServerImpl) blockBodies65(inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var request eth.BlockRawBodiesPacket if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { - return fmt.Errorf("decode blockBodies65: %v", err) + return fmt.Errorf("decode blockBodies65: %w", err) } txs, uncles := request.Unpack() cs.Bd.DeliverBodies(txs, uncles, uint64(len(inreq.Data)), string(gointerfaces.ConvertH512ToBytes(inreq.PeerId))) @@ -707,7 +707,7 @@ func (cs *ControlServerImpl) receipts65(ctx context.Context, inreq *proto_sentry func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var query eth.GetBlockHeadersPacket66 if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockHeaders66: %v, data: %x", err, inreq.Data) + return fmt.Errorf("decoding getBlockHeaders66: %w, data: %x", err, inreq.Data) } var headers []*types.Header @@ -725,7 +725,7 @@ func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto BlockHeadersPacket: headers, }) if err != nil { - return fmt.Errorf("encode header response: %v", err) + return fmt.Errorf("encode header response: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: inreq.PeerId, @@ -737,9 +737,9 @@ func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) if err != nil { if !isPeerNotFoundErr(err) { - return fmt.Errorf("send header response 65: %v", err) + return fmt.Errorf("send header response 65: %w", err) } - return fmt.Errorf("send header response 66: %v", err) + return fmt.Errorf("send header response 66: %w", err) } //log.Info(fmt.Sprintf("[%s] GetBlockHeaderMsg{hash=%x, number=%d, amount=%d, skip=%d, reverse=%t, responseLen=%d}", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query.Origin.Hash, query.Origin.Number, query.Amount, query.Skip, query.Reverse, len(b))) return nil @@ -748,7 +748,7 @@ func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var query eth.GetBlockHeadersPacket if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockHeaders65: %v, data: %x", err, inreq.Data) + return fmt.Errorf("decoding getBlockHeaders65: %w, data: %x", err, inreq.Data) } var headers []*types.Header @@ -763,7 +763,7 @@ func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto } b, err := rlp.EncodeToBytes(eth.BlockHeadersPacket(headers)) if err != nil { - return fmt.Errorf("encode header response: %v", err) + return fmt.Errorf("encode header response: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: inreq.PeerId, @@ -775,7 +775,7 @@ func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) if err != nil { if !isPeerNotFoundErr(err) { - return fmt.Errorf("send header response 65: %v", err) + return fmt.Errorf("send header response 65: %w", err) } } //log.Info(fmt.Sprintf("[%s] GetBlockHeaderMsg{hash=%x, number=%d, amount=%d, skip=%d, reverse=%t, responseLen=%d}", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query.Origin.Hash, query.Origin.Number, query.Amount, query.Skip, query.Reverse, len(b))) @@ -785,7 +785,7 @@ func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var query eth.GetBlockBodiesPacket66 if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockBodies66: %v, data: %x", err, inreq.Data) + return fmt.Errorf("decoding getBlockBodies66: %w, data: %x", err, inreq.Data) } tx, err := cs.db.BeginRo(ctx) if err != nil { @@ -799,7 +799,7 @@ func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_ BlockBodiesRLPPacket: response, }) if err != nil { - return fmt.Errorf("encode header response: %v", err) + return fmt.Errorf("encode header response: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: inreq.PeerId, @@ -813,7 +813,7 @@ func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_ if isPeerNotFoundErr(err) { return nil } - return fmt.Errorf("send bodies response: %v", err) + return fmt.Errorf("send bodies response: %w", err) } //log.Info(fmt.Sprintf("[%s] GetBlockBodiesMsg responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) return nil @@ -822,7 +822,7 @@ func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_ func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var query eth.GetBlockBodiesPacket if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockBodies65: %v, data: %x", err, inreq.Data) + return fmt.Errorf("decoding getBlockBodies65: %w, data: %x", err, inreq.Data) } tx, err := cs.db.BeginRo(ctx) if err != nil { @@ -833,7 +833,7 @@ func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_ tx.Rollback() b, err := rlp.EncodeToBytes(eth.BlockBodiesRLPPacket(response)) if err != nil { - return fmt.Errorf("encode header response: %v", err) + return fmt.Errorf("encode header response: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: inreq.PeerId, @@ -847,7 +847,7 @@ func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_ if isPeerNotFoundErr(err) { return nil } - return fmt.Errorf("send bodies response: %v", err) + return fmt.Errorf("send bodies response: %w", err) } //log.Info(fmt.Sprintf("[%s] GetBlockBodiesMsg responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) return nil @@ -856,7 +856,7 @@ func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_ func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var query eth.GetReceiptsPacket66 if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getReceipts66: %v, data: %x", err, inreq.Data) + return fmt.Errorf("decoding getReceipts66: %w, data: %x", err, inreq.Data) } tx, err := cs.db.BeginRo(ctx) if err != nil { @@ -873,7 +873,7 @@ func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sen ReceiptsRLPPacket: receipts, }) if err != nil { - return fmt.Errorf("encode header response: %v", err) + return fmt.Errorf("encode header response: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: inreq.PeerId, @@ -887,7 +887,7 @@ func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sen if isPeerNotFoundErr(err) { return nil } - return fmt.Errorf("send bodies response: %v", err) + return fmt.Errorf("send bodies response: %w", err) } //log.Info(fmt.Sprintf("[%s] GetReceipts responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) return nil @@ -896,7 +896,7 @@ func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sen func (cs *ControlServerImpl) getReceipts65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { var query eth.GetReceiptsPacket if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getReceipts65: %v, data: %x", err, inreq.Data) + return fmt.Errorf("decoding getReceipts65: %w, data: %x", err, inreq.Data) } tx, err := cs.db.BeginRo(ctx) if err != nil { @@ -910,7 +910,7 @@ func (cs *ControlServerImpl) getReceipts65(ctx context.Context, inreq *proto_sen tx.Rollback() b, err := rlp.EncodeToBytes(eth.ReceiptsRLPPacket(receipts)) if err != nil { - return fmt.Errorf("encode header response: %v", err) + return fmt.Errorf("encode header response: %w", err) } outreq := proto_sentry.SendMessageByIdRequest{ PeerId: inreq.PeerId, @@ -924,7 +924,7 @@ func (cs *ControlServerImpl) getReceipts65(ctx context.Context, inreq *proto_sen if isPeerNotFoundErr(err) { return nil } - return fmt.Errorf("send bodies response: %v", err) + return fmt.Errorf("send bodies response: %w", err) } //log.Info(fmt.Sprintf("[%s] GetReceipts responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) return nil diff --git a/cmd/sentry/download/sentry.go b/cmd/sentry/download/sentry.go index ba248bec7e11e5fa8939341354053422515995dd..20022057300b67b39b116cb307d0ae2f6f019db8 100644 --- a/cmd/sentry/download/sentry.go +++ b/cmd/sentry/download/sentry.go @@ -193,7 +193,7 @@ func handShake( var reply eth.StatusPacket if err1 = msg.Decode(&reply); err1 != nil { msg.Discard() - return fmt.Errorf("decode message %v: %v", msg, err1) + return fmt.Errorf("decode message %v: %w", msg, err1) } msg.Discard() if reply.NetworkID != networkID { @@ -209,7 +209,7 @@ func handShake( return fmt.Errorf("genesis hash does not match: theirs %x, ours %x", reply.Genesis, genesisHash) } if err1 = forkFilter(reply.ForkID); err1 != nil { - return fmt.Errorf("%v", err1) + return fmt.Errorf("%w", err1) } td, overflow := uint256.FromBig(reply.TD) @@ -284,7 +284,7 @@ func runPeer( } msg, err := rw.ReadMsg() if err != nil { - return fmt.Errorf("reading message: %v", err) + return fmt.Errorf("reading message: %w", err) } if msg.Size > eth.ProtocolMaxMsgSize { msg.Discard() @@ -485,7 +485,7 @@ func NewSentryServer(ctx context.Context, dialCandidates enode.Iterator, readNod return ss.startSync(ctx, bestHash, peerID) }) if err != nil { - return fmt.Errorf("handshake to peer %s: %v", peerID, err) + return fmt.Errorf("handshake to peer %s: %w", peerID, err) } log.Debug(fmt.Sprintf("[%s] Received status message OK", peerID), "name", peer.Name()) @@ -565,7 +565,7 @@ func (ss *SentryServerImpl) startSync(ctx context.Context, bestHash common.Hash, Origin: eth.HashOrNumber{Hash: bestHash}, }) if err != nil { - return fmt.Errorf("startSync encode packet failed: %v", err) + return fmt.Errorf("startSync encode packet failed: %w", err) } if _, err := ss.SendMessageById(ctx, &proto_sentry.SendMessageByIdRequest{ @@ -589,7 +589,7 @@ func (ss *SentryServerImpl) startSync(ctx context.Context, bestHash common.Hash, }, }) if err != nil { - return fmt.Errorf("startSync encode packet failed: %v", err) + return fmt.Errorf("startSync encode packet failed: %w", err) } if _, err := ss.SendMessageById(ctx, &proto_sentry.SendMessageByIdRequest{ PeerId: gointerfaces.ConvertBytesToH512([]byte(peerID)), @@ -679,7 +679,7 @@ func (ss *SentryServerImpl) SendMessageByMinBlock(_ context.Context, inreq *prot } } ss.GoodPeers.Delete(peerID) - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageByMinBlock to peer %s: %v", peerID, err) + return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageByMinBlock to peer %s: %w", peerID, err) } peerInfo.AddDeadline(time.Now().Add(30 * time.Second)) return &proto_sentry.SentPeers{Peers: []*proto_types.H512{gointerfaces.ConvertBytesToH512([]byte(peerID))}}, nil @@ -714,7 +714,7 @@ func (ss *SentryServerImpl) SendMessageById(_ context.Context, inreq *proto_sent } } ss.GoodPeers.Delete(peerID) - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageById to peer %s: %v", peerID, err) + return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageById to peer %s: %w", peerID, err) } return &proto_sentry.SentPeers{Peers: []*proto_types.H512{inreq.PeerId}}, nil } diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 01de3d4c65f37965c1cd6ef62165d1217e99a8c2..3e457cbd5f5bd07033f133a38a512acc5140aa9d 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -109,7 +109,7 @@ func CompileSolidityString(solc, source string) (map[string]*Contract, error) { return nil, err } args := append(s.makeArgs(), "--") - cmd := exec.Command(s.Path, append(args, "-")...) + cmd := exec.Command(s.Path, append(args, "-")...) //nolint:gosec cmd.Stdin = strings.NewReader(source) return s.run(cmd, source) } @@ -128,7 +128,7 @@ func CompileSolidity(solc string, sourcefiles ...string) (map[string]*Contract, return nil, err } args := append(s.makeArgs(), "--") - cmd := exec.Command(s.Path, append(args, sourcefiles...)...) + cmd := exec.Command(s.Path, append(args, sourcefiles...)...) //nolint:gosec return s.run(cmd, source) } diff --git a/common/compiler/vyper.go b/common/compiler/vyper.go index a9bca95e5901f0584b516e570e5a5ccb0b9e47ba..fb1f98d863e53e7cce8e8a7708ec81c2e28df70c 100644 --- a/common/compiler/vyper.go +++ b/common/compiler/vyper.go @@ -83,7 +83,7 @@ func CompileVyper(vyper string, sourcefiles ...string) (map[string]*Contract, er return nil, err } args := s.makeArgs() - cmd := exec.Command(s.Path, append(args, sourcefiles...)...) + cmd := exec.Command(s.Path, append(args, sourcefiles...)...) //nolint:gosec return s.run(cmd, source) } diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index b0b94dc681706f2faefc2fdafc9b5dd86f79a21d..e34ebfb16acd0dd661863ee48bb821f2a3811243 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -521,11 +521,11 @@ func TestTransactionCoding(t *testing.T) { func encodeDecodeJSON(tx Transaction) (Transaction, error) { data, err := json.Marshal(tx) if err != nil { - return nil, fmt.Errorf("json encoding failed: %v", err) + return nil, fmt.Errorf("json encoding failed: %w", err) } var parsedTx Transaction if parsedTx, err = UnmarshalTransactionFromJSON(data); err != nil { - return nil, fmt.Errorf("json decoding failed: %v", err) + return nil, fmt.Errorf("json decoding failed: %w", err) } return parsedTx, nil } @@ -534,11 +534,11 @@ func encodeDecodeBinary(tx Transaction) (Transaction, error) { var buf bytes.Buffer var err error if err = tx.MarshalBinary(&buf); err != nil { - return nil, fmt.Errorf("rlp encoding failed: %v", err) + return nil, fmt.Errorf("rlp encoding failed: %w", err) } var parsedTx Transaction if parsedTx, err = UnmarshalTransactionFromBinary(buf.Bytes()); err != nil { - return nil, fmt.Errorf("rlp decoding failed: %v", err) + return nil, fmt.Errorf("rlp decoding failed: %w", err) } return parsedTx, nil } diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 743efacbf53ffedfcff5a914d566395fcf8b3ec8..d61e6faed0735b12de3e31a480141fc4d88a6d2c 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -560,7 +560,7 @@ func opJump(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]by if usedBitmap && interpreter.cfg.TraceJumpDest { log.Warn("Code Bitmap used for detecting invalid jump", "tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext.TxHash), - "block number", interpreter.evm.Context.BlockNumber, + "block_num", interpreter.evm.Context.BlockNumber, ) } return nil, ErrInvalidJump @@ -576,7 +576,7 @@ func opJumpi(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]b if usedBitmap && interpreter.cfg.TraceJumpDest { log.Warn("Code Bitmap used for detecting invalid jump", "tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext.TxHash), - "block number", interpreter.evm.Context.BlockNumber, + "block_num", interpreter.evm.Context.BlockNumber, ) } return nil, ErrInvalidJump diff --git a/eth/backend.go b/eth/backend.go index ad0e6381c78e46c32de5bf4a53c94ad6064bf891..6d9ba66d3b3f86aa0a352779a0d88fbe4e40af9a 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -651,9 +651,11 @@ func (s *Ethereum) StartMining(ctx context.Context, db kv.RwDB, mining *stagedsy if hh.BaseFee != nil { baseFee = hh.BaseFee.Uint64() } - return s.txPool2.OnNewBlock(context.Background(), &remote.StateChange{ - BlockHeight: hh.Number.Uint64(), BlockHash: gointerfaces.ConvertHashToH256(hh.Hash()), - }, txpool2.TxSlots{}, txpool2.TxSlots{}, baseFee) + return s.txPool2.OnNewBlock(context.Background(), &remote.StateChangeBatch{ + DatabaseViewID: tx.ViewID(), ChangeBatch: []*remote.StateChange{ + {BlockHeight: hh.Number.Uint64(), BlockHash: gointerfaces.ConvertHashToH256(hh.Hash()), ProtocolBaseFee: baseFee}, + }, + }, txpool2.TxSlots{}, txpool2.TxSlots{}) }); err != nil { return err } diff --git a/eth/stagedsync/stage_blockhashes.go b/eth/stagedsync/stage_blockhashes.go index 97cb328e1983ec2910a5ac18f2db2ac1c2f81d38..842ee212a43de69979cb35ef125d00880d3567ea 100644 --- a/eth/stagedsync/stage_blockhashes.go +++ b/eth/stagedsync/stage_blockhashes.go @@ -96,7 +96,7 @@ func UnwindBlockHashStage(u *UnwindState, tx kv.RwTx, cfg BlockHashesCfg, ctx co } if err = u.Done(tx); err != nil { - return fmt.Errorf(" reset: %v", err) + return fmt.Errorf(" reset: %w", err) } if !useExternalTx { if err = tx.Commit(); err != nil { diff --git a/eth/stagedsync/stage_bodies.go b/eth/stagedsync/stage_bodies.go index da2837698cf50b3e413bab6d8b3aa6ade313f95b..6002d1bc7117eca5bdb8dea1c88224369b92ade1 100644 --- a/eth/stagedsync/stage_bodies.go +++ b/eth/stagedsync/stage_bodies.go @@ -227,7 +227,7 @@ func logProgressBodies(logPrefix string, committed uint64, prevDeliveredCount, d var m runtime.MemStats runtime.ReadMemStats(&m) log.Info(fmt.Sprintf("[%s] Wrote block bodies", logPrefix), - "block number", committed, + "block_num", committed, "delivery/sec", common.StorageSize(speed), "wasted/sec", common.StorageSize(wastedSpeed), "alloc", common.StorageSize(m.Alloc), diff --git a/eth/stagedsync/stage_execute.go b/eth/stagedsync/stage_execute.go index f4da2c5c98fe7ea9d3740bbf66ea6206b2a80953..8d3cb7e3336eb637e28d973c016e3a5b1d1fa40c 100644 --- a/eth/stagedsync/stage_execute.go +++ b/eth/stagedsync/stage_execute.go @@ -208,7 +208,7 @@ func newStateReaderWriter( if block.BaseFee() != nil { blockBaseFee = block.BaseFee().Uint64() } - accumulator.StartChange(tx.ID(), block.NumberU64(), block.Hash(), block.NumberU64()-1, block.ParentHash(), txs, blockBaseFee, false) + accumulator.StartChange(block.NumberU64(), block.Hash(), block.NumberU64()-1, block.ParentHash(), txs, blockBaseFee, false) } else { accumulator = nil } @@ -435,7 +435,7 @@ func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan return fmt.Errorf("read canonical hash of unwind point: %w", err) } - accumulator.StartChange(tx.ID(), u.UnwindPoint, hash, s.BlockNumber, prevHash, txs, protocolBaseFee, true /* unwind */) + accumulator.StartChange(u.UnwindPoint, hash, s.BlockNumber, prevHash, txs, protocolBaseFee, true) } changes := etl.NewCollector(cfg.tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) diff --git a/ethdb/snapshotdb/kv_snapshot.go b/ethdb/snapshotdb/kv_snapshot.go index 13a28a729c11a3de4f759a1e3e68a76ee22d6214..955d207008d3c1e60e1b586d7ec5e9c3fa5940e1 100644 --- a/ethdb/snapshotdb/kv_snapshot.go +++ b/ethdb/snapshotdb/kv_snapshot.go @@ -288,8 +288,8 @@ type DBTX interface { DBTX() kv.RwTx } -func (s *snTX) DBTX() kv.RwTx { return s.dbTX.(kv.RwTx) } -func (s *snTX) ID() uint64 { return s.dbTX.ID() } +func (s *snTX) DBTX() kv.RwTx { return s.dbTX.(kv.RwTx) } +func (s *snTX) ViewID() uint64 { return s.dbTX.ViewID() } func (s *snTX) RwCursor(bucket string) (kv.RwCursor, error) { if !IsSnapshotBucket(bucket) { diff --git a/go.mod b/go.mod index 1fc4a78a94abc6a82bf9e40b04c10f0cd6c76224..e80bad4d85e8030854118ec211bedfb989eca16f 100644 --- a/go.mod +++ b/go.mod @@ -36,12 +36,10 @@ require ( github.com/json-iterator/go v1.1.11 github.com/julienschmidt/httprouter v1.3.0 github.com/kevinburke/go-bindata v3.21.0+incompatible - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/ledgerwatch/erigon-lib v0.0.0-20210915131428-451140b0a2e6 + github.com/ledgerwatch/erigon-lib v0.0.0-20210917022838-527036f986bb github.com/ledgerwatch/log/v3 v3.3.0 github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d github.com/logrusorgru/aurora/v3 v3.0.0 - github.com/mattn/go-isatty v0.0.14 // indirect github.com/pelletier/go-toml v1.9.3 github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99 github.com/quasilyte/go-ruleguard/dsl v0.3.6 diff --git a/go.sum b/go.sum index 848929a73a45fc5ff19ed0d6bd640338478d086a..ecefe2f02a3f034af79f5417c6905f78d76fe558 100644 --- a/go.sum +++ b/go.sum @@ -488,13 +488,12 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758 h1:0D5M2HQSGD3PYPwICLl+/9oulQauOuETfgFvhBDffs0= github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/ledgerwatch/erigon-lib v0.0.0-20210915131428-451140b0a2e6 h1:llu40F9ynI283rbyJ8Gug25ec2LTRpe1WTeBlYtO/io= -github.com/ledgerwatch/erigon-lib v0.0.0-20210915131428-451140b0a2e6/go.mod h1:kZsi9wFAOYIkegoiSj10RXOVc0EmDtUxltnNP1f1ZE0= +github.com/ledgerwatch/erigon-lib v0.0.0-20210917022838-527036f986bb h1:RS3uSN0lx90yRRfihFRCSS7KH6LdXrVDC5E+MMTXVq4= +github.com/ledgerwatch/erigon-lib v0.0.0-20210917022838-527036f986bb/go.mod h1:kZsi9wFAOYIkegoiSj10RXOVc0EmDtUxltnNP1f1ZE0= github.com/ledgerwatch/log/v3 v3.3.0 h1:k8N/3NQLILr8CKCMyza261vLFKU7VA+nMNNb0wVyQSc= github.com/ledgerwatch/log/v3 v3.3.0/go.mod h1:J58eOHHrIYHxl7LKkRsb/0YibKwtLfauUryl5SLRGm0= github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d h1:/IKMrJdfRsoYNc36PXqP4xMH3vhW/8IQyBKGQbKZUno= @@ -527,9 +526,8 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-sqlite3 v1.7.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.13.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= diff --git a/internal/debug/flags.go b/internal/debug/flags.go index 6ab26c26a4d832203ecd3c03b78de01c5a7e9339..9c659b81baaa61a91be59a57e325a2b4cf63c3bf 100644 --- a/internal/debug/flags.go +++ b/internal/debug/flags.go @@ -19,7 +19,7 @@ package debug import ( "fmt" "net/http" - _ "net/http/pprof" + _ "net/http/pprof" //nolint:gosec "os" "runtime" diff --git a/internal/jsre/jsre.go b/internal/jsre/jsre.go index 67319521f2e01524a5434db08677394881bce935..aa6f1afac08408c2d345ae8fc656a1ac5e0755fe 100644 --- a/internal/jsre/jsre.go +++ b/internal/jsre/jsre.go @@ -92,7 +92,7 @@ func randomSource() *rand.Rand { } src := rand.NewSource(seed) - return rand.New(src) + return rand.New(src) //nolint:gosec } // This function runs the main event loop from a goroutine that is started diff --git a/p2p/dnsdisc/sync.go b/p2p/dnsdisc/sync.go index 68f3748abf1fcf07ac1d142de451fd69786c0835..c58e31bcbf37a2d7eca4a1fe179511f723b1b7ff 100644 --- a/p2p/dnsdisc/sync.go +++ b/p2p/dnsdisc/sync.go @@ -131,7 +131,7 @@ func (ct *clientTree) syncNextLink(ctx context.Context) error { } func (ct *clientTree) syncNextRandomENR(ctx context.Context) (*enode.Node, error) { - index := rand.Intn(len(ct.enrs.missing)) + index := rand.Intn(len(ct.enrs.missing)) //nolint:gosec hash := ct.enrs.missing[index] e, err := ct.enrs.resolveNext(ctx, hash) if err != nil { diff --git a/p2p/enode/nodedb.go b/p2p/enode/nodedb.go index 297b42fd10daec74839bb7c5a8453a2809a9a2ea..d114713dc7ab68edaf64fd33fa0073a75431770c 100644 --- a/p2p/enode/nodedb.go +++ b/p2p/enode/nodedb.go @@ -362,7 +362,7 @@ func (db *DB) Node(id ID) *Node { func mustDecodeNode(id, data []byte) *Node { node := new(Node) if err := rlp.DecodeBytes(data, &node.r); err != nil { - panic(fmt.Errorf("p2p/enode: can't decode node %x in DB: %v", id, err)) + panic(fmt.Errorf("p2p/enode: can't decode node %x in DB: %w", id, err)) } // Restore node id cache. copy(node.id[:], id) diff --git a/p2p/enode/urlv4.go b/p2p/enode/urlv4.go index a2231ed577cec1e4d688fbe2bf9aec1231284686..16208724e930c5d67d4f701cc8e1944048be3228 100644 --- a/p2p/enode/urlv4.go +++ b/p2p/enode/urlv4.go @@ -73,7 +73,7 @@ func ParseV4(rawurl string) (*Node, error) { if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil { id, err := parsePubkey(m[1]) if err != nil { - return nil, fmt.Errorf("invalid public key (%v)", err) + return nil, fmt.Errorf("invalid public key (%w)", err) } return NewV4(id, nil, 0, 0), nil } @@ -124,7 +124,7 @@ func parseComplete(rawurl string) (*Node, error) { return nil, errors.New("does not contain node ID") } if id, err = parsePubkey(u.User.String()); err != nil { - return nil, fmt.Errorf("invalid public key (%v)", err) + return nil, fmt.Errorf("invalid public key (%w)", err) } // Parse the IP address. ip := net.ParseIP(u.Hostname()) diff --git a/p2p/rlpx/rlpx.go b/p2p/rlpx/rlpx.go index f83e36332bb928fc56d94fdbe7358fbf700fb1d9..c6137f47d672aedea1d3afe6a2ed98bb03b1c4f5 100644 --- a/p2p/rlpx/rlpx.go +++ b/p2p/rlpx/rlpx.go @@ -631,7 +631,7 @@ func (h *handshakeState) sealEIP8(msg interface{}) ([]byte, error) { } // Pad with random amount of data. the amount needs to be at least 100 bytes to make // the message distinguishable from pre-EIP-8 handshakes. - h.wbuf.appendZero(mrand.Intn(100) + 100) + h.wbuf.appendZero(mrand.Intn(100) + 100) //nolint:gosec prefix := make([]byte, 2) binary.BigEndian.PutUint16(prefix, uint16(len(h.wbuf.data)+eciesOverhead)) diff --git a/turbo/shards/state_change_accumulator.go b/turbo/shards/state_change_accumulator.go index 77f6be49d3379a53a1b14fcf22d31b718aa44eab..6fafe8a078bf790303573e2a8dd6b8c0d2415dce 100644 --- a/turbo/shards/state_change_accumulator.go +++ b/turbo/shards/state_change_accumulator.go @@ -11,40 +11,36 @@ import ( // Accumulator collects state changes in a form that can then be delivered to the RPC daemon type Accumulator struct { - changes []remote.StateChange + viewID uint64 // mdbx's txID + changes []*remote.StateChange latestChange *remote.StateChange accountChangeIndex map[common.Address]int // For the latest changes, allows finding account change by account's address storageChangeIndex map[common.Address]map[common.Hash]int } type StateChangeConsumer interface { - SendStateChanges(sc *remote.StateChange) + SendStateChanges(ctx context.Context, sc *remote.StateChangeBatch) } -func (a *Accumulator) Reset() { +func (a *Accumulator) Reset(viewID uint64) { a.changes = nil a.latestChange = nil a.accountChangeIndex = nil a.storageChangeIndex = nil + a.viewID = viewID } func (a *Accumulator) SendAndReset(ctx context.Context, c StateChangeConsumer) { if a == nil || c == nil || len(a.changes) == 0 { return } - for i := range a.changes { - if err := libcommon.Stopped(ctx.Done()); err != nil { - return - } - c.SendStateChanges(&a.changes[i]) - } - a.Reset() + c.SendStateChanges(ctx, &remote.StateChangeBatch{DatabaseViewID: a.viewID, ChangeBatch: a.changes}) + a.Reset(0) // reset here for GC, but there will be another Reset with correct viewID } // StartChange begins accumulation of changes for a new block -func (a *Accumulator) StartChange(txID, blockHeight uint64, blockHash common.Hash, prevBlockHeight uint64, prevBlockHash common.Hash, txs [][]byte, protocolBaseFee uint64, unwind bool) { - a.changes = append(a.changes, remote.StateChange{}) - a.latestChange = &a.changes[len(a.changes)-1] - a.latestChange.DatabaseViewID = txID +func (a *Accumulator) StartChange(blockHeight uint64, blockHash common.Hash, prevBlockHeight uint64, prevBlockHash common.Hash, txs [][]byte, protocolBaseFee uint64, unwind bool) { + a.changes = append(a.changes, &remote.StateChange{}) + a.latestChange = a.changes[len(a.changes)-1] a.latestChange.BlockHeight = blockHeight a.latestChange.BlockHash = gointerfaces.ConvertHashToH256(blockHash) a.latestChange.PrevBlockHeight = prevBlockHeight diff --git a/turbo/stages/stageloop.go b/turbo/stages/stageloop.go index 99d9b04ea4f87ada6f6771fb76aa67fbdb8d26e1..9d1d72af59eb462aa9eba44b52920870336a2e73 100644 --- a/turbo/stages/stageloop.go +++ b/turbo/stages/stageloop.go @@ -110,10 +110,6 @@ func StageLoopStep( return err } - if notifications != nil && notifications.Accumulator != nil { - notifications.Accumulator.Reset() - } - canRunCycleInOneTransaction := !initialCycle && highestSeenHeader-origin < 8096 && highestSeenHeader-hashStateStageProgress < 8096 var tx kv.RwTx // on this variable will run sync cycle. @@ -125,6 +121,10 @@ func StageLoopStep( defer tx.Rollback() } + if notifications != nil && notifications.Accumulator != nil && canRunCycleInOneTransaction { + notifications.Accumulator.Reset(tx.ViewID()) + } + err = sync.Run(db, tx, initialCycle) if err != nil { return err diff --git a/turbo/txpool/p2p.go b/turbo/txpool/p2p.go index de706d1aa86aa670739c0e64c55ee76e21c968fa..a8e380c828f58e4416beab5430a6dc7c38a46544 100644 --- a/turbo/txpool/p2p.go +++ b/turbo/txpool/p2p.go @@ -325,10 +325,14 @@ func RecvTxMessage(ctx context.Context, return } if err = handleInboundMessage(ctx, req, sentry); err != nil { - if rlp.IsDecodeError(err) { - log.Debug("[RecvTxMessage] Handling incoming message", "error", err) - } else { - log.Warn("[RecvTxMessage] Handling incoming message", "error", err) + s, ok := status.FromError(err) + doLog := !((ok && s.Code() == codes.Canceled) || errors.Is(err, io.EOF) || errors.Is(err, context.Canceled)) + if doLog { + if rlp.IsDecodeError(err) { + log.Debug("[RecvTxMessage] Handling incoming message", "error", err) + } else { + log.Warn("[RecvTxMessage] Handling incoming message", "error", err) + } } } if wg != nil {