mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
p2p: keep life-cycle events, change racey construct
This commit is contained in:
parent
fe18aa2400
commit
070a519aa5
1 changed files with 37 additions and 26 deletions
|
|
@ -93,7 +93,11 @@ type meteredConn struct {
|
||||||
connected time.Time // Connection time of the peer
|
connected time.Time // Connection time of the peer
|
||||||
ip net.IP // IP address of the peer
|
ip net.IP // IP address of the peer
|
||||||
id string // NodeID of the peer
|
id string // NodeID of the peer
|
||||||
metered bool // Checks if the peer is metered
|
|
||||||
|
// trafficMetered denotes if the peer is registered in the traffic registries.
|
||||||
|
// Its value is true if the metered peer count doesn't reach the limit in the
|
||||||
|
// moment of the peer's connection.
|
||||||
|
trafficMetered bool
|
||||||
ingressMeter metrics.Meter // Meter for the read bytes of the peer
|
ingressMeter metrics.Meter // Meter for the read bytes of the peer
|
||||||
egressMeter metrics.Meter // Meter for the written bytes of the peer
|
egressMeter metrics.Meter // Meter for the written bytes of the peer
|
||||||
|
|
||||||
|
|
@ -132,7 +136,7 @@ func (c *meteredConn) Read(b []byte) (n int, err error) {
|
||||||
n, err = c.Conn.Read(b)
|
n, err = c.Conn.Read(b)
|
||||||
ingressTrafficMeter.Mark(int64(n))
|
ingressTrafficMeter.Mark(int64(n))
|
||||||
c.lock.RLock()
|
c.lock.RLock()
|
||||||
if c.metered {
|
if c.trafficMetered {
|
||||||
c.ingressMeter.Mark(int64(n))
|
c.ingressMeter.Mark(int64(n))
|
||||||
}
|
}
|
||||||
c.lock.RUnlock()
|
c.lock.RUnlock()
|
||||||
|
|
@ -145,7 +149,7 @@ func (c *meteredConn) Write(b []byte) (n int, err error) {
|
||||||
n, err = c.Conn.Write(b)
|
n, err = c.Conn.Write(b)
|
||||||
egressTrafficMeter.Mark(int64(n))
|
egressTrafficMeter.Mark(int64(n))
|
||||||
c.lock.RLock()
|
c.lock.RLock()
|
||||||
if c.metered {
|
if c.trafficMetered {
|
||||||
c.egressMeter.Mark(int64(n))
|
c.egressMeter.Mark(int64(n))
|
||||||
}
|
}
|
||||||
c.lock.RUnlock()
|
c.lock.RUnlock()
|
||||||
|
|
@ -156,19 +160,20 @@ func (c *meteredConn) Write(b []byte) (n int, err error) {
|
||||||
// the ingress and the egress traffic registries using the peer's IP and node ID,
|
// the ingress and the egress traffic registries using the peer's IP and node ID,
|
||||||
// also emits connect event.
|
// also emits connect event.
|
||||||
func (c *meteredConn) handshakeDone(id enode.ID) {
|
func (c *meteredConn) handshakeDone(id enode.ID) {
|
||||||
if atomic.LoadInt32(&meteredPeerCount) >= MeteredPeerLimit {
|
if atomic.AddInt32(&meteredPeerCount, 1) >= MeteredPeerLimit {
|
||||||
log.Warn("Metered peer count reached the limit")
|
atomic.AddInt32(&meteredPeerCount, -1)
|
||||||
return
|
|
||||||
}
|
|
||||||
// Increment the metered peer count
|
|
||||||
atomic.AddInt32(&meteredPeerCount, 1)
|
|
||||||
c.lock.Lock()
|
c.lock.Lock()
|
||||||
c.id, c.metered = id.String(), true
|
c.id, c.trafficMetered = id.String(), false
|
||||||
key := fmt.Sprintf("%s/%s", c.ip, c.id)
|
c.lock.Unlock()
|
||||||
|
log.Warn("Metered peer count reached the limit")
|
||||||
|
} else {
|
||||||
|
key := fmt.Sprintf("%s/%s", c.ip, id)
|
||||||
|
c.lock.Lock()
|
||||||
|
c.id, c.trafficMetered = id.String(), true
|
||||||
c.ingressMeter = metrics.NewRegisteredMeter(key, PeerIngressRegistry)
|
c.ingressMeter = metrics.NewRegisteredMeter(key, PeerIngressRegistry)
|
||||||
c.egressMeter = metrics.NewRegisteredMeter(key, PeerEgressRegistry)
|
c.egressMeter = metrics.NewRegisteredMeter(key, PeerEgressRegistry)
|
||||||
c.lock.Unlock()
|
c.lock.Unlock()
|
||||||
|
}
|
||||||
meteredPeerFeed.Send(MeteredPeerEvent{
|
meteredPeerFeed.Send(MeteredPeerEvent{
|
||||||
Type: PeerConnected,
|
Type: PeerConnected,
|
||||||
IP: c.ip,
|
IP: c.ip,
|
||||||
|
|
@ -182,12 +187,6 @@ func (c *meteredConn) handshakeDone(id enode.ID) {
|
||||||
func (c *meteredConn) Close() error {
|
func (c *meteredConn) Close() error {
|
||||||
err := c.Conn.Close()
|
err := c.Conn.Close()
|
||||||
c.lock.RLock()
|
c.lock.RLock()
|
||||||
if !c.metered {
|
|
||||||
c.lock.RUnlock()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Decrement the metered peer count
|
|
||||||
atomic.AddInt32(&meteredPeerCount, -1)
|
|
||||||
if c.id == "" {
|
if c.id == "" {
|
||||||
// If the peer disconnects before the handshake
|
// If the peer disconnects before the handshake
|
||||||
c.lock.RUnlock()
|
c.lock.RUnlock()
|
||||||
|
|
@ -198,7 +197,19 @@ func (c *meteredConn) Close() error {
|
||||||
})
|
})
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
id, ingress, egress := c.id, uint64(c.ingressMeter.Count()), uint64(c.egressMeter.Count())
|
// Decrement the metered peer count
|
||||||
|
atomic.AddInt32(&meteredPeerCount, -1)
|
||||||
|
id := c.id
|
||||||
|
if !c.trafficMetered {
|
||||||
|
c.lock.RUnlock()
|
||||||
|
meteredPeerFeed.Send(MeteredPeerEvent{
|
||||||
|
Type: PeerDisconnected,
|
||||||
|
IP: c.ip,
|
||||||
|
ID: id,
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ingress, egress := uint64(c.ingressMeter.Count()), uint64(c.egressMeter.Count())
|
||||||
c.lock.RUnlock()
|
c.lock.RUnlock()
|
||||||
|
|
||||||
// Unregister the peer from the traffic registries
|
// Unregister the peer from the traffic registries
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue