← 목록
기타 2026-07-29 3KB 읽기 2분

T27 — 미션장부.한선 ID카운터 동시성 실측

개요

집사회 티켓 T27: 두 crownyc 프로세스가 같은 미션장부(티켓.psv) 사본에 동시에 티켓생성()을 호출할 때 티켓ID 충돌이 실제로 발생하는지 실측.

결과 — 충돌 확인 (100% 재현)

격리 사본(라이브 /Users/ef/crowny-deacon/data 무접촉)에서 두 프로세스 A·B를 동시에 기동해 각각 20개씩 티켓생성() 호출 → T1~T20 전부 정확히 2회씩 중복 (합계 40행, 유니크 ID는 20개뿐). 부분충돌이 아니라 전량충돌.

원인

미션장부.한선_티켓카운터는 프로세스 기동 시 1회 _최대ID번호(_티켓파일, "T")로 파일을 스캔해 메모리 변수로 굳힌다. 이후 다음티켓ID()는 파일을 다시 보지 않고 메모리 카운터만 +1한다. crownyc는 명령 1회당 새 프로세스 기동이므로, 두 프로세스가 겹치는 시간창에 기동하면 둘 다 같은 파일 스냅샷에서 카운터를 복원 → 같은 ID 시퀀스(T1..T20)를 독립적으로 생성. 파일쓰기는 덧쓰기()(append-only)라 두 세트 모두 파일에 남지만, _최신행찾기(latest-wins by append order)가 나중에 쓰인 쪽만 "진짜"로 인식 → 먼저 쓴 프로세스의 티켓 데이터가 조용히 유령화됨(조회 시 사라짐, 하지만 여전히 디스크에는 남아 장부를 오염시킴).

재현 방법

bash/private/tmp/.../scratchpad/T27_동시성/재현.sh
  • 드라이버A.한선/드라이버B.한선: 미션장부.한선을 가져와 각각 20개
티켓생성() 호출 (데이터루트를 격리 사본으로 패치)
  • crownyc run A.toau / B.toau를 백그라운드로 동시 기동, wait 후 티켓.psv의
ID 중복 카운트

관련 파일

  • 원본: /Users/ef/crowny-deacon/한선씨/미션장부.한선
  • 격리 사본/재현: /private/tmp/claude-501/-Users-ef/2013923d-e997-42d7-a6e8-cac6215717b5/scratchpad/T27_동시성/
  • 한선씨/미션장부.한선 (데이터루트만 격리 경로로 패치, 로직 무변경)
  • 드라이버A.한선, 드라이버B.한선, 재현.sh
  • 잔여 이슈 (수리는 T27 범위 밖 — 실측만 지시됨)

    • 수리 방향 후보: (1) 파일락(flock 상당) 기반 원자적 read-modify-write,
    (2) ID를 카운터가 아닌 UUID/timestamp+PID 조합으로 변경(중복 자체 불가), (3) 단일 프로세스 상주(집사서버.한선이 이미 떠있다면 그 안에서만 티켓생성 처리하고 crownyc 단발 프로세스 경유 금지).
    • 실사용 노출도: 집사회.sh/집사서버.한선이 티켓생성을 어떤 경로로 호출하는지
    (상주 서버 경유 vs 매번 신규 crownyc 프로세스)에 따라 실제 충돌 확률이 달라짐 — 별도 조사 필요.