bbs.cgi再開発プロジェクト 3
■ このスレッドは過去ログ倉庫に格納されています
if($lognum > 1010)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
にしてみた。 というか、datの書き込みのあとには、
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
がきてますよー。 if($lognum > 1000)
{
++$lognum; #←これもいるかも
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
} ただ、>>344 みたいなアプローチがどのぐらい効果あるかだけど、、、。
それで、1001ストッパーが書かれるような気は、あんまりしないかも。
ちょっとお出かけ。 #MakeWorkFile(KEY-NUMBER)
sub MakeWorkFile{
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
#$lognum++; ← コメントにした
>>330の
#ログのカキコ数を取得
から
#1つ目の要素を読み込む
の前までがいらない。
この中の$lognum++;が最終的にsebject.txtに書かれているので
実際より+1された数が入ってしまう。 変更
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1010)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
}
>chmod(0666, $DATAFILE);
レス数が1000を超える原因と思われ 解決した?
最終的に subject <= 実際のカウント になればいいような
datの読み込みを2回やってるんですね〜……。
レスの書き込みとレス数の取得を同時にやる(>>353 の処理を >>350 に持ってくる)のがいいかも。
……大手術(汗)。 >>354
おいらもそう思ったですよ。
chmod 0555 しても、追っかけてきてるプロセスが chmod 0666 しちゃって、
そのプロセスが、chmod 0555 しても。。。
chmod 0666 を消したら解決だったりして。 >>357
chmodが効かないって変だと思ったんだよね。 でかける前に見た。
こりゃ、>>354がビンゴな気が。
でなきゃ、いくらひどいじょーきょーでも、4000とかいく原因とは考えにくい。
しばらくオフライン。たまーにPHSでチェックするかも。 というわけで、live8,9に
chmod(0666, $DATAFILE);
を消したやつを入れてみてくださいですー。 >>353
処理の順番が。。
これでどですか。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
chmod(0555, $DATAFILE);
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
++$lognum;
} 訂正。。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
chmod(0555, $DATAFILE);
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
} >>351
テレビ朝日実況板より
スクープスペシャルその1 (1001)
http://live8.2ch.net/test/read.cgi/liveanb/1078030448/
1000 名前:名無しステーション 投稿日:04/02/29 14:52 ID:gFLAwWAx
(1001無し)
スクープスペシャル 警察の裏金疑惑第2弾 その2 (1000)
http://live8.2ch.net/test/read.cgi/liveanb/1078030554/
1000 名前:名無しステーション 投稿日:04/02/29 15:20 ID:LyiRwuOt
(1001無し)
この間に加えた修正によって、subject.txtに書かれるレス数と
実際のレス数が一致するようになりました。ありがとう! #ERROR!
#ERROR:このスレッドには書けません!
#修正ここまで。
# "ERROR:このスレッドには書き込めません。緊急緊急緊急!!" が出てこないけど今ソースはどうなってるのだろう。。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
} >>364
それから、1001ストッパーを書き込む「前」に$outdatを出力しないとだめです(でないと書き込みが吸い込まれる)。 1001ストッパーが書き込まれないのは
・プロセスAが >>353 で1000レス目を書き込む
・プロセスBが >>330 で(1000レス以上なので)chmodする
・プロセスAが1001ストッパーを書き込もうとするもEPERM
と予想してみる。
ということで、>>353 を
if ($lognum > 1010) {
close(OUT);
chmod(0555, $DATFILE);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
にして、>>330 の chmod(0555, $dattemp); を削除する、というのはどうでしょ。 ……って、writeはEPERMなんか返さないか……。 これ全部いらないのか?
if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
#$lognum++;
if(-w $dattemp){
my $datdat = $DATPATH . $key;
my $tmpdat = $DATPATH . $key . ".tmp";
my $success;
open(COPY, "cp $dattemp $datdat |");
close(COPY);
$success = 0;
until($success){ $success = rename($datdat, $dattemp); }
chmod(0555, $dattemp);
unlink($tmpdat);
}
}
ファイルロックの名残?
総帥に事情聴取してからにしてください。
こないだのiスクリプト消滅騒ぎのような事態は避けないと。 あらためて
・複数のプロセスが999レス目のつもりで書き込む→1000オーバー(ただしストッパーは書かれない)
・1000オーバーなので >>330 でchmod
と予想してみる。
ってことで、>>330 の1001ストッパー書き込みも復活すれば……。
……泥縄だなぁ。 ええとこれとまったく同じメッセージが書いてある部分のソースがないのですがどの部分でしょうか
↓
ERROR:このスレッドには書けません!
あと $outdat っての値が代入されている部分のソースもないし。。 ええとこういう風になっているはずなのですけど。
DispError("ERROR!","ERROR:このスレッドには書き込めません!");
----
ERROR!
ERROR:このスレッドには書けません! >>377
なんか重複してるけど、一緒です。
#.datが存在してないか書けないならばいばい
unless(-w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書けません!");
}
#my $datsizeis =(stat("$DATAFILE"))[7];
#unless( $datsizeis <= 512000){
#DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
#}
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
} あ間違えたました、、こうです
DispError("ERROR!","ERROR:このスレッドには書けません!"); >>370
chmod 0555 が失敗したときか、
chmod 0555 の後に書き込めるようになっちゃったときの処理ですかねー、
あんまり意味がないような気もする、、 >>378
別にどうでもいいんだけど
512k超えの処理ってunlessでやる意味あるんだろうか >>370 でunlinkしている $DATPATH . $key . ".tmp" というファイルはどこで作ってるんでしょ? こんなに謎だらけでもなんとなく動いているところがすごい・・・(´Д`;) ようし、外してみよう。
#if(-w $dattemp && $lognum > 999){
##open(OVER, ">>$dattemp");
##print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
##close(OVER);
##chmod(0555, $dattemp);
##$lognum++;
#
#if(-w $dattemp){
#my $datdat = $DATPATH . $key;
#my $tmpdat = $DATPATH . $key . ".tmp";
#my $success;
#open(COPY, "cp $dattemp $datdat |");
#close(COPY);
#$success = 0;
#until($success){ $success = rename($datdat, $dattemp); }
#chmod(0555, $dattemp);
#unlink($tmpdat);
#}
#} http://鯖.2ch.net/板/dat/key.tmp作ってソコで処理して、
http://鯖.2ch.net/板/dat/key.datにコピーして、
http://鯖.2ch.net/板/dat/key.tmpをあぼーんしてる? >>391
何人の人がそう思いチャレンジしてきたことか・・・
いまだ勝者は一人としていない、暗黒の世界から生還したものはいない。 >>390
たぶん
/dat/key.dat に書き込んで
/dat/key.dat を /dat/key にコピーして ←たぶん無駄
/dat/key を /dat/key.dat にリネームして ←たぶん無駄
/dat/key.dat を書込み禁止にして
/dat/key.tmp をあぼーんしている ←たぶん無駄
かと……。 >>392
まぁチャレンジできる人が限られてるし…。
ここの暇人たち(←おい)なら軽く片付けちまいそうな気も…w >>392
というか、ソースが(NDAでもいいから)完全公開されれば(ry 芸スポなんですけどいいですか?
【サッカー】日本代表選手7人が合宿中に規則違反で飲酒★2
http://news6.2ch.net/test/read.cgi/mnewsplus/1077996750/
1001ストッパーが壊れてるのか
ストップしないんですか。 >>400
で、どうするんです?
と聞いてみるテスト。 これが期待通りの動作をしていないってことっすね
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
テストとしてだけど1000を超えたらあらゆる変数を出力しまくってみては 1010のやつを生かしておいて,変数を色々出力して検証してみてはどうでしょ? >>398
>>399
>>403
チッ。記念カキコしに行ったのにどこもかけなかった! 現状>>403が一番凄い。
3000突破してる・・・
でもどうやら止まったみたいですね。 >>403は、他の人が書きこめたてた時もオレはユーザー情報が消失してますとか言われて書き込めなかった うーん。。。とりあえず各種変数を出力するようにしてみたら? >>416
>>404を確かめるために
試験的に >>353 の if($lognum > 1010) を if($lognum > 300) とかにして
300を超えたスレッドに書き込んでみて
「緊急緊急緊急!!」が出るかどうかを見てみるのはどうでしょか。 >>424
それは危険過ぎるとおもうなぁ>300にする >>425
いや、いきなり全鯖に配るわけじゃなくて、(金) でテストするだけでも、と……。 qbのbbs.cgi更新すると一気に全鯖いくんじゃなかったっけ?(わからん >>426
(金)ではやり辛いでしょ。
いっそのことN速で実験しましょ。 いろんなとこにフラグ立てまくって出力させてみてほしいです
どこが実行できていて、どこができてないのかよく分かんない >>404のレス数チェックが効いてるかどうかは、このスレに1回書き込むだけで判明するかな、と。
http://qb.2ch.net/test/read.cgi/operate2/1068621844/
このスレがいま350レスなので……。 ん?
もう解ったんでないのか?
違うところで戦っていたということが、 ひょっとしたら my @logdat = <OUT>; の前に seek(OUT, 0, 0); を入れるといいかも(←自信なし)。 うちのwindowsだと、
if (open(OUT, "+>>$DATAFILE"))
{
#この時点でファイル末尾にseekされてる
my @logdat = <OUT>;
my $lognum = @logdat;
これだと@logdatは空になっちゃうんだけど、、、
if (open(OUT, "+<$DATAFILE"))
my @logdat = <OUT>;
my $lognum = @logdat;
じゃないすかね >>436
うちのcygwinだと"+>>"でopenした時点でファイル先頭にseekされてました。
あと、追記モードじゃないと書き込みがぶつかったときにヤバいです。 なんか…ニュー速+も1001ストッパー壊れてるのね。
なにがなんだか… >>433
ええと>>330に手を加えていたものが>>350で
その後>>353でテストして>>330あたりに戻ったということなのかな。。
どのソースを元にやればいいのか、、
ちょっとゆっくりやってほしい、、
今試したら、Windows(ActivePerl)でもsysopen使ったら先頭だった。 >>249だけど、>>438と同様、
cygwin+perl5.8.2で、読み込み時は先頭から
同じくlinux(redhat8かな)+perl5.8.0でも。 ■ このスレッドは過去ログ倉庫に格納されています