cleanup stream reuse
License: MIT Signed-off-by: Jeromy <why@ipfs.io>
Jeromy committed
Jun 6, 2016 at 23:28 UTC
46d626a6dc899ad26ba03160b4db42d5d7298a9d
1 file changed
+38
-7
routing/dht/dht_net.go
+38
-7
@@ -126,6 +126,8 @@ type messageSender struct {
126
lk sync.Mutex
127
p peer.ID
128
dht *IpfsDHT
129
+
130
+ singleMes int
131
}
132
133
func (dht *IpfsDHT) newMessageSender(p peer.ID) *messageSender {
@@ -156,11 +158,39 @@ func (ms *messageSender) SendMessage(ctx context.Context, pmes *pb.Message) erro
158
return err
159
}
160
161
+ if err := ms.writeMessage(pmes); err != nil {
162
+ return err
163
+ }
164
+
165
+ if ms.singleMes > 3 {
166
+ ms.s.Close()
167
+ ms.s = nil
168
+ }
169
+
170
+ return nil
171
+}
172
+
173
+func (ms *messageSender) writeMessage(pmes *pb.Message) error {
174
err := ms.w.WriteMsg(pmes)
175
if err != nil {
176
+ // If the other side isnt expecting us to be reusing streams, we're gonna
177
+ // end up erroring here. To make sure things work seamlessly, lets retry once
178
+ // before continuing
179
+
180
+ log.Infof("error writing message: ", err)
181
ms.s.Close()
182
ms.s = nil
163
- return err
183
+ if err := ms.prep(); err != nil {
184
+ return err
185
+ }
186
+
187
+ if err := ms.w.WriteMsg(pmes); err != nil {
188
+ return err
189
+ }
190
+
191
+ // keep track of this happening. If it happens a few times, its
192
+ // likely we can assume the otherside will never support stream reuse
193
+ ms.singleMes++
194
}
195
return nil
196
}
@@ -172,22 +202,23 @@ func (ms *messageSender) SendRequest(ctx context.Context, pmes *pb.Message) (*pb
202
return nil, err
203
}
204
175
- err := ms.w.WriteMsg(pmes)
176
- if err != nil {
177
- ms.s.Close()
178
- ms.s = nil
205
+ if err := ms.writeMessage(pmes); err != nil {
206
return nil, err
207
}
208
209
log.Event(ctx, "dhtSentMessage", ms.dht.self, ms.p, pmes)
210
211
mes := new(pb.Message)
185
- err = ms.r.ReadMsg(mes)
186
- if err != nil {
212
+ if err := ms.r.ReadMsg(mes); err != nil {
213
ms.s.Close()
214
ms.s = nil
215
return nil, err
216
}
217
218
+ if ms.singleMes > 3 {
219
+ ms.s.Close()
220
+ ms.s = nil
221
+ }
222
+
223
return mes, nil
224
}