1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-10-25 10:27:01 +08:00

Merge pull request #1796 from ipfs/mocknet-fix

mocknet: conn close idempotent with process.
This commit is contained in:
Juan Benet
2015-10-04 10:57:11 -04:00
2 changed files with 23 additions and 16 deletions

View File

@ -9,6 +9,7 @@ import (
peer "github.com/ipfs/go-ipfs/p2p/peer" peer "github.com/ipfs/go-ipfs/p2p/peer"
ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
process "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/goprocess"
) )
// conn represents one side's perspective of a // conn represents one side's perspective of a
@ -28,11 +29,31 @@ type conn struct {
link *link link *link
rconn *conn // counterpart rconn *conn // counterpart
streams list.List streams list.List
proc process.Process
sync.RWMutex sync.RWMutex
} }
func newConn(ln, rn *peernet, l *link) *conn {
c := &conn{net: ln, link: l}
c.local = ln.peer
c.remote = rn.peer
c.localAddr = ln.ps.Addrs(ln.peer)[0]
c.remoteAddr = rn.ps.Addrs(rn.peer)[0]
c.localPrivKey = ln.ps.PrivKey(ln.peer)
c.remotePubKey = rn.ps.PubKey(rn.peer)
c.proc = process.WithTeardown(c.teardown)
return c
}
func (c *conn) Close() error { func (c *conn) Close() error {
return c.proc.Close()
}
func (c *conn) teardown() error {
for _, s := range c.allStreams() { for _, s := range c.allStreams() {
s.Close() s.Close()
} }

View File

@ -33,22 +33,8 @@ func (l *link) newConnPair(dialer *peernet) (*conn, *conn) {
l.RLock() l.RLock()
defer l.RUnlock() defer l.RUnlock()
mkconn := func(ln, rn *peernet) *conn { c1 := newConn(l.nets[0], l.nets[1], l)
c := &conn{net: ln, link: l} c2 := newConn(l.nets[1], l.nets[0], l)
c.local = ln.peer
c.remote = rn.peer
c.localAddr = ln.ps.Addrs(ln.peer)[0]
c.remoteAddr = rn.ps.Addrs(rn.peer)[0]
c.localPrivKey = ln.ps.PrivKey(ln.peer)
c.remotePubKey = rn.ps.PubKey(rn.peer)
return c
}
c1 := mkconn(l.nets[0], l.nets[1])
c2 := mkconn(l.nets[1], l.nets[0])
c1.rconn = c2 c1.rconn = c2
c2.rconn = c1 c2.rconn = c1