📌 Description
문서 API QA(시나리오 3) 중 발견했습니다. GET /api/documents/{id}/status를 0.25초 간격으로 폴링해도 documentStatus가 UPLOADED → INDEXED로 직행하고 INDEXING을 한 번도 거치지 않습니다.
16:04:03 doc=UPLOADED | cur=없음 | proc=v1/UPLOADED job=PENDING
16:04:07 doc=UPLOADED | cur=없음 | proc=v1/UPLOADED job=PROCESSING
16:04:08 doc=UPLOADED | cur=없음 | proc=v1/EMBEDDING job=PROCESSING
16:04:09 doc=INDEXED | cur=v1/INDEXED| proc=없음
원인은 Document.markIndexing() 호출부가 EmbeddingJobManualRetryService, IndexedVersionVectorRepairService 두 재시도·복구 경로뿐이고 정상 업로드→인덱싱 경로에는 없기 때문입니다. 그 결과 DocumentStatus.INDEXING은 정상 플로우에서 사실상 미사용 값이고, 프론트 문서 목록의 INDEXING 필터는 항상 0건입니다.
⚠️ 단순 수정 시 회귀 위험
재인덱싱 경로에까지 markIndexing()을 넣으면 기존에 검색되던 문서가 새 버전 인덱싱 동안 검색에서 이탈합니다.
VectorSearchRepository.findTopK — AND d.status = 'INDEXED'
AccessibleDocumentQueryService.SEARCHABLE_STATUSES — [INDEXED]
또한 Document.activateVersion()에 "포인터와 문서 상태를 함께 변경해 검색 조건이 중간 상태를 관찰하지 않게 한다"는 주석이 있어, 재인덱싱 중 INDEXED 유지는 의도된 설계로 판단됩니다.
따라서 최초 인덱싱(=currentVersion이 아직 없는 경우)에만 INDEXING을 노출하고, 재인덱싱은 현행 INDEXED 유지를 지킵니다. 최초 인덱싱 중인 문서는 어차피 검색 대상이 아니라 검색 영향이 없습니다.
✅ To-do
✅ 완료 기준
📌 Description
문서 API QA(시나리오 3) 중 발견했습니다.
GET /api/documents/{id}/status를 0.25초 간격으로 폴링해도documentStatus가UPLOADED → INDEXED로 직행하고INDEXING을 한 번도 거치지 않습니다.원인은
Document.markIndexing()호출부가EmbeddingJobManualRetryService,IndexedVersionVectorRepairService두 재시도·복구 경로뿐이고 정상 업로드→인덱싱 경로에는 없기 때문입니다. 그 결과DocumentStatus.INDEXING은 정상 플로우에서 사실상 미사용 값이고, 프론트 문서 목록의 INDEXING 필터는 항상 0건입니다.재인덱싱 경로에까지
markIndexing()을 넣으면 기존에 검색되던 문서가 새 버전 인덱싱 동안 검색에서 이탈합니다.VectorSearchRepository.findTopK—AND d.status = 'INDEXED'AccessibleDocumentQueryService.SEARCHABLE_STATUSES—[INDEXED]또한
Document.activateVersion()에 "포인터와 문서 상태를 함께 변경해 검색 조건이 중간 상태를 관찰하지 않게 한다"는 주석이 있어, 재인덱싱 중 INDEXED 유지는 의도된 설계로 판단됩니다.따라서 최초 인덱싱(=
currentVersion이 아직 없는 경우)에만 INDEXING을 노출하고, 재인덱싱은 현행 INDEXED 유지를 지킵니다. 최초 인덱싱 중인 문서는 어차피 검색 대상이 아니라 검색 영향이 없습니다.✅ To-do
DocumentChunkTransactionService최초UPLOADED진입 블록에서document.getCurrentVersion() == null일 때만document.markIndexing()호출 (판단 근거 주석 필수)INDEXING → FAILED전이가 정상 동작하는지IndexingFailureTransitionService확인INDEXING관찰INDEXED유지 (검색 이탈 회귀 방지)✅ 완료 기준
GET /api/documents/{id}/status에서documentStatus=INDEXING을 관찰할 수 있다.documentStatus가 계속INDEXED이고 기존 버전이 검색된다.GET /api/documents?status=INDEXING이 최초 인덱싱 중인 문서를 반환한다.