[Ultramonkey-l7-develop 117] sched_dataについてのパッチ

Back to archive index

中居憲久 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 


Ultramonkey-l7-develop メーリングリストの案内
Back to archive index