행인로 개인 작업실

끝났다고 거짓말하지 않는 전송 도구

내장 디스크와 외장 SSD, 네트워크 저장소 사이로 파일을 옮길 일이 잦다. 그래서 그 일을 안전하게 해주는 작은 도구를 만들었다. 빠른 도구가 아니라 안전한 도구가 목표였고, 시작할 때 규칙을 하나 못 박았다 — 이 도구는 복사만 한다. 옮기지 않고, 지우지 않는다. 복사가 성공했다고 아무리 확신이 서도 원본에는 손대지 않는다. 신뢰는 파일 하나하나에 대해 따로 얻는 것이지, 미리 깔고 들어가는 게 아니다.

첫 버전은 의도적으로 읽기 전용이었다. 어디에도 단 1바이트를 쓰기 전에, 실제 폴더를 훑고 파일마다 지문(해시)을 떠서 본 것을 보고만 했다 — 장치 상태, 파일 개수, 대략의 분류. 그게 제대로 동작한 다음에야 복사를 시작했고, 복사한 뒤에는 매번 원본과 사본을 독립적으로 다시 읽어 체크섬을 맞춰봤다. 바이트 단위로 스스로를 증명하지 못한 복사는 완료로 치지 않는다.

”안전하다”가 실제로 견뎌야 했던 것

진짜 시험은 중단이었다. 네트워크 저장소로 보내는 큰 전송은 충분히 느려서, 언젠가는 무언가가 그것을 끊는다 — 프로세스 재시작, 연결 끊김, 재부팅. 그래서 이어받기 가능한 절차를 만들었다. 64MiB마다 한 덩어리를 쓰고, 디스크에 밀어 넣고, 다시 읽고, 해시를 확인하고, 그 다음에야 로컬 데이터베이스에 체크포인트를 남긴다. 체크포인트 이전은 믿고, 그 이후는 믿지 않는다.

그리고 제대로 시험했다. 네트워크 저장소로 가는 10GiB 전송을 40% 지점에서 일부러 죽였다. 멈춘 작업을 재개한 게 아니라 대시보드 프로세스 자체를 통째로 내렸다가 다시 올린 뒤 이어가라고 시켰다. 도구는 마지막으로 검증된 체크포인트를 찾아냈고, 중단 이후 원본 파일의 크기·수정 시각·신원이 그대로인지 확인한 뒤, 정확히 그 바이트 위치부터 다시 쓰기 시작했다. 남은 60%를 마치고 파일 전체에 체크섬을 돌렸고, 결과는 원본과 정확히 일치했다.

이어받기는 원본이 처음 그 파일과 같다는 게 증명될 때만 작동한다. 크기·시각·장치 신원 중 하나라도 어긋나면 도구는 이어받기를 거부하고 처음부터 다시 검증하게 만든다. 그 거부가 핵심이다 — 엉뚱한 데이터 위로 이어 붙는 이어받기는, 그냥 실패하는 것보다 나쁘다.

아직 하지 않는 것

이동도, 삭제도, 기존 파일 덮어쓰기도 넣지 않았다. 어려워서가 아니다. 데이터를 조용히 망가뜨릴 수 있는 전송 도구는, 기껏해야 시간을 조용히 낭비하는 도구와는 아예 다른 종류의 물건이기 때문이다. 이동과 “죽었다 살아난 뒤의 복구”가 같은 수준의 의도적 학대를 버텨낸 다음에야 그 경계를 옮길 생각이다. 조심스럽게, 한 번에 하나씩.