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

전쟁 이야기: root 이주

~10 min · root-migration, remake-not-remaster, fail-closed, writer-fencing

Level 0Lone Machine
0 XP0/37 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"모두가 서 있는 바닥을 옮기는 건 존재하는 제일 무서운 campaign 이야. 바닥을 remake 해서 하지, 제자리에서 편집해서 절대 안 해."

remake, 리마스터 말고

fleet 의 두 번째 큰 campaign 은 레거시 클라우드-provider root — 모든 프로젝트가 사는 폴더 — 를 retire 하고 보통 것으로 바꿨어. 유혹은 옛 데이터를 제자리에서 변환 하는 거야: 가능한 빨리 새 모양으로 mutate. 그게 리마스터고, 함정이야. 이주는 대신 root 를 현재 ground truth 에서 remake 했어: authoritative 호스트의 live 프로젝트가 유일 소스였고, 각 peer 의 active project tree 는 옛 바이트에서 변형이 아니라 거기서 새로 rebuild 됐어.

writer 가 destination 을 validate 하고 fail closed

cutover 가 시작하기도 전에, 더 좁은 guard 가 어디나 내려앉았어: 모든 local·cross-host writer 가 destination root 를 identity 로 validate 하고 틀리면 fail closed 해야 했어 — 옛 root 를 재생성하는 일 없이. 이 guard 는 데이터를 안 옮기고 authority 를 안 줬어. 그 일 전부는 진짜 이주가 아직 셋업되는 동안 stray 재부팅이나 백그라운드 sync 가 두 번째 split-brain root 를 조용히 못 낳게 하는 거였어.

가시성은 로컬 바이트가 아냐

클라우드 file provider 가 Finder 에 파일을 보여주는 게 바이트가 디스크에 있다는 뜻이 아냐. 그래서 complete copy 는 빈 placeholder 를 조용히 복사하느니 예상 못 한 dataless object 에 block 했어; 클라우드의 명랑한 여기 있어 는 증거로 절대 안 받았어. materialization 보다 가시성을 믿는 게 정확히 이주가 자신만만하고 빈 파일로 가득 찬 디렉토리로 끝나는 방식이야.

소스를 보존; 재생성된 옛 root 는 drift

원본 provider 랑 어떤 split-brain root 도 안 건드려진 채, 별도의 나중 cleanup campaign 을 위해 retained 로 남았어 — cutover 승인은 삭제를 명시적으로 안 포함했어. 그리고 이후에 어떤 stale writer 가 재생성해서 옛 root 가 다시 나타나면, 그건 audit 할 observed drift 로 기록됐지, 시스템이 기댈 fallback 으로 절대 아냐. 과거를 증거로 곁에 두고, 예상 못 한 귀환을 safety net 이 아니라 신호로 다뤄.

truth 에서 remake 하고, 모든 writer 를 fence 하고, 옛 바닥을 증거로 지켜. 바닥을 옮기는 제일 안전한 방법은 오늘 참인 걸로 새 걸 짓는 거고 — 그리고 뒤에서 아무것도 옛 걸 조용히 못 다시 짓게 확실히 하는 거야.

Code

fail closed; 옛 root 를 절대 재생성 안 함·python
def safe_write(path, data):
    dest_root = resolve_root(path)
    # destination 이 NEW 보통 root 인지 이름이 아니라 IDENTITY(lstat)로
    # validate. 없거나 틀리면, STOP -- 옛 걸 재생성하지 마.
    if not is_expected_root(dest_root):        # lstat 기반 identity 체크
        fail_closed(f"destination root 미검증: {dest_root}")
        return                                  # 데이터 안 옮김; split-brain 방지
    write(path, data)

# file provider 가 파일 보여주는 게 바이트가 로컬이란 증거가 아님:
if has_dataless_objects(source):
    block("예상 못 한 dataless object -- complete copy 진행 금지")

# 원본 provider / split-brain root 는 나중 cleanup campaign 위해 RETAINED.
# 재생성된 옛 root 는 audit 할 observed DRIFT, 기댈 fallback 이 절대 아냐.

External links

Exercise

여러 기계에 걸쳐 옛 base 폴더에서 새 것으로 전부 옮겨야 해. 이주를 제자리 변환이 아니라 remake 로 써: authoritative 소스, 각 writer 가 새 root 를 겨눈다는 걸 어떻게 증명하는지, 옛 root 가 다시 나타나면 뭐가 벌어지는지 이름 붙여. 그다음 옛 위치에서 뭘 얼마나 오래 지킬지 정해.
Hint
remake 버전은 옛 데이터를 절대 mutate 안 해 — authoritative 소스에서 새 tree 를 rebuild 하고 옛 걸 증거로 retained 로 둬. 다시 나타나는 옛 root 는 audit 할 drift 지 쓸 fallback 이 아니고; compatibility symlink 는 거부해야 할 정확한 편의야, 아직 고쳐야 할 reference 를 숨기니까.

Progress

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

댓글 0

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

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