シミュレーションデータをディレクトリpre/id
に書き込むことにより、シミュレーションを生成するプロセスを1台のコンピューターで実行しています。次に、ワーカープロセスは、シミュレーションをpre
からローカルディスクにコピーします。ローカルディスクは別のコンピューターに置くことができます。 pre
は、nfsでマウントされたボリュームにあります。この部分はうまく機能します。
シミュレーションが完了すると、結果はディレクトリresult/id
に移動されます。これが、問題の原因です。監視プロセスは、そのようなディレクトリを保持するか、削除するかを決定できます。 result/id
を削除しようとすると、移動操作が不完全なように見え、ディレクトリの削除に失敗することがあります。
すべてがさまざまなLinuxフレーバーで実行されます。ワーカーは、mv
、次にtouch result/id/done
を使用してディレクトリを移動し、結果を読み取る(および削除する)ことができることを監視プロセスに通知します。監視プロセスは boost::filesystem::remove_all
を使用してresult/id
を削除します。
移動操作が完了するのを確実に待ってから削除する方法を教えてください。
追加:このコードは、結果ディレクトリを監視プロセスが待機する場所に移動します。
mv $tempDir $finishedCasesDir # copy case to result directory
touch $finishedCasesDir/$caseName/done
これは、done
が表示されるのを待つC++コードです。
if(is_regular_file(resultPath/"done"))
{
// get relevant result data
...
// remove result directory
remove_all(resultPath);
}
そしてエラー:
terminate called after throwing an instance of 'boost::filesystem3::filesystem_error'
what(): boost::filesystem::remove: Directory not empty: "results/711a35ed-818e-4084-ab43-47531fdd8d11"
flock
コマンドに出くわしたことがありますか?
ファイルシステム内でファイルロックを提供するため、シェルスクリプトで使用できます。
---編集
上記の最初の回答の後、元の投稿にさらに編集が加えられ、nfsを使用している複数のマシンでの競合状態のコメントと最終的な提案が追加され、シナリオが考案されました。このシナリオは@alexisによって挑戦されましたが、私はそれに対して返信する価値があると思いました。
@alexis 1つのファイルシステム内で作業する場合は正しいですが、nfsでマウントされたファイルシステムが関係する場合、状況はより複雑になります。
OPからは、マシン/サーバー/クライアントのnfsバージョンのどの組み合わせが関係しているかは正確にはわかりませんが、「「touch-rm」よりも優れた同期メカニズムが必要であり、実際、OPはそれが一種の動作を示唆している」と言うだけで十分だと思いました。しかし、失敗する可能性は15kに1つです。そこで、同期またはコーディングするためのより良い方法を見つけることを提案しました。
この件について少し調べたところ、nfsに「欠陥」があり、ファイルの削除がnfs全体で期待どおりに機能しないことを示す参照がいくつか見つかりました。さらに、nfs v3とv4の間には違いがあり、特にこの欠陥に対処するために、nfs4は異なる動作をする可能性がありますが、そうでない場合は古いクライアントとの互換性が損なわれます。
この nfs document は、問題を回避するコードに導入された愚かな名前変更とrfcを説明する状況を要約しています 5661 NFS 4.1 詳細を提供します。
-編集2
上記の参考文献からの1つの段落の抜粋:
NFSプロトコルの設計により、ファイルを名前空間から削除しても、アプリケーションで引き続き使用する方法はありません。したがって、NFSクライアントは、プロトコルにすでに存在するものを使用してこれをエミュレートする必要があります。開いているファイルがリンク解除されている場合、NFSクライアントはそのファイルの名前を「.nfsXXXXX」のような特別な名前に変更します。これにより、使用中のファイルが「非表示」になります。これは「愚かな名前変更」として知られています。 NFSサーバーはこの動作とは何の関係もないことに注意してください。