ファイルが消えるとき

Eclipse 3.6 (Helios)にて更新(Eclipse IDE for Java Developers 1.3.2.20110218-0812)が出ていたので素直に更新して再起動したものの、どうも調子が悪い。"out of memory"などと不可解なエラーが出るのでどのような設定になっていたのか確認しようとしたところ、いつの間にかeclipse.iniファイルが消え失せていることに気がついた。更新前までは正常に使えていたので、この更新に失敗してしまったようだ。

この障害を見て、昔作ったWindows用アプリケーションのバグを思い出した。設定画面のデータ保存用としてファイルを更新する処理が入っていたのだが、手元に届いたバグレポートの報告を確認したところ、アプリケーションの異常終了後、「そのようなファイルは存在しない」と記載されていた。存在するはずのファイルが無いとは一体どのような状況なのだろう?人為的に削除したのだろうか?それとも、ハードディスクの異常だろうか?

担当者に聞いてみても特にファイルを削除していないと言うし、問題のPCを確認しても特に異常は無いようだ。???と思いつつソースコードを解析したところ下記のような実装が行われていると分かった。

  1. 既存の設定ファイルを一旦削除する。
  2. 新規の設定ファイルを出力する。

少しばかり想像力を働かせてみれば分かるように、この処理方法では問題が有る。1.が終わった時点で、2.の出力処理に失敗した場合、あるいはファイル出力中に他のスレッドが原因でアプリケーションが異常終了した場合、ファイルが最後まで書き出されず、結果的に「ファイルが存在しない」可能性があるのだ。問題発生時の状況は手がかりが無く不明だけど、状況証拠から見てこのいずれかが原因だろう。

取りあえず「一旦テンポラリファイルに出力し、正常出力を確認した後でファイルを置き換える」対策を施したところ、問題は起こらなくなった。もちろん、これが完璧な対策ではないし、まだ類似の問題は起こる可能性はあるとは言え、その可能性はずっと小さくなったはずだし、実際、同内容のバグレポートは二度と起票されなかった。

たかがファイル出力1つとは言え、こんな「現場のノウハウ」はソフトウェア開発の教科書には書かれていないことが多いので、問題が発生するたびに再発防止策を繰り返す羽目となる。開発ルールとして定めるのは必須だし、それでも勝手に問題有るやり方の実装を行う開発者がいたりするので、この辺は「共通のフレームワーク」を用意しておいて、「問題有るコードが決して実装されない」ように強制する必要があったりする。少々窮屈な思いが残るものの、組織的な品質確保の為には仕方ないことだろう。

さて、問題のEclipseの更新の方は、TimeMachineより古い(と言っても前日だけど)Eclipseを戻して無事に復活した。念のため再度更新してみたら同じように失敗するし、再現性は有るのだけど、さて何が悪いのだろう?