bbs.cgi再開発プロジェクト6

このエントリーをはてなブックマークに追加
926root▲ ★
うーむ、同じスレッドキーのスレができないようにするところって、
激しくうーむなような。
927動け動けウゴウゴ2ちゃんねる:2005/10/26(水) 12:22:51 ID:s6PZNUUX0
どうしたの?
928 ◆IiIGjn5YT2 :2005/10/26(水) 13:01:14 ID:tPRUqC8Y0
安易なロック方式として、スレを立てるところで
どこか(板単位で分離が好ましい?)にunixtime%閾値をファイル名として/dev/nullからでもsymlinkを貼ってみて、
失敗したらスレたて拒否。成功したら建てる。
ガベージコレクトのタイミングで一番新しいヤツ以外を削除するようにすればおっけ。
マルチスレッド/タスクを考慮するならこれが一番コストがかからないと思いますがどうです?
閾値はスレたての最大間隔ね。最小1秒になることもあるけど2スレ連続ならまぁ許容範囲内ではないかと。
929動け動けウゴウゴ2ちゃんねる:2005/10/26(水) 13:03:24 ID:BcSDlqwC0
ん?
Perlでのまともなlockの方法って、2年ほど前の再開発スレでrootさんが話題にしてましたよね。
そのレベルは脱した上で「うーむ」なことに成っているのだと解釈。
930動け動けウゴウゴ2ちゃんねる:2005/10/26(水) 13:24:34 ID:s6PZNUUX0
ほぼ同時にスレ立て要求→同時に数十本もスレ立っちゃった→スレッドキーみんな同じだ→しかも今夜が山だ

こんなところ?
931root▲ ★:2005/10/26(水) 13:29:31 ID:???0
今の bbs.cgi は、同じスレッドキーのやつが立たないようにするコードが
ちゃんと入っているです。

ようは、その実装方法がうーむだと。
932root▲ ★:2005/10/26(水) 13:51:08 ID:???0
do {
#サブジェクトがあれば新規スレなのでキーを現在に設定
$GB->{FORM}->{'key'} = $GB->{NOWTIME};
#.datファイルの設定
$DATAFILE = $GB->{DATPATH} . $GB->{FORM}->{'key'} . ".dat";

} while ( -e $DATAFILE ) ;

これって、$DATAFILE が既に存在してたら、無限ループに陥るんではないかしら。
933stream ◆ap/yuix/tw :2005/10/26(水) 14:15:06 ID:qwHTUNtV0
不動楽さんが入れたやつですね


2chの動作報告はここで。 パート15
http://qb5.2ch.net/test/read.cgi/operate/1090485214/676-685

==========================================
676 削除車 ★[sage] 04/11/01 23:25:56 ID:???
お疲れさまです。ちょっとご相談があります。

最近ニュース速報(VIP)が、非常に板飛び回数が多いです。
少しお話を窺ったところ、同じタイミングでスレが立ったときに合体を起こして、板が飛ぶみたいです。
お手数ですが、ちょっとcgiの方を確認していただけますか?
(それとも一般的なことで、VIPでたまたま多く発生しているだけなんでしょうか)

よろしくお願いします。


★板のスレ一覧復帰&修正依頼21★
http://qb5.2ch.net/test/read.cgi/operate/1096548247/677-682


679 不動楽 ★ [sage] 04/11/02 00:45:12 ID:???
>>676
原因らしき個所は炙り出せたのですが、
その変数にからむ処理を上から眺めていきますので、
少しお時間を頂きたいです。

>(それとも一般的なことで、VIPでたまたま多く発生しているだけなんでしょうか)
ex7だけでなく、全板のbbs.cgiで同じことが起こる可能性があるようです。

684 root▲ ★ [sage] 04/11/02 02:08:27 ID:???
直すときには、安易な flock() は控えてほしいなぁと強くおながいしておきますです。

685 不動楽 ★ [sage] 04/11/02 02:13:12 ID:???
>>684
排他処理をしていないのが原因、というわけではないので大丈夫かと思うです。
==========================================
934root▲ ★:2005/10/26(水) 14:19:31 ID:???0
それについて書こうと思ったら、>>933 が。

