Merge pull request #458 from libp2p/feat/ping
Add ping service in basic host and libp2p constructor option (enabled by default)
This commit is contained in:
commit
ddd5604b14
|
@ -56,6 +56,9 @@ type Config struct {
|
|||
NATManager NATManagerC
|
||||
Peerstore pstore.Peerstore
|
||||
Reporter metrics.Reporter
|
||||
|
||||
PingCustom bool
|
||||
Ping bool
|
||||
}
|
||||
|
||||
// NewNode constructs a new libp2p Host from the Config.
|
||||
|
@ -102,6 +105,7 @@ func (cfg *Config) NewNode(ctx context.Context) (host.Host, error) {
|
|||
ConnManager: cfg.ConnManager,
|
||||
AddrsFactory: cfg.AddrsFactory,
|
||||
NATManager: cfg.NATManager,
|
||||
EnablePing: cfg.Ping,
|
||||
})
|
||||
if err != nil {
|
||||
swrm.Close()
|
||||
|
|
|
@ -75,6 +75,11 @@ var DefaultEnableRelay = func(cfg *Config) error {
|
|||
return cfg.Apply(EnableRelay())
|
||||
}
|
||||
|
||||
// DefaultEnablePing enables the ping service by default
|
||||
var DefaultEnablePing = func(cfg *Config) error {
|
||||
return cfg.Apply(Ping(true))
|
||||
}
|
||||
|
||||
// Complete list of default options and when to fallback on them.
|
||||
//
|
||||
// Please *DON'T* specify default options any other way. Putting this all here
|
||||
|
@ -111,6 +116,10 @@ var defaults = []struct {
|
|||
fallback: func(cfg *Config) bool { return !cfg.RelayCustom },
|
||||
opt: DefaultEnableRelay,
|
||||
},
|
||||
{
|
||||
fallback: func(cfg *Config) bool { return !cfg.PingCustom },
|
||||
opt: DefaultEnablePing,
|
||||
},
|
||||
}
|
||||
|
||||
// Defaults configures libp2p to use the default options. Can be combined with
|
||||
|
|
|
@ -252,6 +252,15 @@ func NATManager(nm config.NATManagerC) Option {
|
|||
}
|
||||
}
|
||||
|
||||
// Ping will configure libp2p to support the ping service; enable by default.
|
||||
func Ping(enable bool) Option {
|
||||
return func(cfg *Config) error {
|
||||
cfg.PingCustom = true
|
||||
cfg.Ping = enable
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// NoListenAddrs will configure libp2p to not listen by default.
|
||||
//
|
||||
// This will both clear any configured listen addrs and prevent libp2p from
|
||||
|
|
|
@ -14,6 +14,7 @@ import (
|
|||
pstore "github.com/libp2p/go-libp2p-peerstore"
|
||||
protocol "github.com/libp2p/go-libp2p-protocol"
|
||||
identify "github.com/libp2p/go-libp2p/p2p/protocol/identify"
|
||||
ping "github.com/libp2p/go-libp2p/p2p/protocol/ping"
|
||||
ma "github.com/multiformats/go-multiaddr"
|
||||
madns "github.com/multiformats/go-multiaddr-dns"
|
||||
msmux "github.com/multiformats/go-multistream"
|
||||
|
@ -56,6 +57,7 @@ type BasicHost struct {
|
|||
network inet.Network
|
||||
mux *msmux.MultistreamMuxer
|
||||
ids *identify.IDService
|
||||
pings *ping.PingService
|
||||
natmgr NATManager
|
||||
addrs AddrsFactory
|
||||
maResolver *madns.Resolver
|
||||
|
@ -96,6 +98,9 @@ type HostOpts struct {
|
|||
|
||||
// ConnManager is a libp2p connection manager
|
||||
ConnManager ifconnmgr.ConnManager
|
||||
|
||||
// EnablePing indicates whether to instantiate the ping service
|
||||
EnablePing bool
|
||||
}
|
||||
|
||||
// NewHost constructs a new *BasicHost and activates it by attaching its stream and connection handlers to the given inet.Network.
|
||||
|
@ -149,6 +154,10 @@ func NewHost(ctx context.Context, net inet.Network, opts *HostOpts) (*BasicHost,
|
|||
net.Notify(h.cmgr.Notifee())
|
||||
}
|
||||
|
||||
if opts.EnablePing {
|
||||
h.pings = ping.NewPingService(h)
|
||||
}
|
||||
|
||||
net.SetConnHandler(h.newConnHandler)
|
||||
net.SetStreamHandler(h.newStreamHandler)
|
||||
return h, nil
|
||||
|
|
|
@ -72,7 +72,11 @@ func (p *PingService) PingHandler(s inet.Stream) {
|
|||
}
|
||||
|
||||
func (ps *PingService) Ping(ctx context.Context, p peer.ID) (<-chan time.Duration, error) {
|
||||
s, err := ps.Host.NewStream(ctx, p, ID)
|
||||
return Ping(ctx, ps.Host, p)
|
||||
}
|
||||
|
||||
func Ping(ctx context.Context, h host.Host, p peer.ID) (<-chan time.Duration, error) {
|
||||
s, err := h.NewStream(ctx, p, ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -92,7 +96,7 @@ func (ps *PingService) Ping(ctx context.Context, p peer.ID) (<-chan time.Duratio
|
|||
return
|
||||
}
|
||||
|
||||
ps.Host.Peerstore().RecordLatency(p, t)
|
||||
h.Peerstore().RecordLatency(p, t)
|
||||
select {
|
||||
case out <- t:
|
||||
case <-ctx.Done():
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package ping
|
||||
package ping_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
@ -9,6 +9,7 @@ import (
|
|||
pstore "github.com/libp2p/go-libp2p-peerstore"
|
||||
swarmt "github.com/libp2p/go-libp2p-swarm/testing"
|
||||
bhost "github.com/libp2p/go-libp2p/p2p/host/basic"
|
||||
ping "github.com/libp2p/go-libp2p/p2p/protocol/ping"
|
||||
)
|
||||
|
||||
func TestPing(t *testing.T) {
|
||||
|
@ -26,14 +27,14 @@ func TestPing(t *testing.T) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
|
||||
ps1 := NewPingService(h1)
|
||||
ps2 := NewPingService(h2)
|
||||
ps1 := ping.NewPingService(h1)
|
||||
ps2 := ping.NewPingService(h2)
|
||||
|
||||
testPing(t, ps1, h2.ID())
|
||||
testPing(t, ps2, h1.ID())
|
||||
}
|
||||
|
||||
func testPing(t *testing.T, ps *PingService, p peer.ID) {
|
||||
func testPing(t *testing.T, ps *ping.PingService, p peer.ID) {
|
||||
pctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
ts, err := ps.Ping(pctx, p)
|
||||
|
|
Loading…
Reference in New Issue