엄한 곳에서 뒤통수 얻어 맞기

지난 주에 있었던 일.

지난 주 후반 부에 나와 동료 한 명이 같이 작성하던 서버를 부하 테스트했다. 근데 특정 시나리오에서 서버코드가 dead-lock 걸리는 걸 발견. Q/A 세션이 얼마 안 남은 상태라 미리 발견한 걸 다행이라고 생각하면서 디버깅.

반복 가능한 부하 테스트 + dead-lock 발생한 상태의 스택이 워낙 결정적인 힌트라 쉽게 잡았다. 서버가 쓰는 라이브러리 코드의 특정 클래스에서 lock 잡는 방식에 문제가 있던 것. 그냥 아주 고전적인 dead-lock 상황.

  • 스레드 A: 소켓 a의 lock을 잡은 채로, 객체 b의 lock을 잡는 메서드 호출
  • 스레드 B: 객체 b의 lock을 잡은 채로, 객체 a의 lock을 잡는 메서드 호출

A 쪽에선 소켓 a를 업데이트하고 lock을 내려 놓은 후 객체 b의 lock을 잡으면 되는 상황이라, 간단히 해결하고 다시 빌드. 그리고 다시 테스트 시작…

?!

어째서인지 또 dead-lock 발생. 심지어 스택 트레이스도 동일; 그냥 빌드 문젠가 하고 전체 다시 빌드.

다시 문제 발생; 상황은 동일.

 

원인을 발견하는데 좀 시간이 걸렸는데, 약간 어이없기도 하고;

결국엔 전체 라이브러리의 svn 사용하는 구조 + VS 2005->2010 컨버전(…이 만든 걸로 추정)이 만들어낸 가짜 의존성 문제.

전체 라이브러리는 다음과 같았다. dead-lock 의 직접적인 원인이 libB 다.

repository structure

추가로 문제를 발생시킨 부분이 libA. libA가 svn:externals로 libB를 밑에 가지고 있다. 그렇지만 libB는 복수의 프로젝트로 쪼개져 있고, 서버에서 쓰는 건 그 중 libB 의존성이 없는 일부. 근데 그 부분이 어째서인지 libA에 의존성이 있어서 – 실제로 코드를 호출하거나 하진 않음… – 자기 하위 디렉터리에 있는 libA를 링크하고 있더라;

그리고 이건 수정된 버전이 아닌 거고, 이걸 먼저 링크해서 수정된(@rev101) LibB는 링크되고 있지 않더라 Orz. 링커와 프로젝트 의존성 설정을 고치고 나니 수정된 libB가 링크돼서 문제는 사라졌음;

요약:

  • svn:externals 문제
  • VS 2005/2008 –> 2010 넘어가면서 바뀐 프로젝트 (및 링커) 의존성 설정 제대로 체크 안 한 문제
  • 디버거가 소스 코드를 제대로 못 찾을 때 별다른 의심을 안 한 문제

하여튼 확인하고 나니 별거 아니었고; 엄한 데서 시간 잡아 먹었다 Orz

Published by

rein

나는 ...

2 thoughts on “엄한 곳에서 뒤통수 얻어 맞기”

  1. 오 이거 제가 정리해서 올리려 했는데 형이 먼저 정리해서 올려주셨군요. 굳!

Leave a Reply