Linuxで繰り返し可能なディレクトリの順序を保証する


16

私は、実行ホストされた継続的インテグレーション会社を、私たちは、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へのフラグは、それは常にディレクトリをある順序でトラバースするということですか?それとも、この保証がある別のファイルシステムですか?



本当に本当の答えのほかに-何である「正しい」順序は?アルファベット順にソートされていますか?またはCTIMEで?勝手に魔法?顧客は、展開時にこの順序をどのように保証しますか?この魔法の注文情報はどのようにあなたに転送されるべきですか?
ミシェルニック

@Michuelnik正しい順序はありませんが、繰り返し可能なものは、毎回同じ結果が得られることを意味します。理想的には、HFS +の順序を使用します。これはアルファベット順だと思います。
ポールビガー

@Michuelnikこの問題は、デプロイメントよりもはるかに多くのテストに影響を及ぼします。デプロイメントはほとんどの場合Linuxで発生しますが、何かが失敗した場合は修正されます。テストは主にOSXで実行されるため、何かが失敗した場合は私たちの責任であるに違いありません。
ポールビガー

1
@PaulBiggar:私はあなたの問題を理解しており、良い解決策を提供することはできません(ファイルの順序が問題の原因であるかどうかを検出する方法を見つけられない限り)。しかし、「再現性のある成功は一貫性のない失敗よりも優れている」という意見に同意しません:開発(およびCI)環境で再現性のある成功があり、展開プラットフォームに「信頼性のない失敗」のシンドロームがある場合、私は本当に悪い場所にいます。私はと思い、むしろ(理想的には私の開発システム上ではなく、できるだけすぐに信頼できない不具合を参照してください少なくとも私のCIシステム上で)。
ヨアヒムザウアー

回答:


16

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

すべてのディレクトリエントリを読み取り、リストを辞書式に並べ替えてから使用します。ちょうどlsそうです。

ファイルa.rbb.rbに言及しますが、プログラミング言語のソースファイルについて話している場合、各ファイルがすべての依存関係をインポートすることを保証する必要はありませんか?


問題は、実行中のコードを記述しなかったことです。お客様のコードを実行しますが、コードの作成方法を制御することはできません。ですから、私たちの問題は、問題を非難しているということです。なぜなら、それは彼らのマシンでは機能するが、私たちのマシンでは機能しないからです。すべての人に正しいコードを書くように強制できたとしても、それは私たちの力の範囲内ではありません:)
ポールビガー

10
@PaulBiggar:しかし、「それは生産に、ここではなく、走る」ではありません正確に CIが修正になっていることを問題?言い換えれば、「システムでコードが壊れるのはなぜですか?」「私たちはあなたが私たちに求めていることを正確にやっているからです!」と答えるべきです。;-)
ヨアヒムザウアー

4
私は他の誰かについては知りませんが、コードが私のマシンで動作し、CIまたは同僚のチェックアウトで失敗すると、すぐに修正する必要があるプラットフォームまたは環境に依存する何かがあると思います...
matt5784

1
プロダクションで使用しないプラットフォームでアプリケーションを開発するのは悪い考えですか?彼らが書いているのと同じプラットフォームで開発してもらいます。
マシューイフェ

2
同意しません。素晴らしいアイデアだと思います。開発サーバーからテストサーバーへの移行中に、はるかに多くの障害が発生します。したがって、本番サーバーに移行する前のコードははるかに堅牢です。したがって、正しいまたは理論的な世界では、はるかに優れています。これは、ドリームランドとしても知られる正しいコードを全員に強制的に書かせることができる同じ世界です。
ヘネス

5

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

/programming/8977441/does-readdir-guarantee-an-order

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

これを変更すると、予測できない他の一連の問題が発生する可能性があります。十分に注意する必要がありますが、顧客を適切に教育できない場合には解決策になる可能性があります。


1

明確に述べる必要のある固有の注文依存関係があることを顧客に教育します。すべてのシステムでコンパイルが機能するように顧客が依存関係を表現し、顧客にコンパイル順序の依存関係を取得する変更されたフローを採​​用するように支援します。

顧客が他のマシンでコンパイルできるようにしたい場合、無料で提供されると考えるのは彼らにとって大変なことです。


間違いなくこれを行うつもりです。しかし、彼らが実際に顧客になって、私たちがこれを行うことができれば便利です。
ポールビガー

0

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

この機能を無効にするには:

tune2fs -O ^ dir_index

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