feat:make discv5 timeout configuable

Signed-off-by: Chen Kai <281165273grape@gmail.com>
This commit is contained in:
Chen Kai 2025-02-03 16:34:41 +08:00
parent 55a18616b1
commit 6078fe2adc
2 changed files with 26 additions and 22 deletions

View file

@ -49,8 +49,9 @@ type Config struct {
// All remaining settings are optional. // All remaining settings are optional.
// Packet handling configuration: // Packet handling configuration:
NetRestrict *netutil.Netlist // list of allowed IP networks NetRestrict *netutil.Netlist // list of allowed IP networks
Unhandled chan<- ReadPacket // unhandled packets are sent on this channel Unhandled chan<- ReadPacket // unhandled packets are sent on this channel
V5RespTimeout time.Duration // timeout for v5 queries
// Node table configuration: // Node table configuration:
Bootnodes []*enode.Node // list of bootstrap nodes Bootnodes []*enode.Node // list of bootstrap nodes
@ -73,6 +74,9 @@ func (cfg Config) withDefaults() Config {
if cfg.RefreshInterval == 0 { if cfg.RefreshInterval == 0 {
cfg.RefreshInterval = 30 * time.Minute cfg.RefreshInterval = 30 * time.Minute
} }
if cfg.V5RespTimeout == 0 {
cfg.V5RespTimeout = 700 * time.Millisecond
}
// Debug/test settings: // Debug/test settings:
if cfg.Log == nil { if cfg.Log == nil {

View file

@ -42,8 +42,6 @@ const (
lookupRequestLimit = 3 // max requests against a single node during lookup lookupRequestLimit = 3 // max requests against a single node during lookup
findnodeResultLimit = 16 // applies in FINDNODE handler findnodeResultLimit = 16 // applies in FINDNODE handler
totalNodesResponseLimit = 5 // applies in waitForNodes totalNodesResponseLimit = 5 // applies in waitForNodes
respTimeoutV5 = 700 * time.Millisecond
) )
// codecV5 is implemented by v5wire.Codec (and testCodec). // codecV5 is implemented by v5wire.Codec (and testCodec).
@ -62,15 +60,16 @@ type codecV5 interface {
// UDPv5 is the implementation of protocol version 5. // UDPv5 is the implementation of protocol version 5.
type UDPv5 struct { type UDPv5 struct {
// static fields // static fields
conn UDPConn conn UDPConn
tab *Table tab *Table
netrestrict *netutil.Netlist netrestrict *netutil.Netlist
priv *ecdsa.PrivateKey priv *ecdsa.PrivateKey
localNode *enode.LocalNode localNode *enode.LocalNode
db *enode.DB db *enode.DB
log log.Logger log log.Logger
clock mclock.Clock clock mclock.Clock
validSchemes enr.IdentityScheme validSchemes enr.IdentityScheme
v5respTimeout time.Duration
// misc buffers used during message handling // misc buffers used during message handling
logcontext []interface{} logcontext []interface{}
@ -150,14 +149,15 @@ func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) {
cfg = cfg.withDefaults() cfg = cfg.withDefaults()
t := &UDPv5{ t := &UDPv5{
// static fields // static fields
conn: newMeteredConn(conn), conn: newMeteredConn(conn),
localNode: ln, localNode: ln,
db: ln.Database(), db: ln.Database(),
netrestrict: cfg.NetRestrict, netrestrict: cfg.NetRestrict,
priv: cfg.PrivateKey, priv: cfg.PrivateKey,
log: cfg.Log, log: cfg.Log,
validSchemes: cfg.ValidSchemes, validSchemes: cfg.ValidSchemes,
clock: cfg.Clock, clock: cfg.Clock,
v5respTimeout: cfg.V5RespTimeout,
// channels into dispatch // channels into dispatch
packetInCh: make(chan ReadPacket, 1), packetInCh: make(chan ReadPacket, 1),
readNextCh: make(chan struct{}, 1), readNextCh: make(chan struct{}, 1),
@ -576,7 +576,7 @@ func (t *UDPv5) startResponseTimeout(c *callV5) {
timer mclock.Timer timer mclock.Timer
done = make(chan struct{}) done = make(chan struct{})
) )
timer = t.clock.AfterFunc(respTimeoutV5, func() { timer = t.clock.AfterFunc(t.v5respTimeout, func() {
<-done <-done
select { select {
case t.respTimeoutCh <- &callTimeout{c, timer}: case t.respTimeoutCh <- &callTimeout{c, timer}: