본문 바로가기
C.W.K.
Stream
Lesson 05 of 05 · published

offline 은 gone 이랑 다르다

~12 min · source-immutable, offline, error-handling, resilience

Level 0릴 입문자
0 XP0/39 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"offline SMB 경로는 macOS/cwkWaygate 가 명시적으로 마운트할 때까지 offline 인 채 있어. Ashen Reel 은 offline 경로를 보고하고 기다려."

'못 찾겠어' 의 아주 다른 두 종류

NAS 영상이 못 열리는 이유는 완전히 다른 두 가지일 수 있고, 그걸 헷갈리는 게 플레이어가 조용히 진실을 파괴하는 방식이야. 공유가 지금 마운트가 안 됐거나. 파일은 멀쩡한데 그냥 일시적으로 못 닿는 거지. 아니면 파일이 해석된, 마운트된 경로에 진짜로 더 이상 없거나. 첫 번째가 offline 이고, 두 번째가 missing 이야. 둘은 반대 반응을 요구하는데, 게으른 fileExists() 검사는 둘 다 '없어짐' 이라고 불러.

Ashen Reel 은 둘을 합치기를 거부해. 마운트 안 된 공유는 offline 결과를 내. 요청은 보이게 남고, 아무것도 안 다시 쓰이고, 플레이어는 기다려. 마운트되고 닿을 수 있는 루트에서 없는 파일만 missing 이고. 그리고 그때조차 Ashen Reel 은 Recall 기록을 다시 쓰러 안 가. offline 은 '나중에 다시 와' 지, 절대 '기억을 삭제해' 가 아니거든.

일시적으로-못-닿음이랑 영구적으로-없어짐을 구분하고, 일시적 실패에 진실을 절대 파괴하지 마. 네트워크 딸꾹질, 마운트 안 된 드라이브, 서비스 재시작. 이런 건 순간이지 판결이 아니야. 일시적 실패에 영구적인 것처럼 반응하는 게, 시스템이 자기 데이터를 먹어치우는 방식이야.

구분은 enum 하나랑 정직한 분류기 하나면 돼.

Ashen Reel 은 네트워크 자격증명을 하나도 안 갖고 아무것도 안 마운트해. 공유가 offline 일 때, 플레이어는 저장된 자격증명으로 자동 마운트 안 해. 설계상 자격증명 자체가 하나도 없거든. 마운팅은 macOS 랑 파일 워크벤치 일이야. SMB 비밀번호를 조용히 저장하고 자기가 공유를 마운트하는 플레이어는, 경계가 애초에 피하려고 그은 보안·소유권 문제를 통째로 다시 여는 거고.

왜 이게 아카이브를 지키나

대안을 상상해봐. 백업 도는 동안 공유가 10초 offline 으로 깜빡했어. 부주의한 플레이어가 fileExists() == false 를 보고 영상이 없어졌다 결론 내고, '도움되게' Recall 경로를 다시 쓰거나 기록을 missing 으로 표시해. 공유가 돌아와. 이제 아카이브의 기억이, 커피 한 모금보다 짧게 지속된 일시적 네트워크 이벤트에 손상된 거야. offline 을 판결이 아니라 참을성 있는 기다림으로 취급하니까, Ashen Reel 은 나쁜 10초가 진실에 영구적 흉터가 절대 못 되게 막아. 일시적 실패 앞에서의 절제가, 대체 불가능한 걸 대체 불가능하게 지키는 법이야.

Code

offline 과 missing 은 반대 반응을 가진 다른 결과야·swift
enum OpenOutcome {
    case opened
    case offline(path: String)   // share not mounted -> WAIT, touch nothing
    case missing(path: String)   // mounted + reachable, but the file truly isn't there
}

func classify(_ path: String, rootMounted: Bool) -> OpenOutcome {
    guard rootMounted else { return .offline(path: path) }   // unreachable != gone
    guard FileManager.default.fileExists(atPath: path) else {
        return .missing(path: path)                          // genuinely absent
    }
    return .opened
}

// .offline NEVER rewrites the path, NEVER auto-mounts, and NEVER tells Recall
// the video is missing. It waits for macOS / the file workbench to mount the
// share, then retries. A ten-second outage can't scar the archive's memory.

External links

Exercise

네 시스템에서 실패에 반응해서 durable 상태를 바꾸는 에러 경로를 찾아. 레코드 삭제, 뭔가 무효 표시, 참조 다시 쓰기 같은 거. 물어봐. 그 실패가 일시적일 수 있어? 타임아웃, offline 의존성, 재시작 같은 거. 그러면 일시적 깜빡임에 진실을 파괴하고 있을 수 있어. 결과를 '일시적으로 못 닿음'(기다리고 재시도, 아무것도 안 건드림)이랑 '진짜 없어짐'(강한 증거에서만 행동)으로 쪼개.
Hint
위험한 모양은 '실패하면 durable 상태를 바꿈' 이야. 그런 자리마다 물어봐. 이 실패가 10초 뒤 저절로 풀리면? 그때 그 변형이 틀리고 되돌리기 어렵다면, 일시적이랑 영구적을 합쳐버린 거야. 영구적이고 증거가 탄탄한 결론만 진실을 바꿔도 돼.

Progress

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

댓글 0

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

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