only send local version once
Henry committed
Oct 16, 2014 at 12:03 UTC
0075a352da6af9c16af3ce92fb099929405c10df
1 file changed
+13
-3
net/swarm/conn.go
+13
-3
@@ -169,6 +169,10 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
169
return fmt.Errorf("connVersionExchange: could not prepare local version: %q", err)
170
}
171
172
+ // buffered channel to send our version just once
173
+ outBuf := make(chan []byte, 1)
174
+ outBuf <- myVersionMsg.Data()
175
+
176
var gotTheirs, sendMine bool
177
for {
178
if gotTheirs && sendMine {
@@ -184,9 +188,13 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
188
case <-remote.Closed:
189
return errors.New("remote closed connection during version exchange")
190
187
- case remote.Secure.Out <- myVersionMsg.Data():
188
- log.Debug("[peer: %s] Send my version(%s) to %s", s.local, myVersion, remote.Peer)
189
- sendMine = true
191
+ case our, ok := <-outBuf:
192
+ if ok {
193
+ remote.Secure.Out <- our
194
+ sendMine = true
195
+ close(outBuf) // only send local version once
196
+ log.Debug("[peer: %s] Send my version(%s) to %s", s.local, myVersion, remote.Peer)
197
+ }
198
199
case data, ok := <-remote.Secure.In:
200
if !ok {
@@ -202,6 +210,8 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
210
return fmt.Errorf("connSetup: could not decode remote version: %q", err)
211
}
212
gotTheirs = true
213
+
214
+ // BUG(cryptix): could add another case here to trigger resending our version
215
}
216
}
217