@cryptotaxi247 / kubo / commits / adfbecf3f

use stream.Reset where appropriate

License: MIT Signed-off-by: Steven Allen <steven@stebalien.com>

Steven Allen committed Sep 14, 2017 at 11:52 UTC adfbecf3f78ca72709fbed881452c6cd77ac98ac
8 files changed +68 -21
exchange/bitswap/network/interface.go
+1
@@ -40,6 +40,7 @@ type BitSwapNetwork interface {
40 type MessageSender interface {
41 SendMsg(context.Context, bsmsg.BitSwapMessage) error
42 Close() error
43 + Reset() error
44 }
45
46 // Implement Receiver to receive messages from the BitSwapNetwork
exchange/bitswap/network/ipfs_impl.go
+13 -2
@@ -56,6 +56,10 @@ func (s *streamMessageSender) Close() error {
56 return s.s.Close()
57 }
58
59 +func (s *streamMessageSender) Reset() error {
60 + return s.s.Reset()
61 +}
62 +
63 func (s *streamMessageSender) SendMsg(ctx context.Context, msg bsmsg.BitSwapMessage) error {
64 return msgToStream(ctx, s.s, msg)
65 }
@@ -121,9 +125,14 @@ func (bsnet *impl) SendMessage(
125 if err != nil {
126 return err
127 }
124 - defer s.Close()
128
126 - return msgToStream(ctx, s, outgoing)
129 + err = msgToStream(ctx, s, outgoing)
130 + if err != nil {
131 + s.Reset()
132 + } else {
133 + s.Close()
134 + }
135 + return err
136 }
137
138 func (bsnet *impl) SetDelegate(r Receiver) {
@@ -180,6 +189,7 @@ func (bsnet *impl) handleNewStream(s inet.Stream) {
189 defer s.Close()
190
191 if bsnet.receiver == nil {
192 + s.Reset()
193 return
194 }
195
@@ -188,6 +198,7 @@ func (bsnet *impl) handleNewStream(s inet.Stream) {
198 received, err := bsmsg.FromPBReader(reader)
199 if err != nil {
200 if err != io.EOF {
201 + s.Reset()
202 go bsnet.receiver.ReceiveError(err)
203 log.Debugf("bitswap net handleNewStream from %s error: %s", s.Conn().RemotePeer(), err)
204 }
exchange/bitswap/testnet/virtual.go
+4
@@ -133,6 +133,10 @@ func (mp *messagePasser) Close() error {
133 return nil
134 }
135
136 +func (mp *messagePasser) Reset() error {
137 + return nil
138 +}
139 +
140 func (n *networkClient) NewMessageSender(ctx context.Context, p peer.ID) (bsnet.MessageSender, error) {
141 return &messagePasser{
142 net: n.network,
exchange/bitswap/wantmanager.go
+7 -6
@@ -172,18 +172,19 @@ func (pm *WantManager) stopPeerHandler(p peer.ID) {
172 }
173
174 func (mq *msgQueue) runQueue(ctx context.Context) {
175 - defer func() {
176 - if mq.sender != nil {
177 - mq.sender.Close()
178 - }
179 - }()
175 for {
176 select {
177 case <-mq.work: // there is work to be done
178 mq.doWork(ctx)
179 case <-mq.done:
180 + if mq.sender != nil {
181 + mq.sender.Close()
182 + }
183 return
184 case <-ctx.Done():
185 + if mq.sender != nil {
186 + mq.sender.Reset()
187 + }
188 return
189 }
190 }
@@ -218,7 +219,7 @@ func (mq *msgQueue) doWork(ctx context.Context) {
219 }
220
221 log.Infof("bitswap send error: %s", err)
221 - mq.sender.Close()
222 + mq.sender.Reset()
223 mq.sender = nil
224
225 select {
p2p/p2p.go
+3 -3
@@ -64,7 +64,7 @@ func (p2p *P2P) Dial(ctx context.Context, addr ma.Multiaddr, peer peer.ID, proto
64 case "tcp", "tcp4", "tcp6":
65 listener, err := manet.Listen(bindAddr)
66 if err != nil {
67 - if err2 := remote.Close(); err2 != nil {
67 + if err2 := remote.Reset(); err2 != nil {
68 return nil, err2
69 }
70 return nil, err
@@ -158,7 +158,7 @@ func (p2p *P2P) registerStreamHandler(ctx2 context.Context, protocol string) (*P
158 select {
159 case list.conCh <- s:
160 case <-ctx.Done():
161 - s.Close()
161 + s.Reset()
162 }
163 })
164
@@ -198,7 +198,7 @@ func (p2p *P2P) acceptStreams(listenerInfo *ListenerInfo, listener Listener) {
198
199 local, err := manet.Dial(listenerInfo.Address)
200 if err != nil {
201 - remote.Close()
201 + remote.Reset()
202 continue
203 }
204
p2p/registry.go
+24 -6
@@ -4,6 +4,8 @@ import (
4 "fmt"
5 "io"
6
7 + net "gx/ipfs/QmNa31VPzC561NWwRsJLE7nGYZYuuD2QfpK2b1q9BK54J1/go-libp2p-net"
8 + manet "gx/ipfs/QmX3U3YXCQ6UYBxq2LVWF8dARS1hPUTEYLrSx654Qyxyw6/go-multiaddr-net"
9 ma "gx/ipfs/QmXY77cVe7rVRQXZZQRioukUM7aRW3BTcAgJe12MCtb3Ji/go-multiaddr"
10 peer "gx/ipfs/QmXYjuNuxVzXKJCfWasQk1RqkhVLDM9jtUKhqc2WPQmFSB/go-libp2p-peer"
11 )
@@ -76,8 +78,8 @@ type StreamInfo struct {
78 RemotePeer peer.ID
79 RemoteAddr ma.Multiaddr
80
79 - Local io.ReadWriteCloser
80 - Remote io.ReadWriteCloser
81 + Local manet.Conn
82 + Remote net.Stream
83
84 Registry *StreamRegistry
85 }
@@ -90,15 +92,31 @@ func (s *StreamInfo) Close() error {
92 return nil
93 }
94
95 +// Reset closes stream endpoints and deregisters it
96 +func (s *StreamInfo) Reset() error {
97 + s.Local.Close()
98 + s.Remote.Reset()
99 + s.Registry.Deregister(s.HandlerID)
100 + return nil
101 +}
102 +
103 func (s *StreamInfo) startStreaming() {
104 go func() {
95 - io.Copy(s.Local, s.Remote)
96 - s.Close()
105 + _, err := io.Copy(s.Local, s.Remote)
106 + if err != nil {
107 + s.Reset()
108 + } else {
109 + s.Close()
110 + }
111 }()
112
113 go func() {
100 - io.Copy(s.Remote, s.Local)
101 - s.Close()
114 + _, err := io.Copy(s.Remote, s.Local)
115 + if err != nil {
116 + s.Reset()
117 + } else {
118 + s.Close()
119 + }
120 }()
121 }
122
routing/supernode/proxy/loopback.go
+4 -1
@@ -42,6 +42,7 @@ func (lb *Loopback) HandleStream(s inet.Stream) {
42 pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax)
43 var incoming dhtpb.Message
44 if err := pbr.ReadMsg(&incoming); err != nil {
45 + s.Reset()
46 log.Debug(err)
47 return
48 }
@@ -51,6 +52,8 @@ func (lb *Loopback) HandleStream(s inet.Stream) {
52 pbw := ggio.NewDelimitedWriter(s)
53
54 if err := pbw.WriteMsg(outgoing); err != nil {
54 - return // TODO logerr
55 + s.Reset()
56 + log.Debug(err)
57 + return
58 }
59 }
routing/supernode/proxy/standard.go
+12 -3
@@ -60,7 +60,7 @@ func (px *standard) Bootstrap(ctx context.Context) error {
60 func (p *standard) HandleStream(s inet.Stream) {
61 // TODO(brian): Should clients be able to satisfy requests?
62 log.Error("supernode client received (dropped) a routing message from", s.Conn().RemotePeer())
63 - s.Close()
63 + s.Reset()
64 }
65
66 const replicationFactor = 2
@@ -102,9 +102,15 @@ func (px *standard) sendMessage(ctx context.Context, m *dhtpb.Message, remote pe
102 if err != nil {
103 return err
104 }
105 - defer s.Close()
105 pbw := ggio.NewDelimitedWriter(s)
107 - return pbw.WriteMsg(m)
106 +
107 + err = pbw.WriteMsg(m)
108 + if err == nil {
109 + s.Close()
110 + } else {
111 + s.Reset()
112 + }
113 + return err
114 }
115
116 // SendRequest sends the request to each remote sequentially (randomized order),
@@ -139,17 +145,20 @@ func (px *standard) sendRequest(ctx context.Context, m *dhtpb.Message, remote pe
145 r := ggio.NewDelimitedReader(s, inet.MessageSizeMax)
146 w := ggio.NewDelimitedWriter(s)
147 if err = w.WriteMsg(m); err != nil {
148 + s.Reset()
149 e.SetError(err)
150 return nil, err
151 }
152
153 response := &dhtpb.Message{}
154 if err = r.ReadMsg(response); err != nil {
155 + s.Reset()
156 e.SetError(err)
157 return nil, err
158 }
159 // need ctx expiration?
160 if response == nil {
161 + s.Reset()
162 err := errors.New("no response to request")
163 e.SetError(err)
164 return nil, err