著作一覧 |
Windows固有の話かも知れないけれど、と前置きして、以下の処理の流れがあるとする。
1) プロセスAが実行を開始する。
2) プロセスAは既存のファイルaを置き換えるファイルbを作成する。
3) プロセスAはファイルbをファイルaへコピーする。
4) プロセスAはプロセスBを起動する。
5) プロセスBはファイルaを読む。
この流れで、Bが3でコピーしたaを読めないことがある。
これが、
5) プロセスAはファイルaを読む
であれば、それが失敗することはない。
が、異なるプロセスとなった途端に失敗することがある(成功することもある)。
それが遅延書き込みが原因なのか、ウィルス対策ソフトが原因なのか、両方なのか、より何か上等なキャッシュが原因かはわからないのだが、(なので回避方法が良くわからない。これがCreateFileのようなAPIを使っていれば、遅延書き込み無しみたいなオプションを利用すれば良いのかも知れないが、汎用のライブラリを利用したりしていると、プログラムからの介入方法が見えない('system sync'とかはWindowsでは呼べないし。というか、20年前にはsync; sync; sync; shutdown -h 0 とかやってたものだな)
最初、そんなバカなと思ったけど、よくよく考えてみれば、Rubyのmakeが時々失敗するのも、こういう状況だった。ということは、それなりの頻度で(特に4の後すぐに5のステップが実行される場合)起きるわけで、でも、あまりそれで困ったという話を聞かないので、単なる勘違いのような気もするし、なんだろうかなぁ。
ジェズイットを見習え |
ありますね〜、Windowsはファイルアクセスで「ちょっと待ってから」やらないと失敗というケースが良く起きるように思います。rd /sも1度目失敗で、もう1回やるとokとか。
ええ、ありますね。Commpanionでも、エミュレーターが正常なのにAzureで動作しなくて調べたら、まさに同じような状況でリトライロジックを作成しました。