~13 min · destructive-barrier, verify-before-delete, evidence
Level 0Finder 에서 헤매는 중
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"'복사가 돌아왔다' 는 바람이고 '목적지에 제대로 있다' 는 사실이야. 삭제를 허락할 수 있는 건 사실뿐이지."
앱 전체에서 제일 위험한 한 줄
볼륨을 넘는 이동에서 데이터를 영영 잃을 수 있는 줄은 딱 하나야. 원본을 지우는 줄. 나머지는 다 되살릴 수 있어. 복사가 실패하면 원본은 그대로고, 확인에서 걸리면 작업이 멈출 뿐이야. 그런데 원본 삭제는 되돌릴 수가 없고, 목적지 사본이 실은 멀쩡하지 않았다면 방금 유일한 완전본을 없앤 거야. Waygate 는 그 줄을 고비로 다뤄. 확실한 증거가 있어야 열리는 관문으로.
낙관 말고 증거
규칙은 딱딱해. 복사가 시작됐다고 원본을 지우지 않고, 복사 함수가 돌아왔다고도 지우지 않아. 오류 없이 돌아온 게 바이트가 다 있고 멀쩡하다는 증거는 아니거든. 지우기 전에 Waygate 는 증명을 손에 쥐어야 해. 목적지에 파일이 있고, 크기와 속성이 계획과 맞고, 진짜 이름으로 제자리에 있다는 것. 그 증거가 저널에 남아야 고비가 열려.
하필 그 고비에서 죽었을 때
재밌는 경우는 이거야. 목적지를 제자리로 옮긴 다음, 원본을 지우기 전에 앱이 죽어. 이제 디스크엔 사본이 둘 있어. 순진한 도구는 다시 켰을 때 이동이 끝났다고 보고 원본을 지우거나, 실패했다고 보고 목적지를 지울 수 있어. Waygate 는 둘 다 안 해. 저널이 그 고비를 안 넘었다고 적어뒀고, 복구가 양쪽을 확인하고, 신분 증거가 딱 떨어질 때만 이어가. 아니면 needsReview 에서 기다려. 사본이 둘인 건 안전한 상태야. 틀린 짐작이 위험한 거지.
원본 삭제는 따로 떼어낸 고비고, 증거가 있어야 열려. 복사가 시작됐다고도, 함수가 돌아왔다고도 원본을 안 지워. 지우기 전에 목적지가 제대로 있는지 확인해야 하고, 고비에서 죽으면 사본 둘을 남긴 채 딱 떨어지는 복구나 사람 검토로 가. 짐작은 없어.
파일이 사라지는 전형적인 순간. 파일 도구가 데이터를 없애는 제일 흔한 방식은, 목적지가 불완전한데 성공을 돌려준 복사를 믿고 원본을 지우는 거야. 잘려서 쓰인 파일, 조용히 실패한 SMB 밀어내기, 꽉 찼으면서 OK 라고 답한 디스크. '돌아왔다' 가 함정이고, 고비는 낙관을 확인으로 바꾸려고 있어.
Code
고비: 되돌릴 수 없는 단계 전에 증명부터·swift
func crossDestructiveBarrier(_ plan: OperationPlan,
staged: URL, published: URL) async throws {
// Gather POSITIVE evidence the destination is real and correct:
let dstVals = try published.resourceValues(forKeys: [.fileSizeKey,
.contentModificationDateKey])
guard dstVals.fileSize == plan.expectedMetadata.size,
try await bytesVerified(published, against: plan)
else {
throw OpError.destinationNotVerified // do NOT delete the source
}
try await journal.mark(plan.id, .verified, evidence: dstVals)
// ONLY NOW may the destructive barrier open:
try await deleteSource(plan.source)
try await journal.mark(plan.id, .committed)
}
// If the process dies before `.committed`, both copies exist and the
// journal says the barrier is incomplete -> recovery, never a blind delete.
고비에서 죽는 건 안전한 상태야·text
copy --> verify --> publish --| CRASH |--> delete source --> done
^
both copies exist here
naive tool on restart: 'probably finished' -> delete source (risky!)
'probably failed' -> delete dest (risky!)
Waygate on restart: journal says barrier INCOMPLETE ->
verify both sides. Deterministic? finish safely.
Uncertain? needsReview. Two copies never lose data.
볼륨을 넘는 이동의 순서를 그대로 적고 되돌릴 수 없는 단계 하나에 표시해봐. 그 앞의 단계마다 거기서 죽으면 복구가 뭘 하는지 적고(힌트: 대개 '잃은 것 없음'). 되돌릴 수 없는 단계에 대해선 실행 전에 저널에 뭐가 있어야 하는지 말해봐.
Hint
복사, 확인, 제자리 옮기기는 다 되살릴 수 있어. 거기서 죽어도 원본이 멀쩡하니 다시 하거나 임시본을 버리면 되지. 되돌릴 수 없는 건 원본 삭제 하나뿐이고, 그걸 막는 증거는 목적지 파일이 제 이름으로 있고 크기와 내용이 계획과 맞는다는 확인이야. 증거가 없으면 삭제도 없어.
Progress
Progress is local-only — sign in to sync across devices.