DEADLOCK DIAGNOSIS

wait-for graph와 데드락

상호배제, 점유대기, 비선점, 순환대기는 원인 조건이고, 실제 진단은 어떤 스레드가 어떤 락을 잡고 누구를 기다리는지 그래프로 닫힌 고리를 찾는 일이다.

01

덤프 수집

멈춘 시점의 스레드 상태, 보유 락, 대기 락을 함께 기록한다.

blocked/waiting 구분
02

소유자 연결

T1 holds L1, waits L2처럼 락 소유와 대기 관계를 간선으로 바꾼다.

wait-for edge
03

사이클 확인

T1→T2→T3→T1처럼 닫힌 고리가 생기면 데드락으로 본다.

cycle
04

정책 선택

락 순서 고정, try-lock timeout, victim abort, 자원 선점 가능화 중 하나로 끊는다.

break condition
상호배제
락 하나를 동시에 한 실행 흐름만 보유 mutex, row lock, 파일 잠금처럼 공유 불가능한 자원이 있을 때 성립한다.
읽기락은 예외 가능
점유대기
이미 잡은 락을 놓지 않고 다음 락을 기다림 트랜잭션이 row A를 잡고 row B를 기다리는 로그에서 보인다.
hold and wait
비선점
운영체제가 임의로 락을 빼앗지 못함 소유자가 unlock/commit/rollback 해야만 자원이 풀린다.
preemption 불가
순환대기
대기 관계가 닫힌 고리를 형성 wait-for graph에 cycle이 있어야 실제 데드락으로 확정한다.
핵심 증거

재발 방지

락 순서 모든 코드 경로에서 A→B→C 같은 전역 획득 순서를 지키게 한다.
타임아웃 무한 대기 대신 실패를 반환하고 상위 로직이 재시도/롤백하게 한다.
관측성 락 이름, 소유자, 대기 시간을 로그에 남겨 다음 장애 때 그래프를 바로 복원한다.