From 07d26676d24542b4bf01b7330d2adc4da1037e97 Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Thu, 23 Apr 2026 10:18:42 +0800 Subject: [PATCH] fix: handling deleted task object (#24703) Co-authored-by: Qiu Jian --- pkg/cloudcommon/db/baselog.go | 4 +++ pkg/cloudcommon/db/cache.go | 4 +++ pkg/cloudcommon/db/fetch.go | 11 ++++++- pkg/cloudcommon/db/interface.go | 4 +-- pkg/cloudcommon/db/modelbase.go | 4 +++ pkg/cloudcommon/db/standalone_anon.go | 4 +++ pkg/cloudcommon/db/taskman/tasks.go | 42 ++++++++++++++++++++------- 7 files changed, 60 insertions(+), 13 deletions(-) diff --git a/pkg/cloudcommon/db/baselog.go b/pkg/cloudcommon/db/baselog.go index cda4e07291..70b33dde02 100644 --- a/pkg/cloudcommon/db/baselog.go +++ b/pkg/cloudcommon/db/baselog.go @@ -134,6 +134,10 @@ func (lb *SLogBase) GetRecordTime() time.Time { return time.Time{} } +func (manager *SLogBaseManager) RawFetchById(idStr string) (IModel, error) { + return FetchById(manager.GetIModelManager(), idStr) +} + func (manager *SLogBaseManager) FetchById(idStr string) (IModel, error) { return FetchById(manager.GetIModelManager(), idStr) } diff --git a/pkg/cloudcommon/db/cache.go b/pkg/cloudcommon/db/cache.go index 8f15b952a7..a474b45f5c 100644 --- a/pkg/cloudcommon/db/cache.go +++ b/pkg/cloudcommon/db/cache.go @@ -53,6 +53,10 @@ func (cm *SCacheManager[T]) FetchById(id string) (*T, error) { } } +func (cm *SCacheManager[T]) RawFetchById(id string) (*T, error) { + return cm.FetchById(id) +} + func (cm *SCacheManager[T]) fetchCacheFromDB() error { q := cm.manager.Query() ret := make([]T, 0) diff --git a/pkg/cloudcommon/db/fetch.go b/pkg/cloudcommon/db/fetch.go index a381f59a59..a7b59fc739 100644 --- a/pkg/cloudcommon/db/fetch.go +++ b/pkg/cloudcommon/db/fetch.go @@ -74,7 +74,16 @@ func FetchJointByIds(manager IJointModelManager, masterId, slaveId string, query } func FetchById(manager IModelManager, idStr string) (IModel, error) { - q := manager.Query() + return FetchById2(manager, idStr, false) +} + +func FetchById2(manager IModelManager, idStr string, rawQuery bool) (IModel, error) { + var q *sqlchemy.SQuery + if rawQuery { + q = manager.RawQuery() + } else { + q = manager.Query() + } q = manager.FilterById(q, idStr) count, err := q.CountWithError() if err != nil { diff --git a/pkg/cloudcommon/db/interface.go b/pkg/cloudcommon/db/interface.go index 56b4c77a7c..20d19d1e36 100644 --- a/pkg/cloudcommon/db/interface.go +++ b/pkg/cloudcommon/db/interface.go @@ -72,7 +72,7 @@ type IModelManager interface { NewQuery(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, useRawQuery bool) *sqlchemy.SQuery // fetch hook Query(val ...string) *sqlchemy.SQuery - // RawQuery(val ...string) *sqlchemy.SQuery + RawQuery(val ...string) *sqlchemy.SQuery FilterById(q *sqlchemy.SQuery, idStr string) *sqlchemy.SQuery FilterByNotId(q *sqlchemy.SQuery, idStr string) *sqlchemy.SQuery @@ -86,7 +86,7 @@ type IModelManager interface { // GetOwnerId(userCred mcclient.IIdentityProvider) mcclient.IIdentityProvider - // RawFetchById(idStr string) (IModel, error) + RawFetchById(idStr string) (IModel, error) FetchById(idStr string) (IModel, error) FetchByName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) FetchByIdOrName(ctx context.Context, userCred mcclient.IIdentityProvider, idStr string) (IModel, error) diff --git a/pkg/cloudcommon/db/modelbase.go b/pkg/cloudcommon/db/modelbase.go index 32ed70a3c9..e3f4b970a8 100644 --- a/pkg/cloudcommon/db/modelbase.go +++ b/pkg/cloudcommon/db/modelbase.go @@ -295,6 +295,10 @@ func (manager *SModelBaseManager) FilterByUniqValues(q *sqlchemy.SQuery, uniqVal return q } +func (manager *SModelBaseManager) RawFetchById(idStr string) (IModel, error) { + return nil, sql.ErrNoRows +} + func (manager *SModelBaseManager) FetchById(idStr string) (IModel, error) { return nil, sql.ErrNoRows } diff --git a/pkg/cloudcommon/db/standalone_anon.go b/pkg/cloudcommon/db/standalone_anon.go index fae771ad44..9afa11d252 100644 --- a/pkg/cloudcommon/db/standalone_anon.go +++ b/pkg/cloudcommon/db/standalone_anon.go @@ -140,6 +140,10 @@ func (manager *SStandaloneAnonResourceBaseManager) FilterByHiddenSystemAttribute return q } +func (manager *SStandaloneAnonResourceBaseManager) RawFetchById(idStr string) (IModel, error) { + return FetchById2(manager.GetIStandaloneModelManager(), idStr, true) +} + func (manager *SStandaloneAnonResourceBaseManager) FetchById(idStr string) (IModel, error) { return FetchById(manager.GetIStandaloneModelManager(), idStr) } diff --git a/pkg/cloudcommon/db/taskman/tasks.go b/pkg/cloudcommon/db/taskman/tasks.go index 94085e1c32..4d898ff910 100644 --- a/pkg/cloudcommon/db/taskman/tasks.go +++ b/pkg/cloudcommon/db/taskman/tasks.go @@ -562,11 +562,22 @@ func execITask(taskValue reflect.Value, task *STask, odata jsonutils.JSONObject, for i, objId := range objIds { obj, err := objResManager.FetchById(objId) if err != nil { - msg := fmt.Sprintf("fail to find %s object %s", task.ObjType, objId) - log.Errorf("%s", msg) - task.SetStageFailed(ctx, jsonutils.NewString(msg)) - task.SaveRequestContext(&ctxData) - return + if errors.Cause(err) == sql.ErrNoRows { + obj, err = objResManager.RawFetchById(objId) + if err == nil { + // find it + } else if errors.Cause(err) == sql.ErrNoRows { + // not found resource + err = errors.ErrNotFound + } + } + if obj == nil { + msg := errors.Wrapf(err, "fail to find %s object %s", task.ObjType, objId).Error() + log.Errorln(msg) + task.SetStageFailed(ctx, jsonutils.NewString(msg)) + task.SaveRequestContext(&ctxData) + return + } } objs[i] = obj.(db.IStandaloneModel) } @@ -584,11 +595,22 @@ func execITask(taskValue reflect.Value, task *STask, odata jsonutils.JSONObject, } else { obj, err := objResManager.FetchById(task.ObjId) if err != nil { - msg := fmt.Sprintf("fail to find %s object %s", task.ObjType, task.ObjId) - log.Errorf("%s", msg) - task.SetStageFailed(ctx, jsonutils.NewString(msg)) - task.SaveRequestContext(&ctxData) - return + if errors.Cause(err) == sql.ErrNoRows { + obj, err = objResManager.RawFetchById(task.ObjId) + if err == nil { + // find it + } else if errors.Cause(err) == sql.ErrNoRows { + // not found resource + err = errors.ErrNotFound + } + } + if obj == nil { + msg := errors.Wrapf(err, "fail to find %s object %s", task.ObjType, task.ObjId).Error() + log.Errorln(msg) + task.SetStageFailed(ctx, jsonutils.NewString(msg)) + task.SaveRequestContext(&ctxData) + return + } } task.taskObject = obj.(db.IStandaloneModel)