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  }