地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【MySQL】クライアントが死んだ後のMySQLの処理

mysql -e "select sleep(30)"とかやっておいてMySQL側はどういう処理をしているのかをstraceで見てみるメモ

poll([{fd=41, events=POLLIN|POLLPRI}], 1, 0) = 1 ([{fd=41, revents=POLLIN}])
ioctl(41, FIONREAD, [0])                = 0
futex(0x1d8ff10, FUTEX_WAKE_PRIVATE, 1) = 0
gettimeofday({tv_sec=1671460663, tv_usec=593861}, NULL) = 0
write(41, "\27\3\3\0R\f\264\237\301\202\6\271\4\2T\253\260\316(\231\33e\244\216zr\351\216\334\"\224\332"..., 87) = 87
clock_gettime(CLOCK_REALTIME, {tv_sec=1671460663, tv_nsec=594239259}) = 0
gettimeofday({tv_sec=1671460663, tv_usec=594273}, NULL) = 0
gettimeofday({tv_sec=1671460663, tv_usec=594321}, NULL) = 0
read(41, "", 5)                         = 0
gettimeofday({tv_sec=1671460663, tv_usec=594450}, NULL) = 0
gettimeofday({tv_sec=1671460663, tv_usec=594474}, NULL) = 0
write(2, "2022-12-19T14:37:43.594474Z 48 ["..., 157) = 157
shutdown(41, SHUT_RDWR)                 = -1 ENOTCONN (Transport endpoint is not connected)
close(41)                               = 0
futex(0x1db4474, FUTEX_WAIT_PRIVATE, 95, NULL^Cstrace: Process 529 detached
 <detached ...>

sleepなのでpoll(2)で待ち続けている。ここでmysqlのクライアント側をkill -9とかしてみるとOSによってMySQLへFINが飛ばされる。poll(2)はPOLLINのイベントで戻る。socketに対して何かをwriteしているがこれは何かわからなかった。その後はread(2)を実行して0(EOF)が変えるのでログにクライアントが消失したことを書く。その後はshutdown(2)してclose(2)している。