From 7caf4055a9e6498774ae45bd8b5528a9c254f373 Mon Sep 17 00:00:00 2001 From: sukun Date: Mon, 30 Dec 2024 15:44:54 +0000 Subject: [PATCH 1/2] tcpreuse: error on using tcpreuse with pnet Sharing the TCP Listen socket with WebSocket doesn't work with pnet. --- config/config.go | 21 ++++++++++++++++++++- libp2p_test.go | 11 ++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/config/config.go b/config/config.go index f3ea35855a..f08f2ec332 100644 --- a/config/config.go +++ b/config/config.go @@ -449,7 +449,22 @@ func (cfg *Config) newBasicHost(swrm *swarm.Swarm, eventBus event.Bus) (*bhost.B // NewNode constructs a new libp2p Host from the Config. // // This function consumes the config. Do not reuse it (really!). -func (cfg *Config) NewNode() (host.Host, error) { +func (cfg *Config) NewNode() (_ host.Host, createErr error) { + + defer func() { + if createErr != nil { + if cfg.ResourceManager != nil { + cfg.ResourceManager.Close() + } + if cfg.ConnManager != nil { + cfg.ConnManager.Close() + } + if cfg.Peerstore != nil { + cfg.Peerstore.Close() + } + } + }() + if cfg.EnableAutoRelay && !cfg.Relay { return nil, fmt.Errorf("cannot enable autorelay; relay is not enabled") } @@ -466,6 +481,10 @@ func (cfg *Config) NewNode() (host.Host, error) { rcmgr.MustRegisterWith(cfg.PrometheusRegisterer) } + if len(cfg.PSK) > 0 && cfg.ShareTCPListener { + return nil, errors.New("cannot use shared TCP and WebSocket listener with PSK") + } + fxopts := []fx.Option{ fx.Provide(func() event.Bus { return eventbus.NewBus(eventbus.WithMetricsTracer(eventbus.NewMetricsTracer(eventbus.WithRegisterer(cfg.PrometheusRegisterer)))) diff --git a/libp2p_test.go b/libp2p_test.go index 3de82946d8..9db47e4f6e 100644 --- a/libp2p_test.go +++ b/libp2p_test.go @@ -26,6 +26,7 @@ import ( "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/libp2p/go-libp2p/core/pnet" "github.com/libp2p/go-libp2p/core/routing" "github.com/libp2p/go-libp2p/core/transport" rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager" @@ -761,6 +762,7 @@ func TestSharedTCPAddr(t *testing.T) { ListenAddrStrings("/ip4/0.0.0.0/tcp/8888/ws"), ) require.NoError(t, err) + defer h.Close() sawTCP := false sawWS := false for _, addr := range h.Addrs() { @@ -773,5 +775,12 @@ func TestSharedTCPAddr(t *testing.T) { } require.True(t, sawTCP) require.True(t, sawWS) - h.Close() + + _, err = New( + ShareTCPListener(), + Transport(tcp.NewTCPTransport), + Transport(websocket.New), + PrivateNetwork(pnet.PSK([]byte{1, 2, 3})), + ) + require.ErrorContains(t, err, "cannot use shared TCP and WebSocket listener with PSK") } From 5ee9a3dce7d5781c7857a4dac5c47231f14d9253 Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Thu, 9 Jan 2025 17:03:13 -0500 Subject: [PATCH 2/2] PR Comments --- config/config.go | 53 ++++++++++++++++++++++++++---------------------- libp2p_test.go | 2 +- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/config/config.go b/config/config.go index f08f2ec332..ea94c067a3 100644 --- a/config/config.go +++ b/config/config.go @@ -446,27 +446,9 @@ func (cfg *Config) newBasicHost(swrm *swarm.Swarm, eventBus event.Bus) (*bhost.B return h, nil } -// NewNode constructs a new libp2p Host from the Config. -// -// This function consumes the config. Do not reuse it (really!). -func (cfg *Config) NewNode() (_ host.Host, createErr error) { - - defer func() { - if createErr != nil { - if cfg.ResourceManager != nil { - cfg.ResourceManager.Close() - } - if cfg.ConnManager != nil { - cfg.ConnManager.Close() - } - if cfg.Peerstore != nil { - cfg.Peerstore.Close() - } - } - }() - +func (cfg *Config) validate() error { if cfg.EnableAutoRelay && !cfg.Relay { - return nil, fmt.Errorf("cannot enable autorelay; relay is not enabled") + return fmt.Errorf("cannot enable autorelay; relay is not enabled") } // If possible check that the resource manager conn limit is higher than the // limit set in the conn manager. @@ -477,12 +459,35 @@ func (cfg *Config) NewNode() (_ host.Host, createErr error) { } } - if !cfg.DisableMetrics { - rcmgr.MustRegisterWith(cfg.PrometheusRegisterer) + if len(cfg.PSK) > 0 && cfg.ShareTCPListener { + return errors.New("cannot use shared TCP listener with PSK") } - if len(cfg.PSK) > 0 && cfg.ShareTCPListener { - return nil, errors.New("cannot use shared TCP and WebSocket listener with PSK") + return nil +} + +// NewNode constructs a new libp2p Host from the Config. +// +// This function consumes the config. Do not reuse it (really!). +func (cfg *Config) NewNode() (host.Host, error) { + + validateErr := cfg.validate() + if validateErr != nil { + if cfg.ResourceManager != nil { + cfg.ResourceManager.Close() + } + if cfg.ConnManager != nil { + cfg.ConnManager.Close() + } + if cfg.Peerstore != nil { + cfg.Peerstore.Close() + } + + return nil, validateErr + } + + if !cfg.DisableMetrics { + rcmgr.MustRegisterWith(cfg.PrometheusRegisterer) } fxopts := []fx.Option{ diff --git a/libp2p_test.go b/libp2p_test.go index 9db47e4f6e..3dc7f2e8ab 100644 --- a/libp2p_test.go +++ b/libp2p_test.go @@ -782,5 +782,5 @@ func TestSharedTCPAddr(t *testing.T) { Transport(websocket.New), PrivateNetwork(pnet.PSK([]byte{1, 2, 3})), ) - require.ErrorContains(t, err, "cannot use shared TCP and WebSocket listener with PSK") + require.ErrorContains(t, err, "cannot use shared TCP listener with PSK") }