같은 프로그램 안에서도 생성 자료, 다운로드 파일, 실행 영수증, 스킬 문서는 서로 다른 경로로 저장된다. 어느 한 경로에 sync가 있다고 모든 파일이 같은 장애 보장을 얻지는 않는다. 북극성의 실제 저장 함수를 비교하며 완료라는 말을 어디까지 쓸 수 있는지 다시 정리했다.

저장 결과를 단계별 질문으로 읽었다

이름을 고르고 쓰기에 성공했는가, 파일 내용을 동기화하도록 요청했는가, 정본 이름으로 바꿨는가, 실패 뒤 이전 자료가 남는가, 전원이 끊긴 뒤 복구되는가를 따로 물었다. 앞 단계의 성공으로 뒤 단계의 답까지 채우면 코드에 없는 보장이 생긴다. 함수가 돌아왔다는 사실만으로 모든 장애를 통과한 것은 아니다.

이 글의 비교는 현재 소스에 명시한 호출과 시험의 범위다. 실제 장치 전원을 끊거나 모든 파일 시스템을 시험한 보고서가 아니다. 소스에 없는 디렉터리 동기화와 장애 복구 근거를 추정해서 추가하지 않았다. 독자가 적용하려면 먼저 어떤 장애까지 책임질 것인지 정하고 그 조건에 맞는 검사를 별도로 준비해야 한다.

버퍼 다운로드는 파일 동기화를 요청한다

saveDownloadBuffer는 배타 생성한 파일에 buffer를 쓰고 file.sync를 기다린 뒤 닫는다. 쓰기나 동기화가 실패하면 이번 경로를 정리하고 성공 반환을 하지 않는다. 호출을 기다리는 순서가 코드에 있다는 것은 확인할 수 있다. 파일 이름 충돌을 막는 wx와 내용 동기화를 요청하는 sync는 서로 다른 역할이다.

하지만 이 함수만으로 전원 장애 뒤 모든 결과가 살아남는다는 검증은 없다. 저장 디렉터리의 메타데이터와 장치·파일 시스템의 동작, 이후 이력 보관까지 같은 한 번의 호출로 확인했다고 하지 않는다. 실제 BrowserHost는 저장 뒤 문맥을 다시 검사하고 행을 추가하는 별도 순서를 갖는다. 파일 저장과 목록 저장도 한 몸이 아니다.

생성 첨부는 같은 sync 경로를 쓰지 않는다

createGeneratedAttachment는 공급된 바이트를 새 UUID 폴더에 wx로 쓰고 핸들 등록을 연결한다. 해당 함수에는 file.sync 호출이 없다. 이것을 보고 네이티브 다운로드 전체나 운영체제 내부가 어떤 동기화도 하지 않는다고 확대하지는 않는다. 내가 말할 수 있는 것은 이 함수가 명시적으로 확인하는 범위다.

생성 영수증의 이름·크기·해시는 바이트 생성과 등록을 설명한다. 전원 장애 검증 완료라는 필드는 아니다. 동기화 호출이 없는 경로와 있는 경로를 구별해 문서화하면 나중에 내구성을 강화할 때 어디에 새 요구와 시험을 넣어야 할지 보인다. 같은 자료가 목록에 보인다는 이유로 다른 구현의 보장을 가져오지 않았다.

영수증의 이름 변경과 두 문서의 교체도 다르다

SocialFileJournal은 임시파일을 wx로 열고 write·sync·close 뒤 문맥을 검사해 target으로 rename한다. 기존 글에서는 이 사이 실패했을 때 자기 임시파일만 정리하는 원칙을 다뤘다. 이번에는 그 함수가 어느 순서까지 기다렸는지와 전원 장애 시험의 근거가 있는지를 분리해서 읽는다.

스킬 store는 JSON과 Markdown 임시파일을 쓰고 두 번 rename하며 실패 때 이전 바이트를 되돌리는 별도 구조다. 두 파일이 존재한다는 사실을 두 교체가 하나의 전원 장애 트랜잭션으로 묶였다는 뜻으로 읽을 수는 없다. 이번에 읽은 범위에는 그런 보장을 검증한 근거가 없다. 관계 있는 파일은 성공 기준도 한 파일보다 더 구체적으로 정해야 한다.

시험 이름 대신 실제로 만든 장애를 적는다

기존 저널 시험은 쓰기 뒤 문맥 변경과 실제 rename 실패를 만든다. 버퍼 시험은 동시 생성과 기존 파일 보존을 확인한다. 둘 다 유용하지만 전원 차단을 만든 시험은 아니다. 오류 후 원본이 남는다는 관찰을 모든 종류의 중단에서 마지막 결과가 남는다고 바꾸지 않았다.

이번에는 소스와 시험을 검토했고 원래 프로그램의 전원 장애나 운영 저장을 실행하지 않았다. 공유 파일 영수증 예제도 power_loss_durability_verified를 항상 False로 둔다. 이미 공개한 임시파일 모듈은 정리와 보존을 실험하는 도구다. 여러 예제를 함께 보더라도 각 시험이 실제로 만든 조건 안에서만 완료를 읽는 기준을 남기고 싶었다.