본문 바로가기

잡담

Trac 문제 해결: unsupported file format

오늘 아주 황당한 일을 하나 겪었다. 얼마전 inureyes님이 TNF 서버의 패키지 업그레이드를 시행하신 뒤로 trac이 맛이 갔던 것이다. 화면에 보여지는 건 '500 Internal Server Error'였고, 로그에 보여지는 건 sqlite 백엔드에서 발생한 'OperationalError: unsupported file format' 에러였다.

우선 sqlite 및 pysqlite가 버전에 따라 파일 형식 호환이 잘 안 되는 경우가 많다는 것을 알고 있었기 때문에 몇 가지 확인을 하자 pysqlite 패키지 버전이 너무 낮았다. (그런데 왜 이전에는 잘 되었는지 모르겠다. -_-) trac.db 파일 자체는 sqlite 3.3.3 버전을 따르고 있었고, 관련 libsqlite3도 모두 같은 버전이었다. 그래서 우선 pysqlite 2.3.3 최신 버전을 받아서 직접 컴파일하고 설치했다.

trac에서 사용되는 모듈 버전을 확인한 결과, sqlite 3.3.3, pysqlite 2.3.3으로 완벽했다. 그런데도 계속 에러가 나고 있었다. -_-;;

오늘에서야 토끼군의 도움으로 원인을 찾아냈는데, PHP의 pdo_sqlite 모듈이 문제였다. mod_php, mod_python을 둘 다 사용하는 상태에서 pdo_sqlite가 3.2.8 버전이었고 이것이 충돌을 일으켰던 것이다. (하나의 아파치 프로세스에서 둘 다 불러서 사용하다보니 어느 한쪽만 사용된 것 같다.) 아파치 프로세스에 연결된 모듈들을 모두 뒤져보는 등의 삽질을 했을 때도 발견되지 않았는데, 직접 모듈 파일을 찾아서 strings 명령어로 버전 정보를 뒤져봤을 때야 알 수 있었다.

어쨌든 만악의 근원은 php라는 얘기를 하면서 마무리지을 수 있었다. 역시 inureyes님 말마따나 '배포용' 버전만 아니었더라면 태터툴즈도 php로 만들지 않았을 거라는 게 무슨 이야기인지 알 만하다. (솔직히 호환성 코드 + 프레임웍을 직접 짜가면서까지 개발하는 건 너무나 낭비가 심하다.)

참고 문서 : Trac Wiki - PySqlite (여기에서 Common oops 란을 보면 위 해결법이 있는데 그것은 내가 적어놓은 것이다.)

덧. 사실 php가 나쁜 언어는 아니다. 다만 보안 관련된 문제나 웹서버 환경을 타는 문제 등 구조적인 문제가 존재하는 것이 사실이고, 이번 문제는 php 자체 문제라기보다는 버전별 호환성이 지나치게 떨어지는 sqlite의 문제라고 보는 것이 맞을 것이다. 그런 점에서, php 6.0이 빨리 나왔으면 좋겠다. orz;