fix(store-vector): #230 나머지 — 삭제 배치화 + 삭제 경로 압축 + doctor 지표 #234
Reference in New Issue
Block a user
Delete Branch "fix/lance-delete-batching"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
요약
PR #233 이 이슈 #230 의 네 제안 중 두 번째(압축 정책)만 닫았다. 이 PR 이 나머지 1·3·4 를 처리해 #230 을 닫는다.
1. 삭제가 파일 1건당 Lance 커밋 1회 (제안 1)
sweep_deleted_files(ingest.rs)와execute_orphans_only(reset.rs)가 루프 안에서 파일마다delete_by_chunk_ids를 불렀다. 그 호출 하나가 Lance 커밋 하나라 문서 삭제 수와 커밋 수가 1:1 이었다 — #230 이 보고한 "삭제 5,834건 → 커밋 5,834회" 가 이것이다.chunk_id 를 sweep 전체에 걸쳐 모아 루프가 끝난 뒤 한 번만 부른다. SQLite purge 는 건별 커밋을 유지했다. 그쪽이 crash-safety 경계이고, 기존 정책이 이미 중간에 죽으면 orphan 벡터가 남는 것을 허용한다.
실 KB 실측 — 28,427 문서 KB 에서 나무위키 샤드 하나(364 문서)를 예비로 옮기고 재색인:
_transactions33 은
delete_by_chunk_ids내부의 200개 배치 상한에서 나온다(364 문서 × 약 18 청크 ≈ 6,500 id / 200). 커밋 수가 문서 수가 아니라 청크 수/200 에 비례하게 됐다.2. 삭제 경로에도 압축
압축이 upsert 에만 걸려 있어
reset --orphans-only처럼 삭제만 하는 경로는 여전히 무한 누적이었다. 트리거를maybe_compact헬퍼로 빼고delete_by_chunk_ids끝에서도 부른다.3. doctor 에 Lance 지표 (제안 4)
vector_store체크를 추가했다. fragment 수 / 데이터 크기 / 버전 수 / 메타데이터 크기를 보여주고, 메타데이터가 데이터보다 크면 fail 로 잡는다 — 그게 #230 병리의 모양이다. lancedb 를 열지 않고 파일시스템만 읽어서 임베딩 provider 가none이어도 나오고 비용이 0 이다.DoctorCheck목록에 항목을 더하는 것이라doctor.v1wire 는 그대로다(additive).실제 출력:
✓ vector_store 200 fragments / 2832.3 MB data, 201 versions / 2.0 MB metadata4. geodatafusion (제안 3) — 미해결
lance 내부라 kebab 쪽에서 끌 수 있는 feature flag 가 없다. 다만 이 비용은
table.delete()호출당 fragment 수만큼 곱해지므로, 위의 커밋 수 감소(364 → 33)가 그대로 곱셈 횟수 감소다. 근본 해결은 upstream 이슈로 올려야 한다.검증
repeated_deletes_do_not_accumulate_lance_versions— 삭제 경로 압축을 빼면 40회 삭제에 매니페스��� 42개로 실제로 실패하는 것을 확인한 뒤 고쳤다clippy -p kebab-store-vector통과.kebab-app은kebab-parse-code의 기존question_mark지적이 전이돼 red 인데 main 도 동일하며 이 PR 이 건드리지 않은 크레이트다시험 항목 (Test Plan)
cargo test --workspace --no-fail-fastcargo test -p kebab-store-vector -- --ignored(compaction 2건)kebab doctor신규 체크 출력 확인비범위
Assisted-by: Claude Code