diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-04-14 06:38:47 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-04-14 06:38:47 +0800 |
commit | 2ea98d9b74ac2d66dce6eeb92c371c0237245d79 (patch) | |
tree | 6b3bc65d95754f7ec249aa6eaa61ac40db150176 /p2p/peer.go | |
parent | f6f9a0d515513463d6f9656d225939385a276608 (diff) | |
parent | 0217652d1b7e8f0c1c3002837d9f1277de27ef46 (diff) | |
download | dexon-2ea98d9b74ac2d66dce6eeb92c371c0237245d79.tar dexon-2ea98d9b74ac2d66dce6eeb92c371c0237245d79.tar.gz dexon-2ea98d9b74ac2d66dce6eeb92c371c0237245d79.tar.bz2 dexon-2ea98d9b74ac2d66dce6eeb92c371c0237245d79.tar.lz dexon-2ea98d9b74ac2d66dce6eeb92c371c0237245d79.tar.xz dexon-2ea98d9b74ac2d66dce6eeb92c371c0237245d79.tar.zst dexon-2ea98d9b74ac2d66dce6eeb92c371c0237245d79.zip |
Merge pull request #704 from fjl/p2p-concurrency-fixups
p2p: more concurrency fixups
Diffstat (limited to 'p2p/peer.go')
-rw-r--r-- | p2p/peer.go | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/p2p/peer.go b/p2p/peer.go index 7bc4f9cf6..1262ba64a 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net" "sort" "sync" @@ -20,8 +19,7 @@ const ( baseProtocolLength = uint64(16) baseProtocolMaxMsgSize = 10 * 1024 * 1024 - pingInterval = 15 * time.Second - disconnectGracePeriod = 2 * time.Second + pingInterval = 15 * time.Second ) const ( @@ -129,39 +127,27 @@ func (p *Peer) run() DiscReason { case err := <-readErr: if r, ok := err.(DiscReason); ok { reason = r - break + } else { + // Note: We rely on protocols to abort if there is a write + // error. It might be more robust to handle them here as well. + p.DebugDetailf("Read error: %v\n", err) + reason = DiscNetworkError } - // Note: We rely on protocols to abort if there is a write - // error. It might be more robust to handle them here as well. - p.DebugDetailf("Read error: %v\n", err) - p.conn.Close() - reason = DiscNetworkError case err := <-p.protoErr: reason = discReasonForError(err) case reason = <-p.disc: } close(p.closed) + p.politeDisconnect(reason) p.wg.Wait() - if reason != DiscNetworkError { - p.politeDisconnect(reason) - } p.Debugf("Disconnected: %v\n", reason) return reason } func (p *Peer) politeDisconnect(reason DiscReason) { - done := make(chan struct{}) - go func() { + if reason != DiscNetworkError { SendItems(p.rw, discMsg, uint(reason)) - // Wait for the other side to close the connection. - // Discard any data that they send until then. - io.Copy(ioutil.Discard, p.conn) - close(done) - }() - select { - case <-done: - case <-time.After(disconnectGracePeriod): } p.conn.Close() } |