fix: Optimize knowledge domain error codes to expose previous errors during retries (#185)

This commit is contained in:
liuyunchao-1998 2025-07-28 22:53:53 +08:00 committed by GitHub
parent db7c95885d
commit 403128b5d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 35 additions and 9 deletions

View File

@ -438,7 +438,7 @@ func (k *KnowledgeApplicationService) GetDocumentProgress(ctx context.Context, r
DocumentID: domainResp.ProgressList[i].ID, DocumentID: domainResp.ProgressList[i].ID,
Progress: int32(domainResp.ProgressList[i].Progress), Progress: int32(domainResp.ProgressList[i].Progress),
Status: convertDocumentStatus2Model(domainResp.ProgressList[i].Status), Status: convertDocumentStatus2Model(domainResp.ProgressList[i].Status),
StatusDescript: ptr.Of(convertDocumentStatus2Model(domainResp.ProgressList[i].Status).String()), StatusDescript: &domainResp.ProgressList[i].StatusMsg,
DocumentName: domainResp.ProgressList[i].Name, DocumentName: domainResp.ProgressList[i].Name,
RemainingTime: &domainResp.ProgressList[i].RemainingSec, RemainingTime: &domainResp.ProgressList[i].RemainingSec,
Size: &domainResp.ProgressList[i].Size, Size: &domainResp.ProgressList[i].Size,

View File

@ -58,9 +58,7 @@ func (dao *KnowledgeDocumentSliceDAO) BatchCreate(ctx context.Context, slices []
func (dao *KnowledgeDocumentSliceDAO) BatchSetStatus(ctx context.Context, ids []int64, status int32, reason string) error { func (dao *KnowledgeDocumentSliceDAO) BatchSetStatus(ctx context.Context, ids []int64, status int32, reason string) error {
s := dao.Query.KnowledgeDocumentSlice s := dao.Query.KnowledgeDocumentSlice
updates := map[string]any{s.Status.ColumnName().String(): status} updates := map[string]any{s.Status.ColumnName().String(): status}
if reason != "" {
updates[s.FailReason.ColumnName().String()] = reason updates[s.FailReason.ColumnName().String()] = reason
}
updates[s.UpdatedAt.ColumnName().String()] = time.Now().UnixMilli() updates[s.UpdatedAt.ColumnName().String()] = time.Now().UnixMilli()
_, err := s.WithContext(ctx).Where(s.ID.In(ids...)).Updates(updates) _, err := s.WithContext(ctx).Where(s.ID.In(ids...)).Updates(updates)
return err return err

View File

@ -166,11 +166,22 @@ func (k *knowledgeSVC) indexDocument(ctx context.Context, event *entity.Event) (
return return
} }
if err != nil { if err != nil {
var errMsg string
var statusError errorx.StatusError var statusError errorx.StatusError
if errors.As(err, &statusError) && statusError.Code() == errno.ErrKnowledgeNonRetryableCode { var status int32
if setStatusErr := k.documentRepo.SetStatus(ctx, event.Document.ID, int32(entity.DocumentStatusFailed), err.Error()); setStatusErr != nil { if errors.As(err, &statusError) {
logs.CtxErrorf(ctx, "[indexDocument] set document status failed, err: %v", setStatusErr) errMsg = errorx.ErrorWithoutStack(statusError)
if statusError.Code() == errno.ErrKnowledgeNonRetryableCode {
status = int32(entity.DocumentStatusFailed)
} else {
status = int32(entity.DocumentStatusChunking)
} }
} else {
errMsg = err.Error()
status = int32(entity.DocumentStatusChunking)
}
if setStatusErr := k.documentRepo.SetStatus(ctx, event.Document.ID, status, errMsg); setStatusErr != nil {
logs.CtxErrorf(ctx, "[indexDocument] set document status failed, err: %v", setStatusErr)
} }
} }
}() }()

View File

@ -545,6 +545,12 @@ func (k *knowledgeSVC) MGetDocumentProgress(ctx context.Context, request *MGetDo
if documents[i].Status == int32(entity.DocumentStatusEnable) || documents[i].Status == int32(entity.DocumentStatusFailed) { if documents[i].Status == int32(entity.DocumentStatusEnable) || documents[i].Status == int32(entity.DocumentStatusFailed) {
item.Progress = progressbar.ProcessDone item.Progress = progressbar.ProcessDone
} else { } else {
if documents[i].FailReason != "" {
item.StatusMsg = documents[i].FailReason
item.Status = entity.DocumentStatusFailed
progresslist = append(progresslist, &item)
continue
}
err = k.getProgressFromCache(ctx, &item) err = k.getProgressFromCache(ctx, &item)
if err != nil { if err != nil {
logs.CtxErrorf(ctx, "get progress from cache failed, err: %v", err) logs.CtxErrorf(ctx, "get progress from cache failed, err: %v", err)
@ -564,8 +570,9 @@ func (k *knowledgeSVC) getProgressFromCache(ctx context.Context, documentProgres
documentProgress.Progress = int(percent) documentProgress.Progress = int(percent)
documentProgress.RemainingSec = int64(remainSec) documentProgress.RemainingSec = int64(remainSec)
if len(errMsg) != 0 { if len(errMsg) != 0 {
documentProgress.Progress = 0 documentProgress.Status = entity.DocumentStatusFailed
documentProgress.Status = entity.DocumentStatusChunking documentProgress.StatusMsg = errMsg
return err
} }
return err return err
} }
@ -1276,6 +1283,16 @@ func (k *knowledgeSVC) fromModelDocument(ctx context.Context, document *model.Kn
documentEntity.TableInfo.Columns = append(documentEntity.TableInfo.Columns, document.TableInfo.Columns[i]) documentEntity.TableInfo.Columns = append(documentEntity.TableInfo.Columns, document.TableInfo.Columns[i])
} }
} }
switch document.Status {
case int32(entity.DocumentStatusChunking), int32(entity.DocumentStatusInit), int32(entity.DocumentStatusUploading):
if document.FailReason != "" {
documentEntity.Status = entity.DocumentStatusFailed
documentEntity.StatusMsg = document.FailReason
}
case int32(entity.DocumentStatusFailed):
documentEntity.StatusMsg = document.FailReason
default:
}
if len(document.URI) != 0 { if len(document.URI) != 0 {
objUrl, err := k.storage.GetObjectUrl(ctx, document.URI) objUrl, err := k.storage.GetObjectUrl(ctx, document.URI)
if err != nil { if err != nil {