mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
use separate worker for long running tasks, such as ImageConvertTask,
ImageCheckTask, CloudProviderSyncInfoTask
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/gotypes"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
)
|
||||
|
||||
@@ -37,7 +38,7 @@ func init() {
|
||||
taskTable = make(map[string]reflect.Type)
|
||||
}
|
||||
|
||||
func RegisterTask(task interface{}) {
|
||||
func RegisterTaskAndWorker(task interface{}, workerMan *appsrv.SWorkerManager) {
|
||||
taskName := gotypes.GetInstanceTypeName(task)
|
||||
if _, ok := taskTable[taskName]; ok {
|
||||
log.Fatalf("Task %s already registered!", taskName)
|
||||
@@ -45,6 +46,13 @@ func RegisterTask(task interface{}) {
|
||||
taskType := reflect.Indirect(reflect.ValueOf(task)).Type()
|
||||
taskTable[taskName] = taskType
|
||||
// log.Infof("Task %s registerd", taskName)
|
||||
if workerMan != nil {
|
||||
taskWorkerTable[taskName] = workerMan
|
||||
}
|
||||
}
|
||||
|
||||
func RegisterTask(task interface{}) {
|
||||
RegisterTaskAndWorker(task, nil)
|
||||
}
|
||||
|
||||
func isTaskExist(taskName string) bool {
|
||||
|
||||
@@ -1,26 +1,12 @@
|
||||
package taskman
|
||||
|
||||
import (
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
"yunion.io/x/onecloud/pkg/appsrv/dispatcher"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
)
|
||||
|
||||
var taskWorkMan *appsrv.SWorkerManager
|
||||
|
||||
func init() {
|
||||
taskWorkMan = appsrv.NewWorkerManager("TaskWorkerManager", 4, 1024, true)
|
||||
}
|
||||
|
||||
func AddTaskHandler(prefix string, app *appsrv.Application) {
|
||||
handler := db.NewModelHandler(TaskManager)
|
||||
dispatcher.AddModelDispatcher(prefix, app, handler)
|
||||
}
|
||||
|
||||
func runTask(taskId string, data jsonutils.JSONObject) {
|
||||
taskWorkMan.Run(func() {
|
||||
TaskManager.execTask(taskId, data)
|
||||
}, nil, nil)
|
||||
}
|
||||
|
||||
@@ -287,6 +287,14 @@ func (manager *STaskManager) fetchTask(idStr string) *STask {
|
||||
return task
|
||||
}
|
||||
|
||||
func (manager *STaskManager) getTaskName(taskId string) string {
|
||||
baseTask := manager.fetchTask(taskId)
|
||||
if baseTask == nil {
|
||||
return ""
|
||||
}
|
||||
return baseTask.TaskName
|
||||
}
|
||||
|
||||
func (manager *STaskManager) execTask(taskId string, data jsonutils.JSONObject) {
|
||||
baseTask := manager.fetchTask(taskId)
|
||||
if baseTask == nil {
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package taskman
|
||||
|
||||
import (
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
)
|
||||
|
||||
var taskWorkMan *appsrv.SWorkerManager
|
||||
var taskWorkerTable map[string]*appsrv.SWorkerManager
|
||||
|
||||
func init() {
|
||||
taskWorkMan = appsrv.NewWorkerManager("TaskWorkerManager", 4, 1024, true)
|
||||
taskWorkerTable = make(map[string]*appsrv.SWorkerManager)
|
||||
}
|
||||
|
||||
func runTask(taskId string, data jsonutils.JSONObject) {
|
||||
taskName := TaskManager.getTaskName(taskId)
|
||||
if len(taskName) == 0 {
|
||||
log.Errorf("no such task??? task_id=%s", taskId)
|
||||
return
|
||||
}
|
||||
worker := taskWorkMan
|
||||
if workerMan, ok := taskWorkerTable[taskName]; ok {
|
||||
worker = workerMan
|
||||
}
|
||||
worker.Run(func() {
|
||||
TaskManager.execTask(taskId, data)
|
||||
}, nil, nil)
|
||||
}
|
||||
Reference in New Issue
Block a user