From 4bc878699ed4172801faf597014bdf914631bbe9 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 11 Apr 2019 11:48:03 +0300 Subject: [PATCH 1/3] use buffer pool in newDelimitedReader instead of allocating the buffer flat --- util.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util.go b/util.go index 5812dba..e1fa3db 100644 --- a/util.go +++ b/util.go @@ -9,6 +9,7 @@ import ( ggio "github.com/gogo/protobuf/io" proto "github.com/gogo/protobuf/proto" + pool "github.com/libp2p/go-buffer-pool" peer "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" @@ -64,7 +65,7 @@ type delimitedReader struct { // - messages are small (max 4k) and the length fits in a couple of bytes, // so overall we have at most three reads per message. func newDelimitedReader(r io.Reader, maxSize int) *delimitedReader { - return &delimitedReader{r: r, buf: make([]byte, maxSize)} + return &delimitedReader{r: r, buf: pool.Get(maxSize)} } func (d *delimitedReader) ReadByte() (byte, error) { From d477bf7df00128365d9c7dea48951ee710bcdeac Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 11 Apr 2019 11:59:53 +0300 Subject: [PATCH 2/3] put back the buffer in the pool --- relay.go | 1 + util.go | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/relay.go b/relay.go index ec31110..af6b115 100644 --- a/relay.go +++ b/relay.go @@ -323,6 +323,7 @@ func (r *Relay) handleHopStream(s inet.Stream, msg *pb.CircuitRelay) { // stop handshake rd := newDelimitedReader(bs, maxMessageSize) wr := newDelimitedWriter(bs) + defer rd.Close() msg.Type = pb.CircuitRelay_STOP.Enum() diff --git a/util.go b/util.go index e1fa3db..7d56b89 100644 --- a/util.go +++ b/util.go @@ -68,6 +68,13 @@ func newDelimitedReader(r io.Reader, maxSize int) *delimitedReader { return &delimitedReader{r: r, buf: pool.Get(maxSize)} } +func (d *delimitedReader) Close() { + if d.buf != nil { + pool.Put(d.buf) + d.buf = nil + } +} + func (d *delimitedReader) ReadByte() (byte, error) { buf := d.buf[:1] _, err := d.r.Read(buf) From 60838572272bfbd281a43e77bbe8116c0a276f2e Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 11 Apr 2019 13:01:43 +0300 Subject: [PATCH 3/3] close the delimited reader everywhere --- relay.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/relay.go b/relay.go index af6b115..b15841b 100644 --- a/relay.go +++ b/relay.go @@ -170,6 +170,7 @@ func (r *Relay) DialPeer(ctx context.Context, relay pstore.PeerInfo, dest pstore rd := newDelimitedReader(s, maxMessageSize) wr := newDelimitedWriter(s) + defer rd.Close() var msg pb.CircuitRelay @@ -218,6 +219,7 @@ func (r *Relay) CanHop(ctx context.Context, id peer.ID) (bool, error) { rd := newDelimitedReader(s, maxMessageSize) wr := newDelimitedWriter(s) + defer rd.Close() var msg pb.CircuitRelay @@ -249,6 +251,7 @@ func (r *Relay) handleNewStream(s inet.Stream) { log.Infof("new relay stream from: %s", s.Conn().RemotePeer()) rd := newDelimitedReader(s, maxMessageSize) + defer rd.Close() var msg pb.CircuitRelay