fix: 优化同步,避免长时间加锁

This commit is contained in:
ioito
2021-04-23 18:55:02 +08:00
committed by Qu Xuan
parent d62d6704a4
commit f9f0c8f3cb
82 changed files with 1024 additions and 699 deletions
+4 -1
View File
@@ -1204,8 +1204,11 @@ func _doCreateItem(
generateName, _ = dataDict.GetString("generate_name")
if len(generateName) > 0 {
if manager.EnableGenerateName() {
lockman.LockRawObject(ctx, manager.Keyword(), "name")
defer lockman.ReleaseRawObject(ctx, manager.Keyword(), "name")
// if enable generateName, alway generate name
newName, err := GenerateName2(manager, ownerId, generateName, nil, baseIndex)
newName, err := GenerateName2(ctx, manager, ownerId, generateName, nil, baseIndex)
if err != nil {
return nil, errors.Wrap(err, "GenerateName2")
}
+5 -4
View File
@@ -15,6 +15,7 @@
package db
import (
"context"
"fmt"
"regexp"
@@ -111,18 +112,18 @@ func alterNameValidator(model IModel, name string) error {
return nil
}
func GenerateName(manager IModelManager, ownerId mcclient.IIdentityProvider, hint string) (string, error) {
return GenerateName2(manager, ownerId, hint, nil, 1)
func GenerateName(ctx context.Context, manager IModelManager, ownerId mcclient.IIdentityProvider, hint string) (string, error) {
return GenerateName2(ctx, manager, ownerId, hint, nil, 1)
}
func GenerateAlterName(model IModel, hint string) (string, error) {
if hint == model.GetName() {
return hint, nil
}
return GenerateName2(nil, nil, hint, model, 1)
return GenerateName2(nil, nil, nil, hint, model, 1)
}
func GenerateName2(manager IModelManager, ownerId mcclient.IIdentityProvider, hint string, model IModel, baseIndex int) (string, error) {
func GenerateName2(ctx context.Context, manager IModelManager, ownerId mcclient.IIdentityProvider, hint string, model IModel, baseIndex int) (string, error) {
_, pattern, patternLen, offset := stringutils2.ParseNamePattern2(hint)
var name string
if patternLen == 0 {
+5 -6
View File
@@ -492,12 +492,12 @@ func (model *SVirtualResourceBase) MarkCancelPendingDelete(ctx context.Context,
manager := model.GetModelManager()
ownerId := model.GetOwnerId()
lockman.LockClass(ctx, manager, GetLockClassKey(manager, ownerId))
defer lockman.ReleaseClass(ctx, manager, GetLockClassKey(manager, ownerId))
lockman.LockRawObject(ctx, manager.Keyword(), "name")
defer lockman.ReleaseRawObject(ctx, manager.Keyword(), "name")
newName, err := GenerateName(manager, ownerId, model.Name)
newName, err := GenerateName(ctx, manager, ownerId, model.Name)
if err != nil {
return err
return errors.Wrapf(err, "GenerateNam")
}
diff, err := Update(model, func() error {
model.Name = newName
@@ -506,8 +506,7 @@ func (model *SVirtualResourceBase) MarkCancelPendingDelete(ctx context.Context,
return nil
})
if err != nil {
log.Errorf("MarkCancelPendingDelete fail %s", err)
return err
return errors.Wrapf(err, "MarkCancelPendingDelete.Update")
}
OpsLog.LogEvent(model, ACT_CANCEL_DELETE, diff, userCred)
return nil