Centos 5 で実行している C++ アプリケーションで、次のような問題が発生しています。
マシン A には、ファイルを含むマシン C からの NFS マウント ドライブがあります。
/nfs/mounted/drive/path/directory/file
私のアプリケーションは、マシン A のディレクトリの名前を変更します。
mv /nfs/mounted/drive/path/directory /nfs/mounted/drive/path/directory.old
次に、マシン A のアプリケーションがマシン B に ssh(s) 接続して、私が作成したアプリケーションを実行します。これは、最初にファイルの存在をチェックすることから始まります。
/nfs/mounted/drive/path/directory/file
ファイルが存在することが判明し (これは競合状態であり、マシン B にはまだ古い状態が表示されます)、マシン B はファイルが存在するかのように処理を進めますが、マシン B がファイルを開こうとすると失敗し、実際にはありません。
sync()
ファイルをチェックする前に、マシン B でアプリケーションを呼び出して、これを解決しようとしました。私もやってみecho 2 > /proc/sys/vm/drop_caches
ましたが、どちらもマシン B のアプリケーションにファイルの現在の状態が消えていることをすぐに認識させませんでした。
ファイルをチェックしてデータが最新の状態であることを確認する前に、マシン B の C++ アプリケーションで何ができますか? 問題のファイルを開いて明示的にテストするのではなく、ディスクを現在の状態にしたいと考えています。この強制同期は、C++ から比較的高速な方法で実行したいと考えています。経過時間は約 4 分の 1 秒未満です。