Skip to content

[Fix] 최초 인덱싱 구간에서 DocumentStatus.INDEXING이 노출되지 않음 #230

Description

@Gimini-3

📌 Description

문서 API QA(시나리오 3) 중 발견했습니다. GET /api/documents/{id}/status를 0.25초 간격으로 폴링해도 documentStatusUPLOADED → 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.findTopKAND 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을 관찰할 수 있다.
  • 이미 INDEXED인 문서에 새 버전을 올리는 동안 documentStatus가 계속 INDEXED이고 기존 버전이 검색된다.
  • GET /api/documents?status=INDEXING이 최초 인덱싱 중인 문서를 반환한다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions