0

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 秒未満です。

4

1 に答える 1

1

NFS には、ファイル システム オブジェクトごとにファイル ハンドルがあります。ディレクトリの名前を変更しても、ファイルハンドルは変更されず、ルックアップで肯定的な結果が得られます。このような状況を回避するには、新しいディレクトリを作成することをお勧めします。すべてのファイルとディレクトリを元のディレクトリから移動し、ソース ディレクトリを削除します。これにより、古いファイル ハンドルが無効になります。

于 2013-03-07T18:10:23.580 に答える