Saya menjalankan perusahaan integrasi berkesinambungan yang di-host , dan kami menjalankan kode pelanggan kami di Linux. Setiap kali kami menjalankan kode, kami menjalankannya di mesin virtual yang terpisah. Masalah yang sering muncul adalah bahwa tes pelanggan kadang-kadang akan gagal karena pemesanan direktori kode mereka diperiksa pada VM.
Biarkan saya membahas lebih detail. Pada OSX, sistem file HFS + memastikan bahwa direktori selalu dilalui dalam urutan yang sama. Pemrogram yang menggunakan OSX berasumsi bahwa jika bekerja pada mesin mereka, itu harus bekerja di mana-mana. Tetapi sering tidak bekerja di Linux, karena sistem file linux tidak menawarkan jaminan pemesanan ketika melintasi direktori.
Sebagai contoh, perhatikan ada 2 file, a.rb, b.rb. a.rb mendefinisikan MyObject
, dan b.rb menggunakan MyObject
. Jika a.rb dimuat terlebih dahulu, semuanya akan berfungsi. Jika b.rb dimuat lebih dulu, ia akan mencoba mengakses variabel yang tidak ditentukan MyObject
, dan gagal.
Tetapi lebih buruk dari ini, adalah bahwa hal itu tidak selalu gagal. Karena pemesanan sistem file di Linux tidak dipesan, itu akan menjadi urutan yang berbeda pada mesin yang berbeda. Ini lebih buruk karena kadang-kadang tes lulus, dan kadang-kadang gagal. Ini adalah hasil terburuk yang mungkin terjadi.
Jadi pertanyaan saya adalah, apakah ada cara untuk membuat pemesanan sistem file berulang. Beberapa flag ke ext4 mungkin, yang mengatakan itu akan selalu melintasi direktori dalam urutan tertentu? Atau mungkin sistem file lain yang memiliki jaminan ini?
sumber
Jawaban:
Saya tahu itu bukan jawaban yang Anda cari, tetapi saya percaya solusi yang tepat adalah menghindari bergantung pada pemesanan file dalam direktori. Mungkin itu selalu konsisten di semua sistem file HFS +, dan mungkin Anda bisa menemukan cara untuk membuatnya konsisten di ext4 atau sistem file lain juga, tetapi itu akan membuat Anda lebih banyak kesulitan dalam jangka panjang daripada menghemat. Orang lain yang menggunakan aplikasi Anda akan terkejut ketika mereka tidak menyadari bahwa itu hanya kompatibel dengan beberapa jenis sistem file dan bukan yang lain. Urutan dapat berubah jika sistem file dipulihkan dari cadangan. Anda mungkin akan mengalami masalah kompatibilitas karena urutan konsisten HFS + dan urutan konsisten ext4 mungkin tidak sama.
Cukup baca semua entri direktori dan urutkan daftar secara leksikografis sebelum menggunakannya. Sama seperti
ls
halnya.Anda menyebutkan file
a.rb
danb.rb
, tetapi jika kita berbicara tentang file sumber bahasa pemrograman, bukankah setiap file sudah bertanggung jawab untuk memastikan bahwa itu mengimpor semua dependensinya?sumber
Panggilan POSIX di Linux readdir () tidak menjamin pemesanan yang konsisten. Jika Anda ingin hasil yang dipesan, aplikasi yang menangani file bertanggung jawab untuk memesan bagaimana mereka disajikan ke fungsi panggilan.
/programming/8977441/does-readdir-guarantee-an-order
Sekarang, karena Anda mengatakan ini adalah kode pelanggan Anda dan Anda tidak dapat memperbaikinya, Anda mungkin dapat mengubah pustaka yang ditautkan yang digunakan untuk menyediakan panggilan readdir () yang konsisten. Itu akan membutuhkan pekerjaan dan layak untuk ditanyakan sendiri. Untuk referensi cepat untuk itu, lihat http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .
Mengubah ini bisa menelurkan beberapa seri masalah lain yang mungkin tidak bisa saya ramalkan. Anda sangat berhati-hati, tetapi ini bisa menjadi solusi jika pelanggan Anda tidak dapat dididik dengan baik.
sumber
Didik pelanggan Anda bahwa ada ketergantungan pesanan bawaan yang harus dinyatakan secara eksplisit. Tawarkan untuk membantu pelanggan mengekspresikan ketergantungan sedemikian rupa sehingga kompilasi bekerja pada semua sistem dan minta pelanggan mengadopsi aliran yang berubah yang menangkap ketergantungan urutan kompilasi.
Jika pelanggan ingin dapat mengkompilasi pada mesin lain maka itu akan menjadi kesalahan mereka untuk berpikir bahwa itu datang secara gratis.
sumber
Linux Modern (ext4) menambahkan indeks B-tree untuk daftar file. Salah satu efeknya adalah urutan file default tergantung pada hash nama mereka.
Untuk menonaktifkan fitur ini gunakan:
sumber