今朝、突然、職場のシステムに異常が発生。異常を告げているのは先週まで、バリバリに動いてたプロセスで、僕が開発の一部を担当しているものだ。何も変えていないのに、突如動かなくなる。こんなに厄介なものはないのである。
プロセスは、コアを吐くとかでなく、設定に問題があると告げて終了しているので、問題のある設定をとりあえずはチェックしないようにして起動し、業務に支障がないようにしてからデバッグを開始。ところが、どこをどうみてもおかしくないのである。だって先週までは動いていたコードだし、設定も何も変わってないのだから。
問題を起こしているのは、ユーザをチェックし、そのユーザが間違いなく、うちのチームの人間かどうかをチェックする部分。チームメンバーの管理はUNIXのグループを使っているので、getgrnam_r()を使って、情報を取り出している。このgetgrnam_r()が失敗するようになったのだ。
小さなテストプログラムを書いてみる。
#include <stdlib.h>
#include <grp.h>
#include <sys/types.h>
#include <errno.h>
#define workSize 1024
int
main(int argc, char *argv[])
{
char work[workSize];
int i;
struct group grent, *grentP = NULL;
if (argc > 1) {
int grerr = 0;
if ((grerr = getgrnum_r(argv[1], &grent, work, workSize, &grentP)) != 0) {
printf("getgrnam_r(): %s\n", strerror(grerr));
return 1;
}
if (grentP) {
printf("%s: gid = %d: ", argv[1], grent.gr_gid);
for (i = 0 ; grent.gr_mem[i] ; i++) {
printf("%s, ", grent.gr_mem[i]);
}
printf("\n");
}
}
return 0;
}
仕方がないので、とりあえず、エラーをもうちょっとちゃんとレポートするようにと、上でやったように、strerror()をエラーメッセージに付加するようにした
一撃必中。"Result too large"ですと……。つまり、workに用意したスペースが小さすぎるというわけ。そういえば、うちのチーム、今週からヒトが増えたんだった。つまりはそれで、閾値を超えてしまったというわけ。先週と今週とで違ったのは、チームのメンバーだった oTL
とりあえず、ワークスペースを4096bytesに拡大して、テストしたら無事に起動。これにて一件落着。落着なのだが、まだ若干の疑問も残る。というのも、上のテストコードはworkSize 1024で、問題の起こったシステムと同じ値を採用しているのに、エラーにならないこと。ビミョウな居心地の悪さを積み残しつつ、とりあえず、この問題は一旦完了とする。後日の禍根とならねばよいが(^^;;
コメント