manywaypark's Blog
개발, 검색, 함수

sqlite3 backend로 clsql을 쓸때 다음과 같은 에러가 나는 경우가 있다.
"Error 21 / library routine called out of sequence"
기본적으로 라이브러리를 잘못 사용하고 있다는 말인데, 현재 상황에 비추어 검색한 결과 thread safe 문제인듯했다. 아래 참고 링크에서 SQLite 사이트의 FAQ를 인용해 놓은 것을 보면,
It is never safe to use the same sqlite3 structure pointer in two or more threads.
라고 되어 있으나 현재의 FAQ에서는 찾아 볼 수 없다 (FAQ.6에 비슷한 말이 나온다. sqlite 3.3.1이전 버전은 sqlite3 structure를 같은 thread에서만 열어야하며 thread safe를 위해서는 3.3.1 이후 버전을 SQLITE_THREADSAFE = 1로 설정하고 컴파일을 해야만한다. 아쉽게도 dapper에 깔리는 sqlite3는 버전이 3.2.8-1ubuntu1로 좀 낮다).
개발 중인 프로그램이 multithread인데 이전 버전들(sbcl 1:0.9.14.0-2 + cl-sql 3.6.3-1 on edgy)의 조합에서는 나타나지 않던 문제였으나 얼마전 내가 만든 backport들 (sbcl 1.0 + cl-sql 3.7.8 on dapper)의 조합에서는 나타났다.

DB 연결부분을 다음과 같이 기존 연결이 있을 때는 경고를 내고 그것을 재사용하도록 한 것이 문제일 수도 있겠지만, 문제의 여지를 남겨두기 싫어서 필요할 때마다 연결하고 끊는 매크로를 사용하고, thread간에는 mutex를 사용해서 동기화 해버렸다.
(clsql:connect (list *db-file*) :database-type +DB-TYPE+ :if-exists :warn-old)

(기존 연결 재사용은  thread safe 버전의 sqlite3를 사용하면 간단히 해결될 수도 있을 것같다.)

참고:
http://trac.edgewall.org/ticket/2196

happy hackin'

TAG , ,

댓글을 달아 주세요

분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 받은 트랙백

01-25 22:11