[CBRD-26062] Add SIGUSR1-triggered memory dump of logwr_Gl (copylogdb) and la_Info (applylogdb)
http://jira.cubrid.org/browse/CBRD-26062
Purpose
복제 진행 사항에 대해 db_ha_apply_info 카탈로그나 applyinfo 유틸리티를 이용해 확인할 수 있으나 이 정보는 copylogdb나 applylogdb의 실시간 정보가 아니다.
두 프로세스가 운영 환경에서 비정상 동작을 할 때 각 프로세스 내부에서 어떤 LSA를 처리 중인지, 로그 메타 정보는 무엇인지 확인하여 보다 효과적으로 원인 파악을 수행하기 위한 코드이다.
특히, copylogdb의 logwr_Gl, applylogdb의 la_Info 전역변수의 정보를 통해 행이 걸린 원인, 복제 지연 사유 등을 보다 정확하게 진단할 수 있을 것이라고 판단된다.
Implementation
copylogdb, applylogdb가 SIGUSR1 시그널 받을 시 메모리 정보 출력
- copylogdb
- logwr_Gl 출력
- applylogdb
- la_Info 출력
Remarks
함수 별로 커밋을 나눠놓았습니다. Files changed로 전체 코드를 한 눈에 보기 힘드시기 때문에 Commit 별로 코드를 보시면 리뷰하시는데 도움이 되실 것 같습니다.
SIGUSR1,2로 프로세스의 상태를 확인할 수 있다면 좋겠다고 생각했는데, 마침 구현해주셔서 감사합니다! 좋은 방법입니다!
signal은 timing을 예측할 수 없으므로 async signal safe 함수들을 사용하셔야 할 것 같습니다.
printf는 버전에 따라 내부 구현이 다르므로 전역 변수 의존성을 가지는 지, malloc 등의 할당을 호출하는 지 알 수 없습니다. printf를 처리하던 도중 들어온 signal handler에서 printf를 다시 호출할 경우 buffer가 꼬일 수 있습니다. 또 malloc을 처리하던 도중에 handler에서 malloc을 호출할경우 mutex 경합으로 인해 멈출 수 있습니다.
실제 구현 상 위험할지는 모르겠으나 현재 printf family (printf, sprintf, dprintf)는 async signal safe를 보장하지 않으므로 버퍼가 따로 없는 write 등의 저수준 출력으로 교체하시는 게 좋을 것 같습니다.
동의합니다. 최근에 좀 바뀌었는지는 잘 모릅니다 ㅎ...
https://man.archlinux.org/man/signal-safety.7.en
signal safe 한 함수의 목록들입니다.
사무실에 있는 Linux Programming 책 signal 챕터에서도 비슷한 목록을 찾아보실 수 있습니다.