@cryptotaxi247 / kubo / commits / 46d626a6d

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 }