처음 테스트 할 때에는 분명 windows건 linux건 mysql서버가 다운되면 mysql_ping과 insert query가 약 15초 정도 멈춘 후 프로세스가 다시 정상적으로 진행됐었는데...
오늘 linux에서 타이머를 테스트 하려고 하니 15분간 멈춰 있었다...;;

덕분에 하루종일 인터넷을 검색했다.

키워드로 검색되는 거의 모든 페이지를 본 듯하다.. 하지만 해결을 하지 못했다.


windows에서는 간단히 

mysql_option(..., MYSQL_OPT_READ_TIMEOUT, ...);
mysql_option(..., MYSQL_OPT_WRITE_TIMEOUT, ...);

두개만 설정하면 된다.


하지만 linux에서는 저 방법도 안되고.. 꼼수로 CONNECT_TIMEOUT을 설정한 후 쿼리 전에 항상 재접속을 하는 방법을 해봤는데.. 뭐.. 역시나 안된다..(아마 insert query를 하면서 멈추지 않았을까 생각된다... 아니면 조건을 잘 못 했다거나 ;;)
된다고 해도 이 방법을 쓰면 안되겠지만;;


결국 mysql 소스를 이리저리 까뒤집어서 socket에 option을 설정하는 것으로 해결했다.

소켓이 생성되는 시기는 connect류의 함수가 호출되는 시기이므로 connect함수가 호출 된 후 설정하였다.

struct timeval tv;
tv.tv_sec = 1;
setsockopt(obj->net.fd, SOL_SOCKET, SO_SNDTIMEO,(struct timeval *)&tv,sizeof(struct timeval));
setsockopt(obj->net.fd, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval));


대충 10여회 테스트 한 결과 아무리 오래 걸려도 1분은 걸리지 않았는데.. 이번엔 처음보는 에러가 나온다. 에러번호는  2013인데 에러 내용이 달라졌다..

2013, Lost connection to MySQL server at 'reading initial communication packet', system error: 111

음 -_-;;

일단 예상은... timeout 시간을 설정함으로써 DB와 연결이 되지 않으니 접속 권한이 없는것으로 판단되어 나타나는 에러 같은데...


약 10여회 테스트 결과는 정상 동작했다.

'develop > linux' 카테고리의 다른 글

sqlite 동시 접근시 에러??  (0) 2012.08.11
spin_lock, spin_lock_irq, spin_lock_bh  (0) 2012.06.28
ssh 접속시 증명서 변경됐다고 나올 때  (0) 2012.05.31
ubuntu 기본 설정  (0) 2012.05.30
segment fault 지점 찾기  (0) 2012.04.06

+ Recent posts