From 4a7071a5662d0f8917f7d8699c570188d8eeb67d Mon Sep 17 00:00:00 2001 From: Exca-DK Date: Wed, 29 Mar 2023 19:01:49 +0200 Subject: [PATCH 1/3] p2p/discover: add metered conn --- p2p/discover/metrics.go | 50 +++++++++++++++++++++++++++++++++++++++++ p2p/discover/v4_udp.go | 2 +- p2p/discover/v5_udp.go | 2 +- 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 p2p/discover/metrics.go diff --git a/p2p/discover/metrics.go b/p2p/discover/metrics.go new file mode 100644 index 000000000000..4dd51f962470 --- /dev/null +++ b/p2p/discover/metrics.go @@ -0,0 +1,50 @@ +package discover + +import ( + "net" + + "github.com/ethereum/go-ethereum/metrics" +) + +const ( + moduleName = "discover" + // ingressMeterName is the prefix of the per-packet inbound metrics. + ingressMeterName = moduleName + "/ingress" + + // egressMeterName is the prefix of the per-packet outbound metrics. + egressMeterName = moduleName + "/egress" +) + +var ( + ingressTrafficMeter = metrics.NewRegisteredMeter(ingressMeterName, nil) + egressTrafficMeter = metrics.NewRegisteredMeter(egressMeterName, nil) +) + +// meteredConn is a wrapper around a net.UDPConn that meters both the +// inbound and outbound network traffic. +type meteredUdpConn struct { + UDPConn +} + +func newMeteredConn(conn UDPConn) UDPConn { + // Short circuit if metrics are disabled + if !metrics.Enabled { + return conn + } + + return &meteredUdpConn{UDPConn: conn} +} + +// Read delegates a network read to the underlying connection, bumping the udp ingress traffic meter along the way. +func (c *meteredUdpConn) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { + n, addr, err = c.UDPConn.ReadFromUDP(b) + ingressTrafficMeter.Mark(int64(n)) + return n, addr, err +} + +// Write delegates a network write to the underlying connection, bumping the udp egress traffic meter along the way. +func (c *meteredUdpConn) WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error) { + n, err = c.UDPConn.WriteToUDP(b, addr) + egressTrafficMeter.Mark(int64(n)) + return n, err +} diff --git a/p2p/discover/v4_udp.go b/p2p/discover/v4_udp.go index 67cd2c004cf6..21fee9c7934b 100644 --- a/p2p/discover/v4_udp.go +++ b/p2p/discover/v4_udp.go @@ -130,7 +130,7 @@ func ListenV4(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { cfg = cfg.withDefaults() closeCtx, cancel := context.WithCancel(context.Background()) t := &UDPv4{ - conn: c, + conn: newMeteredConn(c), priv: cfg.PrivateKey, netrestrict: cfg.NetRestrict, localNode: ln, diff --git a/p2p/discover/v5_udp.go b/p2p/discover/v5_udp.go index 38f5b3b652cf..dadacb528b1b 100644 --- a/p2p/discover/v5_udp.go +++ b/p2p/discover/v5_udp.go @@ -142,7 +142,7 @@ func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { cfg = cfg.withDefaults() t := &UDPv5{ // static fields - conn: conn, + conn: newMeteredConn(conn), localNode: ln, db: ln.Database(), netrestrict: cfg.NetRestrict, From d1b711440d7e0ed53ca90174b40d9fa8ee5d4f27 Mon Sep 17 00:00:00 2001 From: Exca-DK Date: Thu, 30 Mar 2023 08:16:54 +0200 Subject: [PATCH 2/3] license header --- p2p/discover/metrics.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/p2p/discover/metrics.go b/p2p/discover/metrics.go index 4dd51f962470..8c2801561c00 100644 --- a/p2p/discover/metrics.go +++ b/p2p/discover/metrics.go @@ -1,3 +1,19 @@ +// Copyright 2023 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + package discover import ( From 26e7c3815786e25cf3a713bd8f10ce7f0c98dcd7 Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Thu, 30 Mar 2023 15:46:47 +0800 Subject: [PATCH 3/3] Update metrics.go --- p2p/discover/metrics.go | 1 - 1 file changed, 1 deletion(-) diff --git a/p2p/discover/metrics.go b/p2p/discover/metrics.go index 8c2801561c00..bf1a2fa2b8c9 100644 --- a/p2p/discover/metrics.go +++ b/p2p/discover/metrics.go @@ -47,7 +47,6 @@ func newMeteredConn(conn UDPConn) UDPConn { if !metrics.Enabled { return conn } - return &meteredUdpConn{UDPConn: conn} }