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