2007年2月22日
[Hobbit] Got over-size message
なんかアラートが送られてくるなぁと思って調べてみると、某サーバのprocsステータスが紫色に。おー、紫アラートはじめて見たー。と、感動してる場合じゃない、原因究明のためクライアントプローブが動いているサーバに急行ー。で、hobbitclient.logをチェックしてみるとこんなログが。
2007-02-22 10:58:29 Got over-size message, truncating at 528383 bytes (max: 524288)
2007-02-22 10:58:29 Bad data in channel, skipping it
2007-02-22 10:58:29 Got over-size message, truncating at 528383 bytes (max: 524288)
2007-02-22 10:58:29 Dropping (more) garbled data
2007-02-22 10:58:29 Dropping (more) garbled data
2007-02-22 10:58:29 Failed to get a message, terminating
うーん、なんか見覚えがあるなぁ。そういえば、サーバ側でも同じようなログがhobbitd.logに出てた。
2007-02-21 17:33:37 Oversize status msg from xxx.xxx.xxx.xxx for xxx:ports truncated (n=518283, limit=262144)
このときはgglった結果、hobbitserver.cfgにMAXMSG_STATUSを設定して一件落着してたのだ。じゃー、同じようにしてみようと思いクライアントプローブのhobbitclient.cfgに同様の記述をしてみる。が、状況は変らず相変わらず同様のログがはき出されますな。
いろいろgglってみたけど回答が見えてこない。付属の文章も見てみるけど、わからんちん。なんかこの紫色のアラートは不気味なので(赤色の場合は不気味とか言ってる場合じゃないのだ)、気合いを入れてソースを見てみることに。
で、まずはこのメッセージを吐いてる張本人を調べると、hobbitd_worker.cで発見。
if (usedbytes >= maxmsgsize) {
/* Over-size message. Truncate it. */
errprintf("Got over-size message, truncating at %d bytes (max: %d)\n", usedbytes, maxmsgsize);
endpos = startpos + maxmsgsize;
memcpy(endpos, "\n@@\n", 4); /* Simulate end-of-message and flush data */
needmoredata = 0;
continue;
}
トリガーとなってるのはmaxmsgsizeですか、そうですか。で、そいつを辿ると、
maxmsgsize = 1024*shbufsz(chnid);
こんなの発見。さらに、shbufszを探してみると、こいつはhobbitd_buffer.cにいましたよ。
unsigned int shbufsz(enum msgchannels_t chnid)
{
unsigned int defvalue = 0, result = 0;
char *v = NULL;if (chnid != C_LAST) {
switch (chnid) {
case C_STATUS: v = getenv("MAXMSG_STATUS"); defvalue = 256; break;
case C_CLIENT: v = getenv("MAXMSG_CLIENT"); defvalue = 512; break;
case C_CLICHG: v = getenv("MAXMSG_CLICHG"); defvalue = shbufsz(C_CLIENT); break;
case C_DATA: v = getenv("MAXMSG_DATA"); defvalue = 256; break;
case C_NOTES: v = getenv("MAXMSG_NOTES"); defvalue = 256; break;
case C_STACHG: v = getenv("MAXMSG_STACHG"); defvalue = shbufsz(C_STATUS); break;
case C_PAGE: v = getenv("MAXMSG_PAGE"); defvalue = shbufsz(C_STATUS); break;
case C_ENADIS: v = getenv("MAXMSG_ENADIS"); defvalue = 32; break;
default: break;
}if (v) {
result = atoi(v);
/* See if it is an old setting in bytes */
if (result > 32*1024) result = (result / 1024);
}if (result < 32) result = defvalue;
}
else {
enum msgchannels_t i;
unsigned int isz;result = 0;
for (i=C_STATUS; (i < C_LAST); i++) {
isz = shbufsz(i);
if (isz > result) result = isz;
}
}return result;
}
ははーん、こんなパラメーターで設定するのね。というわけで、2番目のMAXMSG_CLIENTをhobbitclient.cfgに設定してみると、無事解決~。
と、思いきや、今度はサーバのhobbitdが黄色アラート。でもって、サーバ側にこんなログが、
2007-02-22 11:55:46 Oversize status msg from xxx.xxx.xxx.xxx for xxx:ports truncated (n=1021699, limit=555008)
サーバ側に送られるMSGのMAXを振り切ってるみたい。というわけで、サーバ側のMAXMSG_STATUSもさらにでかくしてみる。hobbitserver.cfgのMAXMSG_STATUSを変更して一件落着一件落着ぅー。
投稿者 ymkx : 2007年2月22日 11:46