From 702133be51cacae487f2e5b7a286ebcc7142d191 Mon Sep 17 00:00:00 2001 From: rainzm Date: Fri, 23 Apr 2021 16:22:14 +0800 Subject: [PATCH] fix(region): use special localtask to run time-consuming provider synchronization task CloudProviderSyncInfoTask will local cloudprovider. Make locaktask run time-consuming task can avoid holding locks for a long time. --- pkg/cloudcommon/db/taskman/localtaskworker.go | 8 +++-- .../tasks/cloud_provider_sync_info_task.go | 32 +++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/pkg/cloudcommon/db/taskman/localtaskworker.go b/pkg/cloudcommon/db/taskman/localtaskworker.go index 32ac38770e..7f68ffb4fa 100644 --- a/pkg/cloudcommon/db/taskman/localtaskworker.go +++ b/pkg/cloudcommon/db/taskman/localtaskworker.go @@ -37,8 +37,8 @@ func Error2TaskData(err error) jsonutils.JSONObject { return errJson } -func LocalTaskRun(task ITask, proc func() (jsonutils.JSONObject, error)) { - localTaskWorkerMan.Run(func() { +func LocalTaskRunWithWorkers(task ITask, proc func() (jsonutils.JSONObject, error), wm *appsrv.SWorkerManager) { + wm.Run(func() { log.Debugf("XXXXXXXXXXXXXXXXXXLOCAL TASK RUN STARTXXXXXXXXXXXXXXXXX") defer log.Debugf("XXXXXXXXXXXXXXXXXXLOCAL TASK RUN END XXXXXXXXXXXXXXXXX") @@ -59,3 +59,7 @@ func LocalTaskRun(task ITask, proc func() (jsonutils.JSONObject, error)) { }, nil, nil) } + +func LocalTaskRun(task ITask, proc func() (jsonutils.JSONObject, error)) { + LocalTaskRunWithWorkers(task, proc, localTaskWorkerMan) +} diff --git a/pkg/compute/tasks/cloud_provider_sync_info_task.go b/pkg/compute/tasks/cloud_provider_sync_info_task.go index db9788e025..ca6f4a1e5e 100644 --- a/pkg/compute/tasks/cloud_provider_sync_info_task.go +++ b/pkg/compute/tasks/cloud_provider_sync_info_task.go @@ -34,9 +34,12 @@ type CloudProviderSyncInfoTask struct { taskman.STask } +var syncLocalTaskWorkerMan *appsrv.SWorkerManager + func InitCloudproviderSyncWorkers(count int) { syncWorker := appsrv.NewWorkerManager("CloudProviderSyncInfoTaskWorkerManager", count, 512, true) taskman.RegisterTaskAndWorker(CloudProviderSyncInfoTask{}, syncWorker) + syncLocalTaskWorkerMan = appsrv.NewWorkerManager("CloudProviderSyncLocalTaskWorkerManager", count, 512, false) } func getAction(params *jsonutils.JSONDict) string { @@ -94,17 +97,32 @@ func (self *CloudProviderSyncInfoTask) OnSyncCloudProviderPreInfoComplete(ctx co syncRange := self.GetSyncRange() db.OpsLog.LogEvent(provider, db.ACT_SYNCING_HOST, "", self.UserCred) + self.SetStage("OnSyncCloudProviderInfoComplete", nil) - provider.SyncCallSyncCloudproviderRegions(ctx, self.UserCred, syncRange) - provider.SyncCallSyncCloudproviderInterVpcNetwork(ctx, self.UserCred) - - provider.CleanSchedCache() - self.SetStageComplete(ctx, nil) - db.OpsLog.LogEvent(provider, db.ACT_SYNC_HOST_COMPLETE, "", self.UserCred) - logclient.AddActionLogWithStartable(self, provider, getAction(self.Params), body, self.UserCred, true) + taskman.LocalTaskRunWithWorkers(self, func() (jsonutils.JSONObject, error) { + provider.SyncCallSyncCloudproviderRegions(ctx, self.UserCred, syncRange) + provider.SyncCallSyncCloudproviderInterVpcNetwork(ctx, self.UserCred) + return nil, nil + }, syncLocalTaskWorkerMan) } func (self *CloudProviderSyncInfoTask) OnSyncCloudProviderPreInfoCompleteFailed(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { log.Errorf("faild to sync provider quotas %s", body.String()) self.OnSyncCloudProviderPreInfoComplete(ctx, obj, body) } + +func (self *CloudProviderSyncInfoTask) OnSyncCloudProviderInfoComplete(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { + provider := obj.(*models.SCloudprovider) + provider.CleanSchedCache() + db.OpsLog.LogEvent(provider, db.ACT_SYNC_HOST_COMPLETE, "", self.UserCred) + logclient.AddActionLogWithStartable(self, provider, getAction(self.Params), body, self.UserCred, true) + self.SetStageComplete(ctx, nil) +} + +func (self *CloudProviderSyncInfoTask) OnSyncCloudProviderInfoCompleteFailed(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) { + provider := obj.(*models.SCloudprovider) + provider.CleanSchedCache() + db.OpsLog.LogEvent(provider, db.ACT_SYNC_HOST_FAILED, "", self.UserCred) + logclient.AddActionLogWithStartable(self, provider, getAction(self.Params), body, self.UserCred, false) + self.SetStageFailed(ctx, nil) +}