fix: handling deleted task object (#24703)

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
Jian Qiu
2026-04-23 10:18:42 +08:00
committed by GitHub
parent e5a136056f
commit 07d26676d2
7 changed files with 60 additions and 13 deletions

View File

@@ -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)
}

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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)