Назад | Перейти на главную страницу

Обеспечение повторяемого порядка каталогов в Linux

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

Позвольте мне остановиться подробнее. В OSX файловая система HFS + гарантирует, что каталоги всегда просматриваются в одном и том же порядке. Программисты, использующие OSX, предполагают, что если он работает на их машине, он должен работать везде. Но это часто не работает в Linux, потому что файловые системы Linux не предлагают гарантий упорядочивания при перемещении по каталогам.

В качестве примера рассмотрим два файла: a.rb, b.rb. a.rb определяет MyObject, а b.rb использует MyObject. Если сначала загрузить a.rb, все заработает. Если сначала загружается b.rb, он попытается получить доступ к неопределенной переменной MyObject, и потерпят неудачу.

Но хуже того, что это не всегда просто терпит неудачу. Поскольку порядок файловой системы в Linux не упорядочен, на разных машинах он будет другим. Это хуже, потому что иногда тесты проходят, а иногда нет. Это наихудший результат.

Итак, мой вопрос: есть ли способ сделать упорядочение файловой системы повторяемым. Возможно, какой-то флаг для ext4, который говорит, что он всегда будет перемещаться по каталогам в каком-то порядке? Или, может быть, другая файловая система с этой гарантией?

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

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

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

Вызов POSIX в Linux readdir () не гарантирует согласованного порядка. Если вам нужны упорядоченные результаты, приложение, обрабатывающее файлы, отвечает за упорядочение того, как они представляются вызывающим функциям.

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

Теперь, поскольку вы сказали, что это код вашего клиента и вы не можете его исправить, вы можете изменить связанные библиотеки, которые используются для обеспечения согласованного вызова readdir (). Это потребует некоторой работы и стоит отдельного вопроса. Для быстрого ознакомления с этим см. http://www.ibm.com/developerworks/linux/library/l-glibc/index.html.

Изменение этого может породить ряд других проблем, которые я, возможно, не смогу предвидеть. Вас строго предостерегают, но это может быть решением, если ваш клиент не может быть должным образом обучен.

Объясните своему клиенту, что существует неотъемлемая зависимость порядка, которую следует четко указать. Предложите помочь клиенту выразить зависимость таким образом, чтобы компиляция работала во всех системах, а заказчик принял измененный поток, который фиксирует зависимость порядка компиляции.

Если заказчик хочет иметь возможность компилировать на других машинах, то с их стороны было бы грубо думать, что это происходит бесплатно.

Современный Linux (ext4) добавляет индекс B-tree для списков файлов. Один из его следствий - порядок файлов по умолчанию зависит от хеша их имен.

Чтобы отключить эту функцию, используйте:

tune2fs -O ^ dir_index