From a654c286bfaef4821e92c344c2e70d3e51fd5aec Mon Sep 17 00:00:00 2001 From: crn4 Date: Wed, 29 Oct 2025 23:35:16 +0100 Subject: [PATCH] load or store for account --- management/server/holder.go | 5 +---- management/server/networkmap.go | 2 +- management/server/types/holder.go | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/management/server/holder.go b/management/server/holder.go index fc7ecc973..e8a26e1d0 100644 --- a/management/server/holder.go +++ b/management/server/holder.go @@ -1,8 +1,6 @@ package server import ( - "context" - "github.com/netbirdio/netbird/management/server/types" ) @@ -29,11 +27,10 @@ func (am *DefaultAccountManager) getAccountFromHolderOrInit(accountID string) *t if a != nil { return a } - account, err := am.requestBuffer.GetAccountWithBackpressure(context.Background(), accountID) + account, err := am.holder.LoadOrStoreFunc(accountID, am.requestBuffer.GetAccountWithBackpressure) if err != nil { return nil } - am.holder.AddAccount(account) return account } diff --git a/management/server/networkmap.go b/management/server/networkmap.go index 4b99fd8d8..2a0627643 100644 --- a/management/server/networkmap.go +++ b/management/server/networkmap.go @@ -25,7 +25,7 @@ func (am *DefaultAccountManager) getPeerNetworkMapExp( customZone nbdns.CustomZone, metrics *telemetry.AccountManagerMetrics, ) *types.NetworkMap { - account := am.getAccountFromHolder(accountId) + account := am.getAccountFromHolderOrInit(accountId) if account == nil { log.WithContext(ctx).Warnf("account %s not found in holder when getting peer network map", accountId) return &types.NetworkMap{ diff --git a/management/server/types/holder.go b/management/server/types/holder.go index 04c019ce8..3996db2b6 100644 --- a/management/server/types/holder.go +++ b/management/server/types/holder.go @@ -1,6 +1,9 @@ package types -import "sync" +import ( + "context" + "sync" +) type Holder struct { mu sync.RWMutex @@ -24,3 +27,17 @@ func (h *Holder) AddAccount(account *Account) { defer h.mu.Unlock() h.accounts[account.Id] = account } + +func (h *Holder) LoadOrStoreFunc(id string, accGetter func(context.Context, string) (*Account, error)) (*Account, error) { + h.mu.Lock() + defer h.mu.Unlock() + if acc, ok := h.accounts[id]; ok { + return acc, nil + } + account, err := accGetter(context.Background(), id) + if err != nil { + return nil, err + } + h.accounts[id] = account + return account, nil +}