ggatec は正しく ggated 側の IO エラーを処理しない2009年04月05日 02時23分07秒

ggate には、遅延以外にも幾つか問題を含んでいる。最近、ggate の問題を追跡していて浮かび上がってきた。そのうちの致命的なものが、このディスクエラーを正しく通知していないことだ。あとの残りの問題 は、初期化時のエラー処理が甘いため実験していると不可解な状態になってしまう事だ。ggate 開発修正時のみなので大きな問題ではない。

サーバ側がディスクエラーを関知しても、クライアント側がそれなりの対処を取らないので、ディスク障害に対処が出来ない。そのため、残念ながら本格的な運用などには適さない。

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の入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2009/04/05/4227188/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。