p2p: cleanup v4 if v5 failed (#33005)
Some checks are pending
/ Linux Build (push) Waiting to run
/ Linux Build (arm) (push) Waiting to run
/ Keeper Build (push) Waiting to run
/ Windows Build (push) Waiting to run
/ Docker Image (push) Waiting to run

Clean the previous resource (v4) if the latter (v5) failed.
This commit is contained in:
Delweng 2025-10-29 17:34:19 +08:00 committed by GitHub
parent ae37b4928c
commit 5dd0fe2f53
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 0 deletions

View file

@ -490,6 +490,11 @@ func (srv *Server) setupDiscovery() error {
} }
srv.discv5, err = discover.ListenV5(sconn, srv.localnode, cfg) srv.discv5, err = discover.ListenV5(sconn, srv.localnode, cfg)
if err != nil { if err != nil {
// Clean up v4 if v5 setup fails.
if srv.discv4 != nil {
srv.discv4.Close()
srv.discv4 = nil
}
return err return err
} }
} }

View file

@ -579,6 +579,33 @@ func TestServerInboundThrottle(t *testing.T) {
} }
} }
func TestServerDiscoveryV5FailureRollsBackV4(t *testing.T) {
badBootstrap := enode.NewV4(&newkey().PublicKey, net.ParseIP("127.0.0.1"), 30303, 0) // invalid V5 of a V4 node
srv := &Server{
Config: Config{
PrivateKey: newkey(),
ListenAddr: "",
DiscAddr: "127.0.0.1:0",
MaxPeers: 5,
DiscoveryV4: true,
DiscoveryV5: true,
BootstrapNodesV5: []*enode.Node{badBootstrap},
Logger: testlog.Logger(t, log.LvlTrace),
},
}
err := srv.Start()
if err == nil {
t.Fatal("expected discovery v5 startup failure")
}
if !strings.Contains(err.Error(), "bad bootstrap node") {
t.Fatalf("unexpected error: %v", err)
}
if srv.DiscoveryV4() != nil {
t.Fatal("discovery v4 not cleaned after failure")
}
srv.Stop()
}
func listenFakeAddr(network, laddr string, remoteAddr net.Addr) (net.Listener, error) { func listenFakeAddr(network, laddr string, remoteAddr net.Addr) (net.Listener, error) {
l, err := net.Listen(network, laddr) l, err := net.Listen(network, laddr)
if err == nil { if err == nil {