From 403128b5d32adc13f3f2f34f02a1e56ee62803d8 Mon Sep 17 00:00:00 2001 From: liuyunchao-1998 Date: Mon, 28 Jul 2025 22:53:53 +0800 Subject: [PATCH] fix: Optimize knowledge domain error codes to expose previous errors during retries (#185) --- backend/application/knowledge/knowledge.go | 2 +- .../dal/dao/knowledge_document_slice.go | 4 +--- .../domain/knowledge/service/event_handle.go | 17 ++++++++++++--- backend/domain/knowledge/service/knowledge.go | 21 +++++++++++++++++-- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/backend/application/knowledge/knowledge.go b/backend/application/knowledge/knowledge.go index 8b7bf3a6..568b7fec 100644 --- a/backend/application/knowledge/knowledge.go +++ b/backend/application/knowledge/knowledge.go @@ -438,7 +438,7 @@ func (k *KnowledgeApplicationService) GetDocumentProgress(ctx context.Context, r DocumentID: domainResp.ProgressList[i].ID, Progress: int32(domainResp.ProgressList[i].Progress), 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, RemainingTime: &domainResp.ProgressList[i].RemainingSec, Size: &domainResp.ProgressList[i].Size, diff --git a/backend/domain/knowledge/internal/dal/dao/knowledge_document_slice.go b/backend/domain/knowledge/internal/dal/dao/knowledge_document_slice.go index ca1147ea..aaca1a0c 100644 --- a/backend/domain/knowledge/internal/dal/dao/knowledge_document_slice.go +++ b/backend/domain/knowledge/internal/dal/dao/knowledge_document_slice.go @@ -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 { s := dao.Query.KnowledgeDocumentSlice 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() _, err := s.WithContext(ctx).Where(s.ID.In(ids...)).Updates(updates) return err diff --git a/backend/domain/knowledge/service/event_handle.go b/backend/domain/knowledge/service/event_handle.go index 404d2cd4..7aad7846 100644 --- a/backend/domain/knowledge/service/event_handle.go +++ b/backend/domain/knowledge/service/event_handle.go @@ -166,11 +166,22 @@ func (k *knowledgeSVC) indexDocument(ctx context.Context, event *entity.Event) ( return } if err != nil { + var errMsg string var statusError errorx.StatusError - if errors.As(err, &statusError) && statusError.Code() == errno.ErrKnowledgeNonRetryableCode { - if setStatusErr := k.documentRepo.SetStatus(ctx, event.Document.ID, int32(entity.DocumentStatusFailed), err.Error()); setStatusErr != nil { - logs.CtxErrorf(ctx, "[indexDocument] set document status failed, err: %v", setStatusErr) + var status int32 + if errors.As(err, &statusError) { + 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) } } }() diff --git a/backend/domain/knowledge/service/knowledge.go b/backend/domain/knowledge/service/knowledge.go index a09be458..181fa5ca 100644 --- a/backend/domain/knowledge/service/knowledge.go +++ b/backend/domain/knowledge/service/knowledge.go @@ -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) { item.Progress = progressbar.ProcessDone } else { + if documents[i].FailReason != "" { + item.StatusMsg = documents[i].FailReason + item.Status = entity.DocumentStatusFailed + progresslist = append(progresslist, &item) + continue + } err = k.getProgressFromCache(ctx, &item) if err != nil { 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.RemainingSec = int64(remainSec) if len(errMsg) != 0 { - documentProgress.Progress = 0 - documentProgress.Status = entity.DocumentStatusChunking + documentProgress.Status = entity.DocumentStatusFailed + documentProgress.StatusMsg = errMsg + 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]) } } + 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 { objUrl, err := k.storage.GetObjectUrl(ctx, document.URI) if err != nil {