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 프로세스)에 따라 실제 충돌 확률이
달라짐 — 별도 조사 필요.