C.W.K.
Stream
Lesson 04 of 05 · published

부분 복사는 절대 목적지가 아냐

~12 min · pause-cancel, partial, cleanup

Level 0Finder 에서 길 잃음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"취소는 '세계를 undo' 가 아냐. '깨끗이 멈추고, 확실히 내 거라고 아는 것만 치운다' 야."

일시정지랑 취소는 협조적이야

긴 복사는 중단 가능해야 해 — 사용자가 일시정지하거나 취소할 수 있어야 해. 근데 중단이 아무 순간에 벌어지면 오퍼레이션을 알 수 없는 상태로 남겨. Waygate 는 일시정지랑 취소를 협조적으로 만들어: 엔진이 일시정지/취소 요청을 안전한 체크포인트에서만 확인해 — 여러 항목 복사에서 파일 사이, 큰 전송에서 청크 사이. 그 지점에선 상태가 알려졌고 저널이 일관되니, 멈추는 게 깨끗해.

부분 스테이지는 절대 승격 안 돼

이 레슨이 지키는 핵심 규칙: 부분 스테이지는 절대 목적지로 제시 안 돼. 복사를 도중에 취소하면, 반쯤 쓰인 스테이징 항목은 진짜 이름으로 publish 안 돼 — publish 는 완전한 검증 뒤에만 벌어지고, 취소된 복사는 거기 절대 도달 안 해. 사용자는 오퍼레이션이 멈추는 걸 봐; 목적지 이름을 입은 잘린 파일은 절대 안 봐. 취소는 공개 전에 길을 멈춰, 그래서 분장이 절대 안 벗겨져.

정리는 자기 것만 치워

오퍼레이션이 취소되면 정리할 수 있어 — 근데 확실히 소유하는 아티팩트(자기 스테이징 항목)만, 그리고 불확실함이 없을 때만. .waygate-stage-op_7a3f 는 저널이 그 항목이 이 오퍼레이션 거고 오퍼레이션이 안 끝났다고 증명하니까 지워. 자기가 만들었다고 증명 못 하는 건 아무것도 안 건드려. 모호함은 두고 표시하라는 뜻이지, 절대 추측성 삭제가 아냐. 디렉토리 복사는 메인 스레드 밖에서 경계 지어진 게으른 작업 그래프를 짓고, 진행이 바이트·항목·현재 항목·불확정 작업을 정직하게 나눠 — 그래서 일시정지가 항상 엔진이 이해하는 곳에 떨어져.

일시정지랑 취소는 협조적이고; 부분 스테이지는 절대 publish 안 되고, 정리는 불확실함 없이 확실히 소유한 아티팩트만 건드려. 멈춤은 상태가 알려진 안전한 체크포인트에서 벌어져. 취소된 복사는 저널이 소유하는 명백히 불완전한 스테이징 항목을 남겨 — 진짜 목적지 이름의 잘린 파일이 절대 아냐.
정직한 진행은 UX 만이 아니라 안전 기능이야. 복사된 바이트, 끝난 항목, 현재 항목, 불확정 작업을 구분하는 건 더 예쁜 진행 바 얘기만이 아냐. 일시정지가 진짜 체크포인트에 떨어지게 하고 복구가 오퍼레이션이 정확히 얼마나 갔는지 추론하게 하는 거야. 가짜 퍼센트 하나가 엔진이 안전하게 멈추는 데 필요한 바로 그 정보를 숨겨.

Code

협조적 체크포인트; 저널이 우리 거라 증명한 것만 정리·swift
func copyItems(_ items: [URL], _ plan: OperationPlan) async throws {
    for (i, item) in items.enumerated() {
        try Task.checkCancellation()          // safe checkpoint: BETWEEN items
        if await controls.isPaused { await controls.waitUntilResumed() }
        let staged = try await copyOne(item, plan)
        try await journal.mark(plan.id, .itemStaged(i), evidence: staged)
    }
}

func onCancel(_ plan: OperationPlan) async throws {
    // Delete ONLY staging items the journal proves belong to this op:
    for artifact in journal.ownedStagingArtifacts(plan.id) {
        if journal.isUnambiguouslyOwned(artifact) {
            try? FileManager.default.removeItem(at: artifact)
        } // else: leave it, flag it -- never a speculative delete
    }
}

External links

Exercise

사용자가 파일 100개를 네트워크 공유로 복사하고 파일 40번에서 취소해. 올바른 최종 상태를 묘사해: 목적지에 뭐가 있고, 스테이징에 뭐가 있고, 뭐가 정리됐고, 저널이 뭐라 말해? 그다음 왜 '취소 = 전부 undo' 가 여기서 놀랍고 안전하지 않을지 설명해봐.
Hint
올바른 최종 상태: 파일 1-39 는 검증되고 목적지에 publish 됐고 거기 남아; 파일 40 의 스테이징 항목은 정리됨(저널이 우리 거고 불완전하다고 증명); 파일 41-100 은 시작도 안 함. '전부 undo' 는 정당하게 도착한 39개 파일을 다시 지워야 해 — 사용자한테 놀랍고 엉뚱한 걸 지울 새 기회. 취소는 멈추지, 검증된 작업을 되돌리지 않아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.