mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-28 20:21:47 +00:00
p2p: Restore OriginalAddr (#2668)
* p2p: bring back OriginalAddr * p2p: set OriginalAddr * update changelog
This commit is contained in:
@ -82,3 +82,5 @@ Proposal or timeoutProposal before entering prevote
|
|||||||
- [p2p] \#2555 fix p2p switch FlushThrottle value (@goolAdapter)
|
- [p2p] \#2555 fix p2p switch FlushThrottle value (@goolAdapter)
|
||||||
- [libs/event] \#2518 fix event concurrency flaw (@goolAdapter)
|
- [libs/event] \#2518 fix event concurrency flaw (@goolAdapter)
|
||||||
- [state] \#2616 Pass nil to NewValidatorSet() when genesis file's Validators field is nil
|
- [state] \#2616 Pass nil to NewValidatorSet() when genesis file's Validators field is nil
|
||||||
|
- [p2p] \#2668 Reconnect to originally dialed address (not self-reported
|
||||||
|
address) for persistent peers
|
||||||
|
@ -206,3 +206,4 @@ func (tp *bcrTestPeer) IsPersistent() bool { return true }
|
|||||||
func (tp *bcrTestPeer) Get(s string) interface{} { return s }
|
func (tp *bcrTestPeer) Get(s string) interface{} { return s }
|
||||||
func (tp *bcrTestPeer) Set(string, interface{}) {}
|
func (tp *bcrTestPeer) Set(string, interface{}) {}
|
||||||
func (tp *bcrTestPeer) RemoteIP() net.IP { return []byte{127, 0, 0, 1} }
|
func (tp *bcrTestPeer) RemoteIP() net.IP { return []byte{127, 0, 0, 1} }
|
||||||
|
func (tp *bcrTestPeer) OriginalAddr() *p2p.NetAddress { return nil }
|
||||||
|
@ -78,3 +78,8 @@ func (p *peer) Get(key string) interface{} {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OriginalAddr always returns nil.
|
||||||
|
func (p *peer) OriginalAddr() *p2p.NetAddress {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
28
p2p/peer.go
28
p2p/peer.go
@ -26,6 +26,7 @@ type Peer interface {
|
|||||||
|
|
||||||
NodeInfo() NodeInfo // peer's info
|
NodeInfo() NodeInfo // peer's info
|
||||||
Status() tmconn.ConnectionStatus
|
Status() tmconn.ConnectionStatus
|
||||||
|
OriginalAddr() *NetAddress
|
||||||
|
|
||||||
Send(byte, []byte) bool
|
Send(byte, []byte) bool
|
||||||
TrySend(byte, []byte) bool
|
TrySend(byte, []byte) bool
|
||||||
@ -43,10 +44,28 @@ type peerConn struct {
|
|||||||
config *config.P2PConfig
|
config *config.P2PConfig
|
||||||
conn net.Conn // source connection
|
conn net.Conn // source connection
|
||||||
|
|
||||||
|
originalAddr *NetAddress // nil for inbound connections
|
||||||
|
|
||||||
// cached RemoteIP()
|
// cached RemoteIP()
|
||||||
ip net.IP
|
ip net.IP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newPeerConn(
|
||||||
|
outbound, persistent bool,
|
||||||
|
config *config.P2PConfig,
|
||||||
|
conn net.Conn,
|
||||||
|
originalAddr *NetAddress,
|
||||||
|
) peerConn {
|
||||||
|
|
||||||
|
return peerConn{
|
||||||
|
outbound: outbound,
|
||||||
|
persistent: persistent,
|
||||||
|
config: config,
|
||||||
|
conn: conn,
|
||||||
|
originalAddr: originalAddr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ID only exists for SecretConnection.
|
// ID only exists for SecretConnection.
|
||||||
// NOTE: Will panic if conn is not *SecretConnection.
|
// NOTE: Will panic if conn is not *SecretConnection.
|
||||||
func (pc peerConn) ID() ID {
|
func (pc peerConn) ID() ID {
|
||||||
@ -195,6 +214,15 @@ func (p *peer) NodeInfo() NodeInfo {
|
|||||||
return p.nodeInfo
|
return p.nodeInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OriginalAddr returns the original address, which was used to connect with
|
||||||
|
// the peer. Returns nil for inbound peers.
|
||||||
|
func (p *peer) OriginalAddr() *NetAddress {
|
||||||
|
if p.peerConn.outbound {
|
||||||
|
return p.peerConn.originalAddr
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Status returns the peer's ConnectionStatus.
|
// Status returns the peer's ConnectionStatus.
|
||||||
func (p *peer) Status() tmconn.ConnectionStatus {
|
func (p *peer) Status() tmconn.ConnectionStatus {
|
||||||
return p.mconn.Status()
|
return p.mconn.Status()
|
||||||
|
@ -28,6 +28,7 @@ func (mp *mockPeer) IsPersistent() bool { return true }
|
|||||||
func (mp *mockPeer) Get(s string) interface{} { return s }
|
func (mp *mockPeer) Get(s string) interface{} { return s }
|
||||||
func (mp *mockPeer) Set(string, interface{}) {}
|
func (mp *mockPeer) Set(string, interface{}) {}
|
||||||
func (mp *mockPeer) RemoteIP() net.IP { return mp.ip }
|
func (mp *mockPeer) RemoteIP() net.IP { return mp.ip }
|
||||||
|
func (mp *mockPeer) OriginalAddr() *NetAddress { return nil }
|
||||||
|
|
||||||
// Returns a mock peer
|
// Returns a mock peer
|
||||||
func newMockPeer(ip net.IP) *mockPeer {
|
func newMockPeer(ip net.IP) *mockPeer {
|
||||||
|
@ -114,7 +114,7 @@ func testOutboundPeerConn(
|
|||||||
return peerConn{}, cmn.ErrorWrap(err, "Error creating peer")
|
return peerConn{}, cmn.ErrorWrap(err, "Error creating peer")
|
||||||
}
|
}
|
||||||
|
|
||||||
pc, err := testPeerConn(conn, config, true, persistent, ourNodePrivKey)
|
pc, err := testPeerConn(conn, config, true, persistent, ourNodePrivKey, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if cerr := conn.Close(); cerr != nil {
|
if cerr := conn.Close(); cerr != nil {
|
||||||
return peerConn{}, cmn.ErrorWrap(err, cerr.Error())
|
return peerConn{}, cmn.ErrorWrap(err, cerr.Error())
|
||||||
|
@ -402,6 +402,7 @@ func (mockPeer) Send(byte, []byte) bool { return false }
|
|||||||
func (mockPeer) TrySend(byte, []byte) bool { return false }
|
func (mockPeer) TrySend(byte, []byte) bool { return false }
|
||||||
func (mockPeer) Set(string, interface{}) {}
|
func (mockPeer) Set(string, interface{}) {}
|
||||||
func (mockPeer) Get(string) interface{} { return nil }
|
func (mockPeer) Get(string) interface{} { return nil }
|
||||||
|
func (mockPeer) OriginalAddr() *p2p.NetAddress { return nil }
|
||||||
|
|
||||||
func assertPeersWithTimeout(
|
func assertPeersWithTimeout(
|
||||||
t *testing.T,
|
t *testing.T,
|
||||||
|
@ -280,9 +280,12 @@ func (sw *Switch) StopPeerForError(peer Peer, reason interface{}) {
|
|||||||
sw.stopAndRemovePeer(peer, reason)
|
sw.stopAndRemovePeer(peer, reason)
|
||||||
|
|
||||||
if peer.IsPersistent() {
|
if peer.IsPersistent() {
|
||||||
// TODO: use the original address dialed, not the self reported one
|
addr := peer.OriginalAddr()
|
||||||
// See #2618.
|
if addr == nil {
|
||||||
addr := peer.NodeInfo().NetAddress()
|
// FIXME: persistent peers can't be inbound right now.
|
||||||
|
// self-reported address for inbound persistent peers
|
||||||
|
addr = peer.NodeInfo().NetAddress()
|
||||||
|
}
|
||||||
go sw.reconnectToPeer(addr)
|
go sw.reconnectToPeer(addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,7 +206,7 @@ func testInboundPeerConn(
|
|||||||
config *config.P2PConfig,
|
config *config.P2PConfig,
|
||||||
ourNodePrivKey crypto.PrivKey,
|
ourNodePrivKey crypto.PrivKey,
|
||||||
) (peerConn, error) {
|
) (peerConn, error) {
|
||||||
return testPeerConn(conn, config, false, false, ourNodePrivKey)
|
return testPeerConn(conn, config, false, false, ourNodePrivKey, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testPeerConn(
|
func testPeerConn(
|
||||||
@ -214,6 +214,7 @@ func testPeerConn(
|
|||||||
cfg *config.P2PConfig,
|
cfg *config.P2PConfig,
|
||||||
outbound, persistent bool,
|
outbound, persistent bool,
|
||||||
ourNodePrivKey crypto.PrivKey,
|
ourNodePrivKey crypto.PrivKey,
|
||||||
|
originalAddr *NetAddress,
|
||||||
) (pc peerConn, err error) {
|
) (pc peerConn, err error) {
|
||||||
conn := rawConn
|
conn := rawConn
|
||||||
|
|
||||||
@ -231,10 +232,11 @@ func testPeerConn(
|
|||||||
|
|
||||||
// Only the information we already have
|
// Only the information we already have
|
||||||
return peerConn{
|
return peerConn{
|
||||||
config: cfg,
|
config: cfg,
|
||||||
outbound: outbound,
|
outbound: outbound,
|
||||||
persistent: persistent,
|
persistent: persistent,
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
originalAddr: originalAddr,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ func (mt *MultiplexTransport) Accept(cfg peerConfig) (Peer, error) {
|
|||||||
|
|
||||||
cfg.outbound = false
|
cfg.outbound = false
|
||||||
|
|
||||||
return mt.wrapPeer(a.conn, a.nodeInfo, cfg), nil
|
return mt.wrapPeer(a.conn, a.nodeInfo, cfg, nil), nil
|
||||||
case <-mt.closec:
|
case <-mt.closec:
|
||||||
return nil, &ErrTransportClosed{}
|
return nil, &ErrTransportClosed{}
|
||||||
}
|
}
|
||||||
@ -199,7 +199,7 @@ func (mt *MultiplexTransport) Dial(
|
|||||||
|
|
||||||
cfg.outbound = true
|
cfg.outbound = true
|
||||||
|
|
||||||
p := mt.wrapPeer(secretConn, nodeInfo, cfg)
|
p := mt.wrapPeer(secretConn, nodeInfo, cfg, &addr)
|
||||||
|
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
@ -399,14 +399,19 @@ func (mt *MultiplexTransport) wrapPeer(
|
|||||||
c net.Conn,
|
c net.Conn,
|
||||||
ni NodeInfo,
|
ni NodeInfo,
|
||||||
cfg peerConfig,
|
cfg peerConfig,
|
||||||
|
dialedAddr *NetAddress,
|
||||||
) Peer {
|
) Peer {
|
||||||
|
|
||||||
|
peerConn := newPeerConn(
|
||||||
|
cfg.outbound,
|
||||||
|
cfg.persistent,
|
||||||
|
&mt.p2pConfig,
|
||||||
|
c,
|
||||||
|
dialedAddr,
|
||||||
|
)
|
||||||
|
|
||||||
p := newPeer(
|
p := newPeer(
|
||||||
peerConn{
|
peerConn,
|
||||||
conn: c,
|
|
||||||
config: &mt.p2pConfig,
|
|
||||||
outbound: cfg.outbound,
|
|
||||||
persistent: cfg.persistent,
|
|
||||||
},
|
|
||||||
mt.mConfig,
|
mt.mConfig,
|
||||||
ni,
|
ni,
|
||||||
cfg.reactorsByCh,
|
cfg.reactorsByCh,
|
||||||
|
Reference in New Issue
Block a user