p2p: Cache inbound flag on Peer.isInbound to avoid a race

This commit is contained in:
Andrey Petrov 2018-06-07 10:42:40 -04:00
parent 399aa710d5
commit dcca66bce8

View File

@ -95,10 +95,11 @@ type PeerEvent struct {
// Peer represents a connected remote node. // Peer represents a connected remote node.
type Peer struct { type Peer struct {
rw *conn rw *conn
running map[string]*protoRW isInbound bool // Cached from rw.flags to avoid a race condition
log log.Logger running map[string]*protoRW
created mclock.AbsTime log log.Logger
created mclock.AbsTime
wg sync.WaitGroup wg sync.WaitGroup
protoErr chan error protoErr chan error
@ -160,19 +161,20 @@ func (p *Peer) String() string {
// Inbound returns true if the peer is an inbound connection // Inbound returns true if the peer is an inbound connection
func (p *Peer) Inbound() bool { func (p *Peer) Inbound() bool {
return p.rw.flags&inboundConn != 0 return p.isInbound
} }
func newPeer(conn *conn, protocols []Protocol) *Peer { func newPeer(conn *conn, protocols []Protocol) *Peer {
protomap := matchProtocols(protocols, conn.caps, conn) protomap := matchProtocols(protocols, conn.caps, conn)
p := &Peer{ p := &Peer{
rw: conn, rw: conn,
running: protomap, isInbound: conn.is(inboundConn),
created: mclock.Now(), running: protomap,
disc: make(chan DiscReason), created: mclock.Now(),
protoErr: make(chan error, len(protomap)+1), // protocols + pingLoop disc: make(chan DiscReason),
closed: make(chan struct{}), protoErr: make(chan error, len(protomap)+1), // protocols + pingLoop
log: log.New("id", conn.id, "conn", conn.flags), closed: make(chan struct{}),
log: log.New("id", conn.id, "conn", conn.flags),
} }
return p return p
} }