10.2. エラーメッセージの解析方法#
Groongaは様々なエラーメッセージを出力しますが、出力されたエラーメッセージ をもとに、原因を解析する方法はいままで、明文化していませんでした。 ここでは、エラーメッセージごとの解析方法を記載します。
10.2.1. ソケットエラーの解析方法#
ここでは、Groongaで発生するソケットエラーの解析方法について説明します。
10.2.1.1. 例#
Groongaのエラーログで以下のようなエラーログがあります。(xxxxxには任意の数字が入ります。):
socket error[xxxxx]: no buffer: accept
10.2.1.2. 解析方法#
まず、ソケットエラーを扱うマクロである、SOERR というキーワードでGroongaのソースコードをgrepします。
次に見つかったSOERRの引数にacceptが入っているSOERRをさがします。 すると次のSOERRが見つかります。:
lib/com.c: SOERR("listen - start accept");
lib/com.c: SOERR("listen - disable accept");
lib/com.c: SOERR("accept");
ログに出ているのはacceptのみなので、最後の行が例で出力されたエラーメッセージに該当するとわかります。
該当するエラー出力の周辺のコードを見ると以下のようになっています。:
grn_sock fd = accept(com->fd, NULL, NULL);
if (fd == -1) {
if (errno == EMFILE) {
grn_com_event_stop_accept(ctx, ev);
} else {
SOERR("accept");
}
return;
}
上記のコードから、acceptを実行してエラーが発生したことが確認できます。 次は、acceptが失敗した原因を追っていきます。
acceptが失敗した理由は、:
[10055]: no buffer
から追うことができます。 10055はWindowsのソケットエラーコードを表しています。また、no bufferはSOERRマクロ内でGroongaが用意しているメッセージです。 Windowsのシステムエラーコードから調査しても良いですし、Groongaが出力しているエラーメッセージから調査しても良いです。
Windowsのシステムエラーコードは以下のページに一覧があります。:
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms740668(v=vs.85).aspx
システムエラーコードまたは、エラーメッセージから調査すると、acceptが失敗した理由は、WSAENOBUFSであることがわかります。さらに、WSAENOBUFSが発生する原因を調査するとWSAENOBUFSが発生する原因は以下であることがわかります。:
No buffer space available.
An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
上記のメッセージから、acceptが失敗する原因は、メモリー不足または、接続数が多すぎる場合であることがわかりました。 あとは、エラーメッセージが出た際の状況から、接続数が多かったのか、メモリ不足だったのかを判断します。