ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

FTP転送が終了しなくてもファイルが出来てる

FTPの仕様かどうかは分からないんですけど、FTPDが転送中のファイルも随時サーバに書き出しているため、ls等のコマンドで見ると見えてしまうということみたいです。
常駐型のバッチ処理で、FTPされたファイルをトリガに処理するものがあるのですが、FTPDが書き途中のファイルを移動とかしようとして、アクセス権限エラーになってしまっているようです。
まあ、小さいファイルならまず起こりえないような現象ですが、今回のシステムでは1MB超のそこそこ大きいファイルも扱うので、エラーになる可能性はそこそこあるような気がします。
結局、アクセス権限エラーを拾って、異常終了しないようにしたのですが、この手のきわどい問題は、負荷テストとかやらないと出てこないかもなぁ。
ちなみに先人の智恵で、トリガとなるファイルを0バイトにしてしまうという技があったようです。確かにそれなら転送のタイムラグがないので、大丈夫のような気がします。

同じような話で、

File hoge = new File(hogePath);
if(hoge.exists())
{
    FileReader reader = new FileReader(hoge);
    // ...
}

ってやっちゃうと、hoge.existsで検査した時はファイルが存在したけど、new FileReader(hoge)ってやった時には既に存在していなかった場合っていうのがありうるということを、十分認識する必要があるってことですね。
もちろんデータベースを扱うならば、排他制御をどうするかっていう話になると思いますが。

そういえば、

int maxNumber = /* SELECT MAX(NUMBER) FROM HOGE */
/* UPDATE HOGE SET NUMBER = :maxNumber + 1 */

もダメですよね。当然のことながら。