← 목록
기타 2026-07-24 4KB 읽기 4분

크라우니캔버스 원장.한선 P1 수리 — 사용자별 샤딩

개요

원장.한선(:9620 CRD 보상 원장)의 확증 P1 결함 근본 수리: 원장_잔액/원장_최신행/ 원장_사용자JSON/원장_재산정잔액이 전부 원장_전체행들()로 원장.psv 전체(전 사용자· 전체 기간)를 매 호출 읽어, 비용이 "해당 사용자 기록 수"가 아니라 "시스템 전체 누적 기록 수"에 선형 비례하던 문제. 근본원인은 crownyc 읽기() = STR_MAX_LEN(65536바이트) 캡 — 로그가 64KB를 넘으면 뒤쪽(최신 append)이 잘려 원장_잔액이 조용히 0(오답)을 반환(합성 50k/200k줄 파일로 실측 재현: 잔액 380→0).

무엇을 했는지

  • 사용자 문자열 → 파일명 안전 키(원장_안전키, [A-Za-z0-9] 통과·그 외 "~코드값~" 이스케이프,
"~"가 통과셋에 없어 충돌 없는 bijective 인코딩) + flat 샤드 파일 원장_사용자_<안전키>.psv(가드레일 원칙대로 서브디렉 아닌 flat).
  • 원장_사용자행들(사용자): 샤드가 있으면 샤드만 파싱(이 사용자 행만 담겨있어 필터 불필요),
없으면(마이그레이션 전) 레거시 원장.psv를 1회 필터링.
  • 원장_샤드확보(사용자): 최초 기입 시 레거시에서 그 사용자 행만 새 샤드로 이관 후, 이후
모든 기입은 샤드로만 감 — 레거시 원장.psv는 이 시점 이후 더 이상 자라지 않아 항구 유한.
  • 원장_최신행/원장_잔액/원장_재산정잔액/원장_사용자JSON을 전부 원장_사용자행들() 기반으로 교체.
  • _원장_기입이 전역 _원장파일 대신 원장_샤드확보(사용자)가 반환한 샤드에 덧쓰기.

검증(실측)

  • STRICT 재컴파일 0경고(원장.한선 단독 + 서버.한선 전체 결선).
  • 격리 셀프테스트(CANVAS_LEDGER_SELFTEST=1, 별도 데이터루트) PASS.
  • 스케일 증명 하니스: 타 사용자 50명×40건=2000건 시스템전체 트래픽 주입 후에도
target_user 3건 잔액 정확(380), 그 사용자 샤드 파일은 210바이트로 독립(타 사용자 전체 204KB와 무관) — "시스템 전체 기록 수 무관, 자기 기록 수만 비례" 주장 실증.
  • 경계조건 확인(투명 보고): 이미 64KB↑로 불어난 레거시 파일에 배포하는 극단 시나리오는
최초 마이그레이션 자체도 같은 읽기() 캡에 걸려 과거 이력을 못 건짐(잔액 0) — 단, 실제 라이브 /Users/ef/crowny-canvas/데이터/원장.psv는 배포 시점 1334바이트(19줄)로 이 캡에 전혀 못 미쳐 라이브에는 해당 없음. 이후로도 신규 기입이 전부 샤드로 가므로 이 레거시 파일 크기는 앞으로도 늘지 않음(영구 안전).
  • 라이브 재배포: 서버.한선(원장.한선 import) STRICT 재컴파일 → /Users/ef/crowny-canvas/서버.toau
교체(구버전 서버.toau.bak_predeploy로 보존) → launchctl kickstart -k gui/$(id -u)/org.crowny.canvas → PID 안정화 확인(24s+ 무재시작) → 실 API 확인: curl .../api/원장?사용자=guest 12건 기입·누적잔액 1200 정확 반환. 레거시 원장.psv는 배포 전후 diff 동일(무변경) 확인.

관련 파일

  • /Users/ef/crowny-canvas/한선씨/원장.한선 (수리 본체)
  • /Users/ef/crowny-canvas/서버.toau (재배포본), /Users/ef/crowny-canvas/서버.toau.bak_predeploy (롤백용 보존)
  • /Users/ef/crowny-canvas/데이터/원장.psv (레거시, 배포 시점 이후 동결 확인)
  • 재현/검증 스크립트: 세션 스크래치패드 ledgertest/(harness_scale.한선·harness_boundary.한선 등, 휘발성)

잔여 이슈

  • 극단 경계조건(레거시 파일이 배포 전에 이미 64KB↑인 경우 최초 마이그레이션 누락)은
문서화된 한계 — 현재 라이브 데이터는 해당 없음. 향후 다른 환경에 이 패턴을 재사용할 때는 배포 전 레거시 파일 크기를 반드시 확인할 것.
  • 단일 사용자가 극단적으로 활발해 자기 샤드 자체가 64KB를 넘는 경우는 같은 실패군의
더 작은 잔여 위험(별도 후속 과제, 이번 확증 결함 범위 밖).
  • 동일 파일에 병행 세션이 원장_적립상세/원장_기존적립있나(P0 중복적립 방지) 추가 — 본 수리와
결선 확인 완료(원장_기존적립있나가 원장_사용자행들 재사용, 충돌 없음).