Conversation
markIndexing() 호출부가 재시도·복구 서비스 두 곳뿐이라 정상 업로드 경로에서는 documentStatus가 UPLOADED에서 INDEXED로 직행했고, DocumentStatus.INDEXING은 사실상 쓰이지 않는 값이었다. 파싱 시작 Transaction에서 문서 상태도 함께 INDEXING으로 전환해 진행 상황이 드러나게 했다. 단 재인덱싱에는 적용하지 않는다. VectorSearchRepository.findTopK와 AccessibleDocumentQueryService가 d.status = 'INDEXED'로 검색 대상을 거르기 때문에, 이미 INDEXED인 문서의 상태를 처리 중에 바꾸면 기존에 검색되던 문서가 새 Version을 인덱싱하는 동안 검색 결과에서 이탈한다. Document.activateIndexedVersion() 주석이 명시한 "검색 조건이 중간 상태를 관찰하지 않게 한다"는 설계와도 어긋난다. 조건은 document.status == UPLOADED로 잡았다. currentVersion은 업로드 접수 시점에 이미 설정되므로(DocumentUploadService) null 검사로는 최초 인덱싱을 구분할 수 없다. UPLOADED는 최초 업로드와, FAILED 문서에 새 Version을 올려 재시도하는 경우(DocumentVersionUploadService의 markUploaded)를 함께 가리키며 두 경우 모두 검색 대상 Version이 없어 노출해도 검색 가용성에 영향이 없다. 실패 경로는 IndexingFailureTransitionService가 이미 INDEXING을 FAILED 전이 허용 상태로 처리하고 있어 추가 변경이 없었다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
prepareEntities에 documentStatus 인자를 받는 오버로드를 추가해 기존 테스트 동작은 그대로 두고 문서 상태만 케이스별로 지정할 수 있게 했다. 두 번째 테스트가 이 변경의 회귀 방어선이다. 조건 없이 markIndexing()을 호출하도록 되돌리면 이 테스트만 실패하는 것을 확인했다. 재인덱싱 중 문서 상태가 바뀌면 검색 경로의 d.status = 'INDEXED' 조건에서 기존 Version이 이탈하므로, 그 사고를 테스트가 먼저 잡도록 남겼다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Important Review available on request
Reviews should be triggered manually for repositories with fewer than 10 stars. Select Trigger review above or comment ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
📌 배경
GET /api/documents/{id}/status를 0.25초 간격으로 폴링해도documentStatus가UPLOADED → INDEXED로 직행하고INDEXING을 거치지 않았습니다.Document.markIndexing()호출부가 재시도·복구 서비스 두 곳뿐이고 정상 업로드 경로에는 없었기 때문입니다.🔧 변경 내용
파싱 시작 Transaction(
DocumentChunkTransactionService.prepare)에서 문서 상태도 함께INDEXING으로 전환합니다. 단 검색 가능한 Version이 없는 경우로 한정합니다.UPLOADEDINDEXED유지FAILED→UPLOADED왜 재인덱싱은 제외했나
검색 경로가 문서 상태로 대상을 거릅니다.
VectorSearchRepository.findTopK—AND d.status = 'INDEXED'AccessibleDocumentQueryService.SEARCHABLE_STATUSES—[INDEXED]재인덱싱 중 상태를 바꾸면 기존에 검색되던 문서가 새 Version을 처리하는 동안 검색 결과에서 이탈합니다.
Document.activateIndexedVersion()의 "포인터와 문서 상태를 함께 변경해 검색 조건이 중간 상태를 관찰하지 않게 한다"는 주석과도 어긋납니다.왜
currentVersion == null이 아닌가currentVersion은 업로드 접수 시점에 이미 설정되므로(DocumentUploadService) null 검사로는 최초 인덱싱을 구분할 수 없습니다.markUploaded()가FAILED일 때만 호출된다는 점을 확인해status == UPLOADED로 조건을 확정했습니다.실패 경로는
IndexingFailureTransitionService가 이미INDEXING을 FAILED 전이 허용 상태로 처리하고 있어 추가 변경이 없습니다. 스키마에 status CHECK 제약이 없어 마이그레이션도 불필요합니다.✅ 검증
런타임 E2E — 실행 중인 구버전 앱(8080)과 이 브랜치 코드(8081)가 같은 DB에서 Job을 경쟁해 대조 실험이 됐습니다.
로그 교차 확인 결과 이 브랜치 워커(
workerId=14)가 처리한 건jobId=23 → documentId=18하나뿐이며, 정확히 INDEXING이 관찰된 문서입니다.재인덱싱 회귀 — 이 브랜치 워커가 처리한 10회 모두 처리 중에도
documentStatus가INDEXED유지. 검색 가용성 보존 확인.테스트 — 단위 테스트 10/10 통과. 조건 없이
markIndexing()을 호출하도록 되돌리면 회귀 테스트만 실패하는 것을 확인했습니다(뮤테이션 검증).전체 스위트는 987개 중 977개 통과이며, 실패 10건은 Redis 미기동 1건과 실행 중인 앱의 워커가 테스트 Job을 낚아채며 생긴 정리 FK 위반·데드락 9건으로 단정 실패는 0건입니다.
📎 참고
이 작업 중 기존 버그를 발견해 별도 등록했습니다 — #233 (
LocalDocumentIndexingE2ETest의미 검색에서 DOCX 누락, develop 기준으로도 실패).closes #230