From 2e18d77d408dfde35a5d282707cca02c67d55e66 Mon Sep 17 00:00:00 2001 From: Pedro Costa <550684+pnmcosta@users.noreply.github.com> Date: Tue, 8 Jul 2025 09:56:15 +0100 Subject: [PATCH] further optimization to ensure db roundtrip and calculations only occur if there are peers to update --- client/cmd/testutil_test.go | 5 +++++ management/server/peer.go | 33 +++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/client/cmd/testutil_test.go b/client/cmd/testutil_test.go index b5a80d63a..e3e2a7e40 100644 --- a/client/cmd/testutil_test.go +++ b/client/cmd/testutil_test.go @@ -102,6 +102,11 @@ func startManagement(t *testing.T, config *types.Config, testFile string) (*grpc GetSettings(gomock.Any(), gomock.Any(), gomock.Any()). Return(&types.Settings{}, nil). AnyTimes() + settingsMockManager. + EXPECT(). + GetExtraSettings(gomock.Any(), gomock.Any()). + Return(&types.ExtraSettings{}, nil). + AnyTimes() accountManager, err := mgmt.BuildManager(context.Background(), store, peersUpdateManager, nil, "", "netbird.selfhosted", eventStore, nil, false, iv, metrics, port_forwarding.NewControllerMock(), settingsMockManager, permissionsManagerMock, false) if err != nil { diff --git a/management/server/peer.go b/management/server/peer.go index 68897f444..2ddd75c67 100644 --- a/management/server/peer.go +++ b/management/server/peer.go @@ -1169,7 +1169,26 @@ func (am *DefaultAccountManager) UpdateAccountPeers(ctx context.Context, account return } - globalStart := time.Now() + if am.metrics != nil { + globalStart := time.Now() + defer func() { + am.metrics.AccountManagerMetrics().CountUpdateAccountPeersDuration(time.Since(globalStart)) + }() + } + + peersToUpdate := []*nbpeer.Peer{} + for _, peer := range account.Peers { + if !am.peersUpdateManager.HasChannel(peer.ID) { + log.WithContext(ctx).Tracef("peer %s doesn't have a channel, skipping network map update", peer.ID) + continue + } + + peersToUpdate = append(peersToUpdate, peer) + } + + if len(peersToUpdate) == 0 { + return + } approvedPeersMap, err := am.integratedPeerValidator.GetValidatedPeers(account.Id, maps.Values(account.Groups), maps.Values(account.Peers), account.Settings.Extra) if err != nil { @@ -1198,12 +1217,7 @@ func (am *DefaultAccountManager) UpdateAccountPeers(ctx context.Context, account return } - for _, peer := range account.Peers { - if !am.peersUpdateManager.HasChannel(peer.ID) { - log.WithContext(ctx).Tracef("peer %s doesn't have a channel, skipping network map update", peer.ID) - continue - } - + for _, peer := range peersToUpdate { wg.Add(1) semaphore <- struct{}{} go func(p *nbpeer.Peer) { @@ -1240,12 +1254,7 @@ func (am *DefaultAccountManager) UpdateAccountPeers(ctx context.Context, account }(peer) } - // - wg.Wait() - if am.metrics != nil { - am.metrics.AccountManagerMetrics().CountUpdateAccountPeersDuration(time.Since(globalStart)) - } } func (am *DefaultAccountManager) BufferUpdateAccountPeers(ctx context.Context, accountID string) {