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:
@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user