2007年5月12日土曜日

flockの使い方を勘違いしちゃいないかい?



こんなコードじゃ、正しくロック出来ない。



FILE *fp=fopen("somefile","r+");
flock(fileno(fp),LOCK_EX);
//readやらwriteやら
flock(fileno(fp),LOCK_UN);
fclose(fp);


バッファが存在するために、fclose時に書き込まれるデータが有り、その分だけロックで保護されない書き込みが発生する。


なのでflock(fileno(fp),LOCK_UN)のまえにfflushする必要がある。


ってのが、即答出来ない同僚がいたり。。平和な会社だぁ。


(ちなみに、flockfileはflockに名前は似てるけど、機能が違うので間違って使わない要にしないと罠なのねんん。。。)














だいたいの言語で同じような事が起きるので、注意が必要なのです。


ちなみにPHPも同じはずで、


http://www.atmarkit.co.jp/flinux/rensai/mysql5_03/mysql5_03a.html


に書いてある以下の説明は勘違いな説明になってるっす。


OSのバッファを書き出すのはsyncとかで。。。関係ないっす。


PHPのマニュアルにも「ストリームのバッファ」としかかいてないっす。


なので、たんに障害対策ならいらないでよ。って思ってバッファサイズゼロにするのをやめると、正しくロックされなくなるっす。



「set_file_buffer("ファイルポインタ", 0)」で書き込みバッファを使用しないようにします。書き込みバッファはOSがメモリ上に用意する一時的な記憶領域です。ハードディスクなど物理的なファイルシステムに書き出す前に利用されます。


 バッファを利用することで、書き込みパフォーマンスを上げることができる一方、極めて短時間ですが、バッファ上のデータとファイルシステム上のデータに差異が発生します。その差異が発生している瞬間に障害が起きた場合、データが消失する可能性があります。そのため、バッファを利用せずに直接ファイルシステムに書き込むようにします。






0 件のコメント:

コメントを投稿