Забезпечення впорядкування повторюваних каталогів у Linux


16

Я керую компанією безперервної інтеграції , і ми запускаємо код наших клієнтів в Linux. Кожен раз, коли ми запускаємо код, ми запускаємо його в окремій віртуальній машині. Часта проблема, яка виникає, полягає в тому, що тести замовника іноді виходять з ладу через впорядкування каталогів свого коду, перевіреного на VM.

Дозвольте детальніше розібратися. У OSX файлова система HFS + забезпечує, щоб каталоги завжди проходили в одному порядку. Програмісти, які використовують OSX, припускають, що якщо він працює на їх машині, він повинен працювати всюди. Але це часто не працює в Linux, оскільки файлові системи Linux не надають гарантій замовлення під час проходження каталогів.

Як приклад, розглянемо, що є 2 файли, a.rb, b.rb. a.rb визначає MyObject, а b.rb використовує MyObject. Якщо a.rb завантажений спочатку, все буде працювати. Якщо b.rb завантажується спочатку, він спробує отримати доступ до невизначеної змінної MyObjectта не вдасться.

Але гірше, ніж це, - це не завжди просто не вдається. Оскільки замовлення файлової системи в Linux не впорядковане, це буде різний порядок на різних машинах. Це гірше, тому що іноді тести проходять, а іноді вони провалюються. Це найгірший можливий результат.

Отже, моє питання полягає в тому, чи є спосіб зробити замовлення файлової системи повторюваним. Можливо, якийсь прапор ext4, який говорить про те, що він завжди буде переходити в каталогах у певному порядку? Або, можливо, інша файлова система, яка має цю гарантію?



Окрім справді правдивих відповідей - що таке «правильний» порядок? Просто алфавітно-цифрові сортовані? Або CTIME? Довільно магічно? Як клієнти забезпечують це замовлення під час розгортання? Як слід передавати вам цю магічну інформацію про замовлення?
Мічуельник

@Michuelnik Немає справжнього правильного порядку, але щось повторюване означало б, що ми отримуємо один і той же результат кожного разу, що було б краще, ніж нічого. В ідеалі ми б використовували замовлення HFS +, що, на мою думку, є алфавітним.
Пол Біггар

@Michuelnik Ця проблема впливає на тести набагато більше, ніж розгортання. В основному це відбувається в Linux, але якщо щось не вдасться, вони це виправлять. Тести здебільшого працюють на OSX, тому якщо щось не вдалося, ми повинні бути винні.
Пол Біггар

1
@PaulBiggar: Я розумію вашу проблему і не можу запропонувати хорошого рішення (якщо тільки ви не зможете знайти спосіб визначити, чи є причиною проблеми замовлення файлів). Але я не згоден, що "повторюваний успіх кращий, ніж непостійний збій": Якщо середовище моєї розробки (та CI) має успіх, що повторюється, але моя платформа розгортання має синдром "ненадійного відмови", то я справді в поганому місці. Я вважаю за краще якомога швидше побачити недостовірний збій (в ідеалі на моїй системі розвитку, але принаймні на моїй системі ІС).
Йоахім Зауер

Відповіді:


16

Я знаю, що це не відповідь, яку ви шукаєте, але я вважаю, що правильне рішення - уникати залежно від впорядкування файлів у каталозі. Можливо, це завжди послідовно у всіх файлових системах HFS +, і, можливо, ви можете знайти спосіб зробити його послідовним і в ext4, або в будь-якій іншій файловій системі, але це буде коштувати вам більше проблем у довгостроковій перспективі, ніж заощадить. Хтось, хто користується вашим додатком, зіткнеться з неприємним сюрпризом, коли не зрозуміє, що він сумісний лише з деякими типами файлових систем, а не з іншими. Порядок може змінитися, якщо файлова система відновиться із резервного копіювання. Ви, ймовірно, зіткнетеся з проблемами сумісності, оскільки послідовний порядок HFS + та послідовний порядок ext4 можуть бути не однаковими.

Просто прочитайте всі записи в каталозі та сортуйте список лексикографічно перед його використанням. Так само, як і lsробить.

Ви згадуєте файли a.rbі b.rb, але якщо ми говоримо про програмування мова вихідних файлів, не повинні кожен файл вже несе відповідальність за забезпечення того, що вона імпортує всю його залежність?


Проблема полягає в тому, що ми не написали код, який ми виконуємо. Ми запускаємо код клієнтів, і не маємо контролю над тим, як цей код був написаний. Тож наша проблема полягає в тому, що ми звинувачуємось у цій проблемі, оскільки вона працює на їх машині, але не на нашій. Якби ми могли змусити всіх написати правильний код, ми б, але це не в наших силах :)
Пол Біггар

10
@PaulBiggar: але чи не "це працює тут, але не у виробництві" саме проблема, яку повинен вирішити CI? Іншими словами: "Чому мій код ламається у вашій системі?" слід відповісти "Тому що ми робимо саме те, про що ви просите!" ;-)
Йоахім Зауер

4
Я не знаю ні про кого іншого, але коли код працює на моїй машині, а потім виходить з ладу на CI або касі колеги, я одразу припускаю, що є щось, що залежить від платформи чи середовища, що мені потрібно виправити ...
matt5784

1
Невже розробка програми на платформі, яку ви не будете використовувати у виробництві - це погана ідея? Запропонуйте їм розвиватися на тій самій платформі, для якої вони пишуть.
Метью Іфе

2
Я не погоджуюсь. Я думаю, що це чудова ідея. Це робить набагато більше помилок під час переходу від розробки до тестових серверів. І таким чином код набагато міцніший, перш ніж він переходить на виробничі сервери. Тож у правильному чи теоретичному світі це набагато краще. Це той самий світ, де ви можете змусити всіх написати правильний код, також відомий як країна мрій.
Геннес

5

Дзвінок POSIX в Linux readdir () не гарантує послідовного замовлення. Якщо ви хочете впорядкувати результати, програма, яка обробляє файли, відповідає за впорядкування того, як вони представлені для функцій виклику.

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

Тепер, оскільки ви сказали, що це код вашого клієнта, і ви не можете його виправити, ви, можливо, зможете змінити пов'язані бібліотеки, які використовуються для забезпечення послідовного виклику readdir (). Це зайняло б якусь роботу і варто було б мати власне питання. Швидку інформацію про це див . У розділі http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .

Змінення цього може породити деякі цілі низки питань, які я, можливо, не зможу передбачити. Ви наполегливо застерігаєте, але це може бути рішенням, якщо ваш клієнт не може бути належним чином освічений.


1

Навчіть свого замовника, що існує властива залежність замовлення, яку слід чітко вказати. Запропонуйте допомогти замовнику висловити залежність таким чином, щоб компіляція працювала на всіх системах і змусила клієнта прийняти змінений потік, який фіксує залежність порядку компіляції.

Якщо замовник хоче мати можливість компілювати на інших машинах, то було б смішно думати, що це безкоштовно.


Ми обов'язково будемо це робити. Однак було б корисно, якби вони насправді стали нашими замовниками, щоб ми могли це зробити.
Пол Біггар

0

Сучасний Linux (ext4) додає індекс B-дерева для списків файлів. Одним з його ефектів є те, що порядок файлів за замовчуванням залежить від хешу їхніх імен.

Щоб відключити цю функцію, використовуйте:

tune2fs -O ^ dir_index

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.