load or store for account

This commit is contained in:
crn4
2025-10-29 23:35:16 +01:00
parent 60e3bf4084
commit 479c75f827
3 changed files with 20 additions and 6 deletions

View File

@@ -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
}

View File

@@ -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{

View File

@@ -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
}