CGI設置についての注意
   

パンドラはウェブサービスに限り、CGIで flock というファイルの競合を回避するコマンドの利用ができない制約があります。
現在無償で配布されている多くのCGIは、flock ではない mkdir や symlink (シンボリック)方式を利用しているか、または、ユーザーが任意にその処理方法を選択できるよう、CGIの基本設定ファイルにてロック方法を選択できるように作られていますが、稀に flock のみで作成されているCGIスクリプトが存在します。

flock が使われているCGIをそのまま運用し、同時に複数の人がアクセスして書き込みを行った場合、サーバーはファイルの競合を回避することができず、データファイルを破壊します。
そして破損したデータファイルを正常に処理できなくなったCGIは無限ループを発生し、結果サーバーのハングアップを招く危険性をもっています。

コース別 flock の利用
コース名 flock の利用
ウェブサービス 不可能
サブドメインサービス 可能
ホスティングサービス 可能

設置禁止・注意が必要なCGI
   

現在、flock を利用していることが確認できているCGI、または、標準で flock を利用するよう設定がされているCGIを列挙します。
該当のCGIを設置される場合は注意が必要ですので、設置には十分ご注意ください。

スクリプト名 エンドレスバトル
設置方法 設置禁止
すべての処理で flock を利用しているため、設置を禁止します。

スクリプト名 箱庭諸島
設置方法 原則設置禁止
標準で flock を利用する設定になっています。
config.cgi の下記項目を変更ください。
# ロックの方式
# 1 ディレクトリ
# 2 システムコール(可能ならば最も望ましい)
# 3 シンボリックリンク
# 4 通常ファイル(あまりお勧めでない)
# (注)
# 4を選択する場合には、'key-free'という、パーミション666の空のファイルを、
# このファイルと同位置に置いて下さい。
$lockMode = 2;
の個所を
$lockMode = 1;
または
$lockMode = 3;
に変更

※上記の設定を守らず設置を行いウェブサーバーをダウンさせた場合は、予告なしに該当のファイルを削除することがあります。


なぜflockが使えないのか
   

flock とはなにか?

flock とは同時に複数の人が書き込みが行った際に、書き込みの競合が起こらないよう一時的にファイルへの書き込みを禁止するコマンドのことです。
まったく同じタイミングに複数の人が書き込みを行う可能性が高いCGIとしては、カウンターやチャット、ゲームなどが挙げられます。
たとえば、掲示板の書き込みボタンを押したときの内部処理は
ロック→書き込み→ロック解除
という作業が行われています。
そしてロックの方法には一般的に下記の3種類がよく使われています。

コマンド 内部処理 利用
flock システム内でロックを行う ×
mkdir ディレクトリを作成してロックを行う
symlink エイリアスを作成してロックを行う

そのことを踏まえてパンドラのウェブサーバーの仕組みを説明します。

ウェブサーバーの仕組み

パンドラではウェブサーバーの負荷分散処理に、ラウンドロビンDNSという方式を採用しています。
これは1つのURLを複数台のウェブサーバーで並列に処理することによって、処理を分散し高速化を図る方式です。



ひとつのURLをリクエストした場合、1〜3のウェブサーバーのどのサーバーで処理するかはランダムに選択されます。
CGIスクリプトやデータファイルはファイルサーバー上に保存されており、1つのファイルを複数台のウェブサーバーが共有するかたちで読み書きを行っています。

flock はシステムロックともいい、自分が処理をしているサーバー内でしかファイルの排他処理を行いません。
つまり、ウェブサーバー1でロックをかけていても、ロック中にウェブサーバー2にアクセスがあった場合は、ファイルサーバーには書き込みができてしまうわけです。
mkdir や symlink 方式は、ファイルやディレクトリを作成し、その有無によって同時にアクセスしている人がいないかを判断するため、ロック中か、オープン中かの識別はファイルサーバー内で行われます。
ファイルの有無はフロントエンドのウェブサーバーに関係なく一意ですので、flock のような誤認を回避することができるというわけです。


対処方法

flock を使ったCGIを設置したい場合はどうしたらよいでしょうか?
flockから他の排他処理へソースリストを改変することしか根本的な解決法はありませんが、他人の作成したCGIを改変することは簡単な作業ではありません。
そこで、flockのコマンド自体をハイジャックして、強制的に mkdir や symlink でのロックを代行させるモジュールを作成しました。
どうしてもflockを利用したい、という方はお試しください。

FlockWrapper

http://menu.pandora.nu/arc/flockwrapper.lzh

また、パンドラに設置されるPerlのスクリプトについてのみですが、perl内で
use FlockWrapper()
することでFlockWrappeを利用することもできます。
ご利用には引数がありますので、詳しくはREADMEをご覧ください。