それは、これですね。
上記よりも後、最後ところでやっているです。

if($GB->{FORM}->{'subject'} ne "" && -e $DATAFILE){
&DispError2($GB,"ERROR!","ERROR:板飛びそうなので、またの機会にどうぞ。。。");
}

ということで、それはクラシックさんが入れたところではないと思います。
昔からあったところだと思う。

*以下推測*

たぶん、昔は do 〜 while のところでもtime; していたんでしょう。
それなら、1秒経てば条件が変わります(ループを抜けるかは別)。
935root▲ ★:2005/10/26(水) 14:20:57 ID:???0
コピペみすった。

コメントつきなので、ほぼ間違いないです。

#==================================================
# 板飛び回避策
#==================================================
if($GB->{FORM}->{'subject'} ne "" && -e $DATAFILE){
&DispError2($GB,"ERROR!","ERROR:板飛びそうなので、またの機会にどうぞ。。。");
}
936root▲ ★:2005/10/26(水) 14:39:15 ID:???0
で、ここの制御を変えようと思うわけです。
安易に、

・live系は既にあったらごめんなさい
・他はスレッドキーを+1しながら、最大3回ぐらい試してみる

ってことにしようかなと。
937root▲ ★:2005/10/26(水) 16:22:21 ID:???0
BBS.CGI - 2005/10/26

$GB->{FORM}->{'key'} = &mumumuAllocateThreadKey($GB);
$DATAFILE = $GB->{DATPATH} . $GB->{FORM}->{'key'} . ".dat";

にした。
で、mumumu AllocateThreadKeyの中身は >>936 にしたつもり。

これで、

・bbs.cgi謎の暴走
・スレ立て混雑時にサーバ劇重

が、少しでも改善されるといいかなと。
938 ◆IiIGjn5YT2 :2005/10/26(水) 16:27:27 ID:tPRUqC8Y0
スレッドキーは毎秒かわるんでしたっけ、でしたらこんなのはどうですか?

0. ロックの待ち番号を0で初期化

1. ロックの待ち番号をファイル名にして/dev/nullからsymlinkしてみる
 成功; → 6へ

2. ロックの待ち番号を1カウントアップ

3. ロックの待ち番号最大値を超えてるかチェック
 超えてる: → 建てたい人大杉表示にして諦める

4. 1秒まつ

5. 1へ

6. ロックの待ち番号が0か?
 はい: 9へ

7. 0.5秒待つ。

8. ロックの待ち番号-1をsymlinkしてみる
 失敗: → 7へ
 成功:
ロックの待ち番号をunlink
ロックの待ち番号を-1
6へ

9. スレたて処理
939root▲ ★:2005/10/26(水) 16:30:25 ID:???0
>>938
最初はそういうのを考えていたんですが、
1秒とか0.5秒とか待つのが、いやだったです。

スレッドキーは所詮本当の時間とあっている必要はないので、
・live系はごめんなさい
・通常系は 0 +1 +2 を試して、だめならごめんなさい

