pid file found but it seems bogus. Trying to start pgpool anyway...

 ブログラのロギング用DBサーバの様子がおかしいので、ちょびっとコンフィグをいじって再起動したらpgpoolが起動しない、、。で、ログを見てみるとこんなメッセージが、、、。

pid file found but it seems bogus. Trying to start pgpool anyway...

まー、文字そのものなんだけど、そもそもpgpoolのpidファイルは設定されている(デフォルト)/tmpにいないんだよね、、、。pid file foundじゃないじゃんか。bogusってわかってるんだったら無視して起動させて欲しいところだけど、とりあえずpid file foundって言ってる瞬間からやなかんじー。ちなみに、手動でpgpoolを起動させたら大丈夫だった。別にinitdで書いてることと同じなんだけどなぁ、コマンド的には。

 で、なんだか納得いかない感じだったのでソースを覗いてみた。あ、バージョンはpgpool-3.41、pgpool-II使えよなぁ。お、main.cにあるぜ。

/*
* else if no non-switch argument remains, then it should be a start request
*/
else if (optind == argc)
{
pid = read_pid_file();
if (pid > 0)
{
if (kill(pid, 0) == 0)
{
fprintf(stderr, "pid file found. is another pgpool(%d) is running?\n", pid);
exit(1);
}
else
fprintf(stderr, "pid file found but it seems bogus. Trying to start pgpool anyway...\n");
}
}

んー、pidがセットされててそいつにkillのエラーチェックを送ってみて返値が0じゃない場合に表示されるのねん。そりゃそうだよ、だって、そのpidは死んでるもんすでに。というわけで、なんでpidがセットされちゃってるかだよなぁ。というわけで、read_pid_fileを拝見。

/*
* read the pid file
*/
static int read_pid_file(void)
{
FILE *fd;
char path[POOLMAXPATHLEN];
char pidbuf[128];

snprintf(path, sizeof(path), "%s/%s", pool_config.logdir, PID_FILE_NAME);
fd = fopen(path, "r");
if (!fd)
{
return -1;
}
if (fread(pidbuf, 1, sizeof(pidbuf), fd) <= 0)
{
pool_error("could not read pid file as %s. reason: %s",
path, strerror(errno));
fclose(fd);
return -1;
}
fclose(fd);
return(atoi(pidbuf));
}

むー、これを見ている限り、-1とか異常な値じゃ無くって何らかの数値が返ってきてるんだよなー、たびん。

fread(pidbuf, 1, sizeof(pidbuf), fd)

が読めてるんだもんな、、、。んー、謎は深まるばかり深追いしたいけど、そんな暇ネェや。