web-dev-qa-db-ja.com

Linuxでの反復可能なディレクトリ順序の確保

私は ホステッド継続的インテグレーション 会社を運営しており、Linuxでお客様のコードを実行しています。コードを実行するたびに、別の仮想マシンで実行します。頻繁に発生する問題は、VMでチェックアウトされたコードのディレクトリ順序が原因で、顧客のテストが失敗することがあることです。

詳細を説明します。 OSXでは、HFS +ファイルシステムにより、ディレクトリが常に同じ順序でトラバースされます。 OSXを使用するプログラマーは、OSXが自分のマシンで機能する場合、どこでも機能する必要があると考えています。しかし、Linuxファイルシステムはディレクトリをトラバースするときに順序の保証を提供しないため、Linuxでは機能しないことがよくあります。

例として、a.rb、b.rbの2つのファイルがあるとします。 a.rbはMyObjectを定義し、b.rbはMyObjectを使用します。 a.rbが最初にロードされると、すべてが機能します。 b.rbが最初にロードされると、未定義の変数MyObjectにアクセスしようとして失敗します。

しかし、これより悪いのは、それが常に失敗するとは限らないということです。 Linuxでのファイルシステムの順序は順序付けられていないため、マシンによって順序が異なります。テストが成功することもあれば失敗することもあるため、これはさらに悪いことです。これは最悪の結果です。

だから私の質問は、ファイルシステムの順序付けを繰り返し可能にする方法はあるかということです。おそらくext4へのフラグは、常に何らかの順序でディレクトリをトラバースするということですか?または、この保証がある別のファイルシステムですか?

16
Paul Biggar

私はそれがあなたが探している答えではないことを知っていますが、正しい解決策はディレクトリ内のファイルの順序に応じてavoidにすることだと思います。多分それはすべてのHFS +ファイルシステム全体で常に一貫性があり、ext4や他のファイルシステムでも一貫性を保つ方法を見つけることができるかもしれませんが、長期的には保存するよりも多くのトラブルが発生します。アプリケーションを使用している他の誰かが、それが特定のタイプのファイルシステムとのみ互換性があり、他のタイプとは互換性がないことに気付いていない場合、厄介な驚きに遭遇します。ファイルシステムがバックアップから復元された場合、順序が変わる可能性があります。 HFS +の一貫した順序とext4の一貫した順序が異なる可能性があるため、互換性の問題が発生する可能性があります。

使用する前に、すべてのディレクトリエントリを読み取り、リストを辞書式に並べ替えるだけです。 lsと同じように。

ファイルについて言及しているa.rbおよびb.rb、しかしプログラミング言語のソースファイルについて話している場合、各ファイルはすべての依存関係を確実にインポートする必要がありますか?

16
Celada

Linux readdir()でのPOSIX呼び出しは、一貫した順序を保証するものではありません。順序付けられた結果が必要な場合は、ファイルを処理しているアプリケーションが、呼び出し元の関数にファイルがどのように表示されるかを順序付けます。

https://stackoverflow.com/questions/8977441/does-readdir-guarantee-an-order

これは顧客のコードであり、修正できないと言ったので、一貫したreaddir()呼び出しを提供するために使用されるリンクライブラリを変更できる可能性があります。それにはいくらかの作業が必要であり、それ自体の質問に値するでしょう。これへのクイックリファレンスについては、 http://www.ibm.com/developerworks/linux/library/l-glibc/index.html を参照してください。

これを変更すると、私が予測できない可能性のある他の一連の問題が発生する可能性があります。あなたは強く警告されますが、あなたの顧客が適切に教育されないならば、それは解決策かもしれません。

6
Jeff Ferland

明確に述べる必要のある固有の注文依存関係があることを顧客に説明します。コンパイルがすべてのシステムで機能するように顧客が依存関係を表現し、コンパイル順序の依存関係をキャプチャする変更されたフローを顧客に採用させることを提案します。

顧客が他のマシンでコンパイルできることを望んでいるなら、それが無料で提供されると考えるのは彼らを怒らせるでしょう。

1
Paddy3118

最新のLinux(ext4)は、ファイルリストのBツリーインデックスを追加します。彼の効果の1つは、デフォルトのファイルの順序が名前のハッシュに依存することです。

この機能を無効にするには、次を使用します。

tune2fs -O ^ dir_index

0
Yup