From f483c47187927a55b3f8c08703d558dbca073b69 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 30 May 2016 12:39:30 -0700 Subject: [PATCH] don't leak goroutines when pings complete --- p2p/protocol/ping/ping.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/p2p/protocol/ping/ping.go b/p2p/protocol/ping/ping.go index 80352510..dcf60587 100644 --- a/p2p/protocol/ping/ping.go +++ b/p2p/protocol/ping/ping.go @@ -20,6 +20,8 @@ const PingSize = 32 const ID = "/ipfs/ping/1.0.0" +const pingTimeout = time.Second * 60 + type PingService struct { Host host.Host } @@ -31,8 +33,23 @@ func NewPingService(h host.Host) *PingService { } func (p *PingService) PingHandler(s inet.Stream) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + buf := make([]byte, PingSize) + timer := time.NewTimer(pingTimeout) + defer timer.Stop() + + go func() { + select { + case <-timer.C: + case <-ctx.Done(): + } + + s.Close() + }() + for { _, err := io.ReadFull(s, buf) if err != nil { @@ -45,6 +62,8 @@ func (p *PingService) PingHandler(s inet.Stream) { log.Debug(err) return } + + timer.Reset(pingTimeout) } } @@ -57,6 +76,7 @@ func (ps *PingService) Ping(ctx context.Context, p peer.ID) (<-chan time.Duratio out := make(chan time.Duration) go func() { defer close(out) + defer s.Close() for { select { case <-ctx.Done():