2018-09-18 22:11:54 +02:00
|
|
|
package p2p
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ConnSet is a lookup table for connections and all their ips.
|
|
|
|
type ConnSet interface {
|
|
|
|
Has(net.Conn) bool
|
|
|
|
HasIP(net.IP) bool
|
|
|
|
Set(net.Conn, []net.IP)
|
|
|
|
Remove(net.Conn)
|
p2p: file descriptor leaks (#3150)
* close peer's connection to avoid fd leak
Fixes #2967
* rename peer#Addr to RemoteAddr
* fix test
* fixes after Ethan's review
* bring back the check
* changelog entry
* write a test for switch#acceptRoutine
* increase timeouts? :(
* remove extra assertNPeersWithTimeout
* simplify test
* assert number of peers (just to be safe)
* Cleanup in OnStop
* run tests with verbose flag on CircleCI
* spawn a reading routine to prevent connection from closing
* get port from the listener
random port is faster, but often results in
```
panic: listen tcp 127.0.0.1:44068: bind: address already in use [recovered]
panic: listen tcp 127.0.0.1:44068: bind: address already in use
goroutine 79 [running]:
testing.tRunner.func1(0xc0001bd600)
/usr/local/go/src/testing/testing.go:792 +0x387
panic(0x974d20, 0xc0001b0500)
/usr/local/go/src/runtime/panic.go:513 +0x1b9
github.com/tendermint/tendermint/p2p.MakeSwitch(0xc0000f42a0, 0x0, 0x9fb9cc, 0x9, 0x9fc346, 0xb, 0xb42128, 0x0, 0x0, 0x0, ...)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/test_util.go:182 +0xa28
github.com/tendermint/tendermint/p2p.MakeConnectedSwitches(0xc0000f42a0, 0x2, 0xb42128, 0xb41eb8, 0x4f1205, 0xc0001bed80, 0x4f16ed)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/test_util.go:75 +0xf9
github.com/tendermint/tendermint/p2p.MakeSwitchPair(0xbb8d20, 0xc0001bd600, 0xb42128, 0x2f7, 0x4f16c0)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/switch_test.go:94 +0x4c
github.com/tendermint/tendermint/p2p.TestSwitches(0xc0001bd600)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/switch_test.go:117 +0x58
testing.tRunner(0xc0001bd600, 0xb42038)
/usr/local/go/src/testing/testing.go:827 +0xbf
created by testing.(*T).Run
/usr/local/go/src/testing/testing.go:878 +0x353
exit status 2
FAIL github.com/tendermint/tendermint/p2p 0.350s
```
2019-01-22 22:23:18 +04:00
|
|
|
RemoveAddr(net.Addr)
|
2018-09-18 22:11:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type connSetItem struct {
|
|
|
|
conn net.Conn
|
|
|
|
ips []net.IP
|
|
|
|
}
|
|
|
|
|
|
|
|
type connSet struct {
|
|
|
|
sync.RWMutex
|
|
|
|
|
|
|
|
conns map[string]connSetItem
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewConnSet returns a ConnSet implementation.
|
|
|
|
func NewConnSet() *connSet {
|
|
|
|
return &connSet{
|
|
|
|
conns: map[string]connSetItem{},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cs *connSet) Has(c net.Conn) bool {
|
|
|
|
cs.RLock()
|
|
|
|
defer cs.RUnlock()
|
|
|
|
|
|
|
|
_, ok := cs.conns[c.RemoteAddr().String()]
|
|
|
|
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cs *connSet) HasIP(ip net.IP) bool {
|
|
|
|
cs.RLock()
|
|
|
|
defer cs.RUnlock()
|
|
|
|
|
|
|
|
for _, c := range cs.conns {
|
|
|
|
for _, known := range c.ips {
|
|
|
|
if known.Equal(ip) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cs *connSet) Remove(c net.Conn) {
|
|
|
|
cs.Lock()
|
|
|
|
defer cs.Unlock()
|
|
|
|
|
|
|
|
delete(cs.conns, c.RemoteAddr().String())
|
|
|
|
}
|
|
|
|
|
p2p: file descriptor leaks (#3150)
* close peer's connection to avoid fd leak
Fixes #2967
* rename peer#Addr to RemoteAddr
* fix test
* fixes after Ethan's review
* bring back the check
* changelog entry
* write a test for switch#acceptRoutine
* increase timeouts? :(
* remove extra assertNPeersWithTimeout
* simplify test
* assert number of peers (just to be safe)
* Cleanup in OnStop
* run tests with verbose flag on CircleCI
* spawn a reading routine to prevent connection from closing
* get port from the listener
random port is faster, but often results in
```
panic: listen tcp 127.0.0.1:44068: bind: address already in use [recovered]
panic: listen tcp 127.0.0.1:44068: bind: address already in use
goroutine 79 [running]:
testing.tRunner.func1(0xc0001bd600)
/usr/local/go/src/testing/testing.go:792 +0x387
panic(0x974d20, 0xc0001b0500)
/usr/local/go/src/runtime/panic.go:513 +0x1b9
github.com/tendermint/tendermint/p2p.MakeSwitch(0xc0000f42a0, 0x0, 0x9fb9cc, 0x9, 0x9fc346, 0xb, 0xb42128, 0x0, 0x0, 0x0, ...)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/test_util.go:182 +0xa28
github.com/tendermint/tendermint/p2p.MakeConnectedSwitches(0xc0000f42a0, 0x2, 0xb42128, 0xb41eb8, 0x4f1205, 0xc0001bed80, 0x4f16ed)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/test_util.go:75 +0xf9
github.com/tendermint/tendermint/p2p.MakeSwitchPair(0xbb8d20, 0xc0001bd600, 0xb42128, 0x2f7, 0x4f16c0)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/switch_test.go:94 +0x4c
github.com/tendermint/tendermint/p2p.TestSwitches(0xc0001bd600)
/home/vagrant/go/src/github.com/tendermint/tendermint/p2p/switch_test.go:117 +0x58
testing.tRunner(0xc0001bd600, 0xb42038)
/usr/local/go/src/testing/testing.go:827 +0xbf
created by testing.(*T).Run
/usr/local/go/src/testing/testing.go:878 +0x353
exit status 2
FAIL github.com/tendermint/tendermint/p2p 0.350s
```
2019-01-22 22:23:18 +04:00
|
|
|
func (cs *connSet) RemoveAddr(addr net.Addr) {
|
|
|
|
cs.Lock()
|
|
|
|
defer cs.Unlock()
|
|
|
|
|
|
|
|
delete(cs.conns, addr.String())
|
|
|
|
}
|
|
|
|
|
2018-09-18 22:11:54 +02:00
|
|
|
func (cs *connSet) Set(c net.Conn, ips []net.IP) {
|
|
|
|
cs.Lock()
|
|
|
|
defer cs.Unlock()
|
|
|
|
|
|
|
|
cs.conns[c.RemoteAddr().String()] = connSetItem{
|
|
|
|
conn: c,
|
|
|
|
ips: ips,
|
|
|
|
}
|
|
|
|
}
|