[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を変更して一件落着一件落着ぅー。