github.com/MetalBlockchain/metalgo@v1.11.9/node/beacon_manager.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package node 5 6 import ( 7 "sync" 8 "sync/atomic" 9 10 "github.com/MetalBlockchain/metalgo/ids" 11 "github.com/MetalBlockchain/metalgo/snow/networking/router" 12 "github.com/MetalBlockchain/metalgo/snow/validators" 13 "github.com/MetalBlockchain/metalgo/utils/constants" 14 "github.com/MetalBlockchain/metalgo/version" 15 ) 16 17 var _ router.Router = (*beaconManager)(nil) 18 19 type beaconManager struct { 20 router.Router 21 beacons validators.Manager 22 requiredConns int64 23 numConns int64 24 onSufficientlyConnected chan struct{} 25 onceOnSufficientlyConnected sync.Once 26 } 27 28 func (b *beaconManager) Connected(nodeID ids.NodeID, nodeVersion *version.Application, subnetID ids.ID) { 29 _, isBeacon := b.beacons.GetValidator(constants.PrimaryNetworkID, nodeID) 30 if isBeacon && 31 constants.PrimaryNetworkID == subnetID && 32 atomic.AddInt64(&b.numConns, 1) >= b.requiredConns { 33 b.onceOnSufficientlyConnected.Do(func() { 34 close(b.onSufficientlyConnected) 35 }) 36 } 37 b.Router.Connected(nodeID, nodeVersion, subnetID) 38 } 39 40 func (b *beaconManager) Disconnected(nodeID ids.NodeID) { 41 if _, isBeacon := b.beacons.GetValidator(constants.PrimaryNetworkID, nodeID); isBeacon { 42 atomic.AddInt64(&b.numConns, -1) 43 } 44 b.Router.Disconnected(nodeID) 45 }