원자성 및 복구
AtomicFilesystem::write_atomic()은 임시 파일에 기록하고 해당 파일 핸들을 flush 및 fsync한 다음 대상 경로에 덮어씁니다. 이어 상위 디렉터리의 fsync를 시도합니다. 쓰기에 실패하면 해당 임시 파일을 삭제합니다.
쓰기용 store 인스턴스는 .storh/writers/ 아래에 프로세스별 마커를 등록하고 정상 종료 시 제거합니다. store를 열 때 해당 마커를 확인합니다. 모든 마커의 소유 프로세스가 실행 중이거나 마커가 없으면 상수 시간에 열립니다. 소유 프로세스가 종료된 마커가 있으면 작성 프로세스가 비정상 종료된 것이므로, 열기 과정에서 컬렉션을 훑어 고아 임시 파일을 제거하고 오래된 마커를 삭제합니다. repair()은 항상 전체를 훑습니다.
DocStore 복구는 손상되거나 잘린 레코드 파일을 .storh/corrupt/ 아래에 격리하고 남은 유효 레코드에서 보조 인덱스를 다시 빌드합니다. DocStore 검증은 인덱스 파일과 전체 레코드 검색 결과도 비교하므로, 누락되거나 오래된 인덱스 항목이 정상으로 간주되기 전에 보고됩니다.
추가 전용 엔진은 메모리에서 이벤트를 커밋된 것으로 처리하기 전에 로그 파일 핸들을 flush 및 fsync합니다. 정전 시 내구성은 파일 및 디렉터리 동기화를 지원하는 기반 파일 시스템과 마운트 옵션에 달려 있습니다.
분할 로그는 각 줄을 다음 형식으로 기록합니다.
<byte-length>\t<xxh32>\t<json>\n
읽기 시 바이트 길이와 체크섬을 확인합니다. 복구 과정에서는 각 세그먼트를 검색해 마지막으로 완전하고 유효한 줄에서 파일을 잘라내 불완전한 후행 쓰기를 제거합니다. 검증은 활성 파생 상태 인덱스를 독립적인 세그먼트 재생 결과와 비교하므로, 외부에서 변경되거나 오래된 상태를 복구로 다시 빌드하기 전에 보고합니다.
큐 검증은 모든 내구성 있는 큐 이벤트를 디코딩하고 현재 대기, 처리 중, 완료, 페이로드 및 클레임 순서 상태를 독립적인 로그 재생 결과와 비교합니다. 복구는 queue.log에서 상태를 다시 빌드하고 불완전한 후행 이벤트를 잘라냅니다. 클레임 및 완료 작업은 내구성 있는 로그에서 동기화하는 동안 큐 잠금을 유지하므로 여러 작업자 프로세스가 같은 대기 작업을 클레임하지 않습니다.
압축은 새 compact-* 세그먼트 파일을 기록한 다음 매니페스트를 업데이트합니다. 매니페스트 교체 전에 프로세스가 종료되면 다시 열 때 참조되지 않는 압축 출력을 제거하고 기존 매니페스트를 사용합니다. 완료된 압축은 이전 봉인 세그먼트를 의도적으로 남겨 두므로, 이미 해당 세그먼트에서 읽는 중인 리더가 계속 유효하게 작동합니다.