私のfsはmvアトミックですか?


12

mvfs(ext4)がアトミックかどうかを確認するにはどうすればよいですか?

OSはRed Hat Enterprise Linux Serverリリース6.8です。

一般的に、これを確認するにはどうすればよいですか?私は周りを見回しましたが、私のOSが標準のPOSIXであるかどうかはわかりませんでした。


試しましたstraceか?
ワイルドカード

回答:


8

興味深いことに、答えは「場合によります」のようです。

明確にするために、mv指定されている

mvユーティリティはと同等の操作を実行しなければならないrename() 機能を

リネーム機能仕様の状態:

このrename()関数は、ISO C標準で定義されているものと同等の通常のファイルです。ここに含めると、その定義が展開され、ディレクトリ上のアクションが含まれ、新しいパラメーターが既存のファイルに名前を付けるときの動作が指定されます。その仕様では、関数のアクションがアトミックであることが必要です。

しかし、最新のISO C仕様のためのrename()状態:

7.21.4.2 rename関数

あらすじ

#include <stdio.h>
int rename(const char *old, const char *new);

説明

このrename関数は、が指す文字列を名前とするファイルを、が指す文字列oldによって指定される名前で認識できるようにしnewます。指定されたファイルにoldは、その名前でアクセスできなくなりました。関数newが呼び出される前に、が指す文字列で指定されたファイルが存在するrename場合、動作は実装定義です。

戻り値

このrename関数は、操作が成功した場合はゼロを返し、失敗した場合はゼロ以外を返します。この場合、ファイルが以前に存在していた場合でも、元の名前で認識されます。

驚くべきことに、原子性の明示的な要件はないことに注意してください。公開されている最新のC標準のどこかで必要になる可能性がありますが、それを見つけることができませんでした。誰かがそのような要件を見つけることができるなら、編集とコメントは大歓迎です。

参照してください。名前の変更()アトミックですか?

あたり、Linuxのmanページ

newpathすでに存在する場合は、アトミックに置き換えられるため、アクセスしようとする別のプロセス newpathがそれを見つけられなくなることはありません。ただし、名前が変更されるファイルoldpathとその両方をnewpath参照するウィンドウが表示される可能性があります。

Linuxのmanページでは、ファイルの置き換えはアトミックになると主張されています。

ただし、原子性をテストおよび検証することは非常に難しい場合があります。「mvがアトミックかどうかを確認するにはどうすればよいですか」の使用における意味が明確ではありません。アトミックな要件/仕様/ドキュメントが必要ですか、それとも実際にテストする必要がありますか?

また、上記で、2つのオペランドファイル名が同じファイルシステムにあると想定しています。それmvを強制するユーティリティの標準的な制限は見つかりません。


私は動きが原子的であることを確認する必要があります。テストはこれを受け入れるのに十分ですか?わかりません。はい、同じfs(ext4からext4)で作業しています。
Tizianoreica 2016年

1
POSIXは原子性も保証していませんが、Linuxは、ほとんどのUNIXバリアントと同様に、ext4などの「ネイティブ」ファイルシステムに対して保証しています。
Gilles「SO-邪悪なことをやめなさい」

1
ISO Cがシステム全体ではなく1つのプログラムの動作のみを定義していることを考えると、rename原子性について何かを言うのは奇妙です。
Gilles「SO-悪をやめなさい」

3
私は前の文を参照して「その仕様」を読みます(「ここに含める...は、新しいパラメーターがすでに存在するファイルを指定するときの動作を指定します」)、これはPOSIXドキュメントの以前の部分を参照します(「新しい名前のリンクは全体を通して他のスレッドから見える状態を維持します...そして、新旧によって参照されるファイルを参照します... ")。言い換えると、POSIXはISO C標準の実装を約束し、ISO Cが提供する以上の追加の保証を行います。その解釈は役に立ちますか?
SimonJ 2017年

1
@Tizianoreica私はこれが古い投稿であることを知っていますが、あなたのコメントを見ただけで、明確にすべきだと思いました:名前を変更するためには、実際のファイルシステムは同じである必要があります。同じタイプのファイルシステムだけではありません。たとえば/、ext4 fsと/tmp別のext4 fsがある場合、一方から他方へアトミックにmv することはできません
Wodin

0

mvrenameシステムコールに基づいており、rename()アトミックです。マンページを見ることができますrename(2)

rename()はアトミックか」で答えを見つけることができます stackoverflow。

どのようなfsを使いましたか?


fsはext4です-osはすでに指定されています。
Tizianoreica 2016年

-1

システムコールとそれらの原子性をチェックすることに加えて、おそらくinotify-toolsそれはテストとして役立ちますが、それが原子性の保証された証明であるかどうかはわかりません。

2つのシェルを開きます。それらのいずれかで移動のターゲットディレクトリを監視します。

inotifywait -m target/

他のディレクトリにファイルを移動します。

mv foobar target/

inotifywait一つだけの行を表示する必要があります。

target/ MOVED_TO foobar

次のような複数行のメッセージを生成するls target/and への応答と比較すると、アトミックtouch target/aなようです。

# the response to ls target/
target/ OPEN,ISDIR 
target/ ACCESS,ISDIR 
target/ CLOSE_NOWRITE,CLOSE,ISDIR 

PS

少なくとも、ファイルの非同期マルチプロセス連携はinotify(実質的にアトミック)で安全であることを示しています。どのような場合でもinotify、操作後に最後のシグナルを与えた後でのみ応答します。たとえば、プロデューサー/コンシューマーのセットアップは、を使用して簡単かつ安全に実装できますinotify

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.