ggatec は正しく ggated 側の IO エラーを処理しない ― 2009年04月05日 02時23分07秒
サーバ側がディスクエラーを関知しても、クライアント側がそれなりの対処を取らないので、ディスク障害に対処が出来ない。そのため、残念ながら本格的な運用などには適さない。
ggated のサーバ側は、ディスクエラーを検知するとクライアントに送るようになっている。disk_thread がその関数だ。
if (data != (ssize_t)req->r_length) {
/* Report short reads/writes as I/O errors. */
if (errno == 0)
errno = EIO;
g_gate_log(LOG_ERR, "Disk error: %s", strerror(errno));
req->r_error = errno;
if (req->r_data != NULL) {
free(req->r_data);
req->r_data = NULL;
}
}
それに引き替え、こちらがクライアントの ggatec の recv_thread 関数になる。
if (ggio.gctl_error == 0 && ggio.gctl_cmd == GGATE_CMD_READ) {
data = g_gate_recv(recvfd, ggio.gctl_data,
ggio.gctl_length, MSG_WAITALL);
if (reconnect)
break;
if (data != ggio.gctl_length) {
reconnect = 1;
pthread_kill(sendtd, SIGUSR1);
break;
}
}
g_gate_ioctl(G_GATE_CMD_DONE, &ggio);
書き込みに対する返信はエラーコードも見ないで、正しく処理された事にしてしまう。読み出し時にサーバ側でエラーがあった時には、データ部分は読まれもしない。そのため、サーバとクライアント間のメッセージの区切りがずれてしまう。
元々、FreeBSD はディスク障害に弱いのに、ggate を通すと更に厄介な状況になる。FreeBSD がディスク障害に弱いとは言ったが、その点では Solaris も大した違いはないのを付け加えておく。
前回。
コメント
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2009/04/05/4227188/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。