From 83457f8b99a8d5382e069eed682173e213b2b218 Mon Sep 17 00:00:00 2001 From: Pascal Fischer <32096965+pascal-fischer@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:13:24 +0200 Subject: [PATCH] [management] add transaction for integrated validator groups update and primary account update (#4014) --- management/server/account.go | 69 +++++++++++++---------- management/server/integrated_validator.go | 28 ++++----- 2 files changed, 54 insertions(+), 43 deletions(-) diff --git a/management/server/account.go b/management/server/account.go index daeaf6e55..b376f6f5e 100644 --- a/management/server/account.go +++ b/management/server/account.go @@ -1853,40 +1853,49 @@ func (am *DefaultAccountManager) GetOrCreateAccountByPrivateDomain(ctx context.C } func (am *DefaultAccountManager) UpdateToPrimaryAccount(ctx context.Context, accountId string) (*types.Account, error) { - account, err := am.Store.GetAccount(ctx, accountId) + var account *types.Account + err := am.Store.ExecuteInTransaction(ctx, func(transaction store.Store) error { + var err error + account, err = transaction.GetAccount(ctx, accountId) + if err != nil { + return err + } + + if account.IsDomainPrimaryAccount { + return nil + } + + existingPrimaryAccountID, err := transaction.GetAccountIDByPrivateDomain(ctx, store.LockingStrengthShare, account.Domain) + + // error is not a not found error + if handleNotFound(err) != nil { + return err + } + + // a primary account already exists for this private domain + if err == nil { + log.WithContext(ctx).WithFields(log.Fields{ + "accountId": accountId, + "existingAccountId": existingPrimaryAccountID, + }).Errorf("cannot update account to primary, another account already exists as primary for the same domain") + return status.Errorf(status.Internal, "cannot update account to primary") + } + + account.IsDomainPrimaryAccount = true + + if err := transaction.SaveAccount(ctx, account); err != nil { + log.WithContext(ctx).WithFields(log.Fields{ + "accountId": accountId, + }).Errorf("failed to update account to primary: %v", err) + return status.Errorf(status.Internal, "failed to update account to primary") + } + + return nil + }) if err != nil { return nil, err } - if account.IsDomainPrimaryAccount { - return account, nil - } - - existingPrimaryAccountID, err := am.Store.GetAccountIDByPrivateDomain(ctx, store.LockingStrengthShare, account.Domain) - - // error is not a not found error - if handleNotFound(err) != nil { - return nil, err - } - - // a primary account already exists for this private domain - if err == nil { - log.WithContext(ctx).WithFields(log.Fields{ - "accountId": accountId, - "existingAccountId": existingPrimaryAccountID, - }).Errorf("cannot update account to primary, another account already exists as primary for the same domain") - return nil, status.Errorf(status.Internal, "cannot update account to primary") - } - - account.IsDomainPrimaryAccount = true - - if err := am.Store.SaveAccount(ctx, account); err != nil { - log.WithContext(ctx).WithFields(log.Fields{ - "accountId": accountId, - }).Errorf("failed to update account to primary: %v", err) - return nil, status.Errorf(status.Internal, "failed to update account to primary") - } - return account, nil } diff --git a/management/server/integrated_validator.go b/management/server/integrated_validator.go index ef77bf10c..edb89466c 100644 --- a/management/server/integrated_validator.go +++ b/management/server/integrated_validator.go @@ -37,21 +37,23 @@ func (am *DefaultAccountManager) UpdateIntegratedValidatorGroups(ctx context.Con unlock := am.Store.AcquireWriteLockByUID(ctx, accountID) defer unlock() - a, err := am.Store.GetAccountByUser(ctx, userID) - if err != nil { - return err - } + return am.Store.ExecuteInTransaction(ctx, func(transaction store.Store) error { + a, err := transaction.GetAccountByUser(ctx, userID) + if err != nil { + return err + } - var extra *types.ExtraSettings + var extra *types.ExtraSettings - if a.Settings.Extra != nil { - extra = a.Settings.Extra - } else { - extra = &types.ExtraSettings{} - a.Settings.Extra = extra - } - extra.IntegratedValidatorGroups = groups - return am.Store.SaveAccount(ctx, a) + if a.Settings.Extra != nil { + extra = a.Settings.Extra + } else { + extra = &types.ExtraSettings{} + a.Settings.Extra = extra + } + extra.IntegratedValidatorGroups = groups + return transaction.SaveAccount(ctx, a) + }) } func (am *DefaultAccountManager) GroupValidation(ctx context.Context, accountID string, groupIDs []string) (bool, error) {