ぐらいのいい加減さにして、一刻も早くbbs.cgiに終わっていただくことにしました。
940 ◆IiIGjn5YT2 :2005/10/26(水) 16:45:26 ID:tPRUqC8Y0
それだと、多台数とかからスレたて攻撃が同時に来たときにやっぱり被害が起こることは避けれないと思いますがどうでしょう。
941動け動けウゴウゴ2ちゃんねる:2005/10/26(水) 16:50:01 ID:BcSDlqwC0
計算量がO(n * log n)で収まれば収束しないか?
942動け動けウゴウゴ2ちゃんねる:2005/10/26(水) 16:51:55 ID:/5B2u2B30
メモリ上に前回のスレキーを持たせたファイルを置いてそれを参照
とかは無理だろうしなぁ…
(素人案だし毎回読み込みとか(ry)
943root▲ ★:2005/10/26(水) 17:00:02 ID:???0
>>940
if ( ! -e datファイル ) {
return それでOKよん;
} elsif ( ! live系 ) {
for ( $i = 0; $i < $maxtries; $i++) {
スレッドキーを一つずつ増やして存在チェックし、なかったやつを
return これ使ってちょ;
}
&error(ごめんなさい);

って、なっています。

というわけでおっしゃるとおり、タイミングにより突破もありえます。

その場合は、>>935 でひっかかると。
でもそれにしても、ほんとうは完璧じゃないです。

雪だるま作戦では、このへんはバックエンドプロセスに依頼する形になるので、
その時に、きちんと対応することになるかなと。
944root▲ ★:2005/10/26(水) 17:03:08 ID:???0
てなわけで、-e でdatファイルの存在をチェックしていたり、
924の処理のところみたいに utime でdatのタイムスタンプ更新したりすることは
雪だるま環境ではそのままではむりぽなわけで、
そういったAPIを、入れ込んでほしいということなわけです。

一つ海外出張がキャンセルになってちょっと落ち着いたので、
このへんを、ぼちぼちあっちですすめようかなと。> SunOSさん
945root▲ ★:2005/10/26(水) 19:05:46 ID:???0
で、>>937 により「ごめんなさいリミッター第二弾」が実装されました。
どのくらい、発動しているんだろうか。
946▲ ◆cZfSunOs.U :2005/10/26(水) 22:28:35 ID:ICyD85HJ0
ん〜と,現在の bbsd ではスレ立て時の key をインクリメントしながら一定回数(現在は16)
リトライするようになっています.その際,open() を O_CREAT|O_EXCL フラグ付きで
呼び出しているため,ファイルの存在確認と生成はアトミックになっているはずです.

当初はスレ立て時の key としては bbsd 側の現在時刻を用いていましたが,
それだと headline に渡す key とのずれが生じる問題も発生したため,
現在は bbs.cgi 側から渡された key を使用するようになっています.
ただ,上記の key のインクリメントが発生するとやはりずれが生じることに
なるので,そこの調整をする仕組みが必要になりますかね.
947▲ ◆cZfSunOs.U :2005/10/26(水) 22:37:27 ID:ICyD85HJ0
単純に,bbsd 側ではリトライせず,key をインクリメントした上でのリトライは
bbs.cgi 側に任せるという形でもいいんですかね.同じ key を持つ dat が
存在した場合,bbsd は EEXIST に相当するエラーメッセージを返すことになるんで.
948root▲ ★:2005/10/26(水) 23:48:08 ID:???0 BE:1459744-###
>>946-947
なるほど、なるほど。

bbsdについては、そのうちoperateにスレ立てるかも。
(いろんな意味でhtml化されてほしいし)
949root▲ ★:2005/10/27(木) 01:36:28 ID:???0 BE:2554447-###
で、スレ立てのAPIの戻りで、実際に立ったスレのキー(だめなら-1)を、
戻すとかすればいいと思うです。>>946-947
950動け動けウゴウゴ2ちゃんねる:2005/10/27(木) 01:37:41 ID:MHLp6DNM0
ロックのループにはまった時はスレキーとかに使うUNIX時間なんかを
新たに取り直した方がよくね?
でもスレ立て処理は排他ロックさせずに複数同時進行してそうだし、
ロックのループが1秒待ちでもなさそうだから関係ない話か。
951▲ ◆cZfSunOs.U :2005/10/27(木) 19:57:03 ID:SzSv4IzM0
>>949 成功時は key,失敗時はエラーメッセージを返し,戻り値が
数値か文字列かを bbs.cgi 側で判定してもらうというのはどうでしょうか?
スレ立てが失敗する原因は EEXIST 以外にもあり得るので
(といっても実際はまれでしょうが),エラーの内容がわかった方が
異常発見もしやすくなるかと思いますし.
952root▲ ★:2005/10/28(金) 02:41:02 ID:???0 BE:3830876-###
>>951
悪くないと思いますです。

週末あたりから、APIを詰めていくスレをoperateに立てようかと。
ほんじつは、ここまで。
953root▲ ★:2005/10/28(金) 17:10:58 ID:???0 BE:821333-###
ということで、立てました。

【雪だるま】bbsd⇔各cgi間のI/F仕様について考え・詰めていくスレッド
http://qb5.2ch.net/test/read.cgi/operate/1130482779/

ぼちぼち、すすめていこうかと。
954動け動けウゴウゴ2ちゃんねる
てすと