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

전부-아니면-전무 허구 없음

~11 min · no-atomic-fiction, per-item-evidence, honesty

Level 0Finder 에서 길 잃음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"볼륨 넘어 이백 개 파일을 원자적으로 옮길 수 없어. 그럴 수 있는 척이 최악의 순간에 사용자한테 거짓말하는 방식이야."

여러 항목 오퍼레이션이 가질 수 없는 원자성

단일 같은 볼륨 이름변경은 원자적일 수 있어. 네트워크 공유 넘어 이백 개 파일 복사는 못 해 — 물리적으로, 진짜 시간에 걸쳐 하나씩 벌어지고, 시간은 중단 가능해. 그래서 항목 137이 실패하면 앱은 선택해: 진실을 말하기 (136개 끝났고, 하나 실패했고, 나머지 대기) 아니면 위안 주는 허구를 말하기 (전부 롤백해서 아무 일 없던 것처럼 보이게). Waygate 는 항상 진실을 말해, 허구가 데이터를 잃는 곳이니까.

롤백 허구가 왜 위험한가

200개 항목 이동을 원자적으로 제시하려면, 137에서의 실패가 정당하게, 검증 가능하게 목적지에 도착한 136개 파일을 un-move 하라고 강요해 — 환상을 유지하려고 진짜, 올바른 파일을 다시 지우고 다시 복사. 그 되돌림 하나하나가 자기가 실패하거나 충돌할 수 있는 새 파일 오퍼레이션이야. 첫 136개가 안 벌어진 척하려고 136개의 더 위험한 변형을 하는 거야. '깨끗한' 롤백이 정직한 부분 상태보다 위험해.

Waygate 가 대신 하는 것

끝난 항목은 끝난 채 남아, 각자 자기 저널 증거를 가지고. 오퍼레이션은 영향받은 항목 전에 멈춰 — 앞서 건너뛰지도, 롤백하지도 않아. 사용자는 정확히 뭐가 끝났고, 뭐가 멈췄고, 뭐가 남았는지 보고, 나머지는 현재 현실에 대해 다시 계획될 수 있어. 여러 항목 오퍼레이션은 단일 마법 트랜잭션이 아니라 개별적으로 저널된 단계의 순서고, 그것에 대한 정직함이 안전 기능이야.

여러 항목 오퍼레이션은 절대 전역 원자적으로 제시 안 돼. 모든 항목 전이가 저널되고, 끝난 항목은 끝난 채 남고, 불확실함은 남은 플랜을 검토를 위해 멈춰. 전부-아니면-전무 흉내는 검증된 작업을 되돌린다는 뜻이야 — 환상을 지탱하려는 더 위험한 변형 — 그래서 Waygate 는 대신 진짜 부분 상태를 보고해.
이건 받아들이는 데 좀 걸렸어. 내 본능은 반쯤 끝난 배치가 '지저분' 하고 깨끗한 롤백이 '프로' 라는 거였어. 아빠가 뒤집었어: 롤백이 아마추어 수야, 기분을 지키려고 더 파괴적인 작업을 하니까. 프로 수는 정직한 장부야 — 여기 끝난 거, 여기 멈춘 곳, 여기 남은 거. 부분 실패에 대해 진실을 말하는 파일 매니저가 원자성이란 거짓말 뒤에 그걸 숨기는 것보다 값져.

Code

항목별 저널; 문제에서 멈추고, 끝난 건 지킴·swift
func runMultiItem(_ plan: OperationPlan) async throws -> BatchOutcome {
    var done: [ItemResult] = []
    for item in plan.items {
        do {
            let result = try await engine.runItem(item, plan)
            try await journal.mark(plan.id, .itemCommitted(item.id), evidence: result)
            done.append(result)                     // completed STAYS completed
        } catch {
            try await journal.mark(plan.id, .stoppedAt(item.id), error: error)
            // Do NOT roll back `done`. Do NOT skip ahead. STOP and report:
            return BatchOutcome(completed: done, stoppedAt: item, remaining: plan.after(item))
        }
    }
    return BatchOutcome(completed: done, stoppedAt: nil, remaining: [])
}

External links

Exercise

도구가 파일 500개를 옮기다 목적지 디스크가 꽉 차서 300에서 실패해. 두 설계를 비교해: (A) 끝난 299개 이동을 롤백해서 원자적으로 보이게; (B) 299개 지키고, 멈추고, 보고. 각각에 대해, 실패 뒤 몇 개의 추가 파일 오퍼레이션이 돌고, 데이터를 잃을 새 기회가 몇 개인지 세어봐. 어느 게 실제로 더 안전해?
Hint
설계 A 는 299개 되돌림을 돌려 — 멀쩡했던 파일을 다시 지우고 복원 — 각자 이미 꽉 찬 디스크에서 실패할 수 있는 새 오퍼레이션, 잠재적으로 되돌림 도중 파일을 좌초시킴. 설계 B 는 추가 변형 0: 그냥 진실을 기록해. B 가 더 안전한 건 정확히 검증된 작업에 아무것도 안 하는 게 그걸 망칠 수 없어서야. 정직함이 더 적은 움직이는 부품이야.

Progress

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

댓글 0

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

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