From 18614d0b5232f2768059a7921948c612a2c6c7b2 Mon Sep 17 00:00:00 2001 From: bcmmbaga Date: Thu, 3 Oct 2024 16:03:35 +0300 Subject: [PATCH] Move the account peer update outside the transaction Signed-off-by: bcmmbaga --- management/server/account.go | 37 ++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/management/server/account.go b/management/server/account.go index fa71c28cd..183867e3b 100644 --- a/management/server/account.go +++ b/management/server/account.go @@ -1844,10 +1844,17 @@ func (am *DefaultAccountManager) syncJWTGroups(ctx context.Context, accountID st return nil } - return am.Store.ExecuteInTransaction(ctx, func(transaction Store) error { - user, err := transaction.GetUserByUserID(ctx, LockingStrengthShare, claims.UserId) + unlockPeer := am.Store.AcquireWriteLockByUID(ctx, accountID) + defer func() { + if unlockPeer != nil { + unlockPeer() + } + }() + + err = am.Store.ExecuteInTransaction(ctx, func(transaction Store) error { + user, err := transaction.GetUserByUserID(ctx, LockingStrengthUpdate, claims.UserId) if err != nil { - return err + return fmt.Errorf("error getting user: %w", err) } addNewGroups := difference(updatedAutoGroups, user.AutoGroups) @@ -1875,14 +1882,9 @@ func (am *DefaultAccountManager) syncJWTGroups(ctx context.Context, accountID st if err = transaction.IncrementNetworkSerial(ctx, accountID); err != nil { return fmt.Errorf("error incrementing network serial: %w", err) } - - account, err := am.requestBuffer.GetAccountWithBackpressure(ctx, accountID) - if err != nil { - return fmt.Errorf("error getting account: %w", err) - } - log.WithContext(ctx).Tracef("user %s: JWT group membership changed, updating account peers", claims.UserId) - am.updateAccountPeers(ctx, account) } + unlockPeer() + unlockPeer = nil for _, g := range addNewGroups { group, err := transaction.GetGroupByID(ctx, LockingStrengthShare, g, accountID) @@ -1911,6 +1913,21 @@ func (am *DefaultAccountManager) syncJWTGroups(ctx context.Context, accountID st } return nil }) + if err != nil { + return err + } + + if settings.GroupsPropagationEnabled { + account, err := am.requestBuffer.GetAccountWithBackpressure(ctx, accountID) + if err != nil { + return fmt.Errorf("error getting account: %w", err) + } + + log.WithContext(ctx).Tracef("user %s: JWT group membership changed, updating account peers", claims.UserId) + am.updateAccountPeers(ctx, account) + } + + return nil } // getAccountIDWithAuthorizationClaims retrieves an account ID using JWT Claims.