hobbit

http://ymkx.net/cat63/linuxnetwork/hobbit_got_oversize_message.html からのコピペ。

なんかアラートが送られてくるなぁと思って調べてみると、某サーバの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(canid);

こんなの発見。さらに、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を変更して一件落着一件落着ぅー。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です