mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-05-06 13:42:10 +08:00
fix: handling deleted task object (#24703)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user