中居憲久
n.nak****@sdy*****
2007年 12月 27日 (木) 02:22:52 JST
TO:皆様 中居です。 お世話になっております。 冬至も過ぎてすっかり真冬の様相を呈してきました。 もう数日で今年が終わりますが…元旦からコードを書いていそうで怖い自分です。 さて、ちょっとコードを追いかけていて、スケジュールモジュールでの問題点を 発見致しましたのでパッチとともに報告を載せたいと思います。 現状、l7vsd_1.0.0などはstruct l7vs_serviceの中にvoid* sched_dataと言う変 数にスケジュールモジュールが使用するデータを格納することになっております。 具体的に言えば、l7vs_serviceが持つGList *dest_listのポインタを格納してい ます。 例:sched_rr.c 62 static struct l7vs_dest * 63 l7vs_sched_rr_schedule(struct l7vs_service *srv, struct l7vs_conn *conn) 64 { 65 GList *l; 66 67 if(srv == NULL) 68 { 69 return NULL; 70 } 71 if (srv->sched_data == NULL) { 72 l = g_list_first(srv->dest_list); 73 } else { 74 l = (GList *)srv->sched_data; 75 } 76 77 if (l == NULL) { 78 return NULL; 79 } 80 81 srv->sched_data = g_list_next(l); 82 83 return (struct l7vs_dest *)l->data; 84 } この方式の問題点は「serviceが持っているdest_listが不変のものだと思ってい る子と」だと思います。 なぜならばl7vsdは起動中にもrealserver(=dest)が追加/削除できるわけで、そ うするとl7vs_serviceが持っている sched_dataのdestを指す先がどこまで有効 なのか、 判断できないことです。 つまり、sched_dataにGList*を入れていますが、スケジューリング関数がよびだ されるまでにdest_listの構成が変わっているかもしれない、sched_dataが指し 示すdestのインスタンスが開放されているかもしれないと言うことです。 と、言うわけでその辺のパッチを作成してみました。 protomod.cのprotomod_finalize()で行っていたactivelistの判定を schedule_module内部の持たせた →destのweightの判断はscheduleのみが判定すべきと思いました。 sched_rr.cではsched_dataの管理をmoduleが行うようにした。 sched_lc.cではそもそも最小のnactiveに接続するためsched_dataは必要なく、 呼ばれたときに一番最初に見つかった有効な destでnactiveが小さいものを払い 出すようにした。 sched_wrr.cではactive_listを基準に走査するように変更 詰まるところリストが変わる可能性のあるGlistをsched_dataに格納するのが諸 悪の根源と言うことで、素直にEndPointを持つようにしました。 と、言うのもserviceがdestを削除してもスケジューラに通知するわけではない ので、スケジューラが抱えているdest自体の開放が完治できないからです。 生きているインスタンスのポインタなのか、開放されているポインタなのかを判 断することができない以上、ここはEndPointのインスタンスを schedulerが管理 する歯科ありません。 ただ、ここでもう一つ問題点が発生します。 それはweightの問題です。 例えばcinsertモジュールでcookieから作り出したdestが現状接続できるかどう かは分かりません。 serviceが保有するdest_listをこじ開けてweight>0のリストを作成しscheduler に渡していますが、そもそも weightを書き換える場所なのかという議論がし尽 されていないように感じます。 とりあえず上記部分は一番エレガントなのは 1)schedulerがすべて有効なEndPointかを判断するコードにする。 2)その後有効ならばセッション継続、無効ならば再払出 と言う流れ似ると思いますが、さすがに手を入れるところが大きくなりすぎるの で手前のコードでl7vsdでのsched_dataはGList*ではないという判断が出きるそ うです。 まぁ、まだチェックが甘いところがあると思いますが、ファイルを添付します。 どうぞよろしくお願い致します。 -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: sched_data.patch 型: text/x-patch サイズ: 14209 バイト 説明: 無し Télécharger