18 votes

Assurer un ordonnancement répétable des répertoires sous linux

Je dirige un intégration continue hébergée et nous exécutons le code de nos clients sur Linux. Chaque fois que nous exécutons le code, nous l'exécutons dans une machine virtuelle distincte. Un problème fréquent est que les tests d'un client échouent parfois à cause de l'ordre des répertoires de son code extrait sur la machine virtuelle.

Permettez-moi d'entrer dans les détails. Sur OSX, le système de fichiers HFS+ garantit que les répertoires sont toujours parcourus dans le même ordre. Les programmeurs qui utilisent OSX partent du principe que si cela fonctionne sur leur machine, cela doit fonctionner partout. Mais souvent, cela ne fonctionne pas sur Linux, car les systèmes de fichiers linux n'offrent pas de garanties d'ordre lors du parcours des répertoires.

Par exemple, considérons qu'il y a 2 fichiers, a.rb, b.rb. a.rb définit MyObject et b.rb utilise MyObject . Si a.rb est chargé en premier, tout fonctionnera. Si b.rb est chargé en premier, il essaiera d'accéder à une variable non définie. MyObject et d'échouer.

Mais le pire, c'est qu'il ne se contente pas toujours d'échouer. Parce que l'ordre du système de fichiers sous Linux n'est pas ordonné, il sera différent sur différentes machines. C'est pire parce que parfois les tests réussissent, et parfois ils échouent. C'est le pire résultat possible.

Ma question est donc la suivante : existe-t-il un moyen de rendre la commande du système de fichiers reproductible ? Un drapeau pour ext4 peut-être, qui dit qu'il traversera toujours les répertoires dans un certain ordre ? Ou peut-être un système de fichiers différent qui a cette garantie ?

2 votes

0 votes

Outre les réponses vraiment vraies - qu'est-ce que est l'ordre "correct" ? Par ordre alphanumérique ? Ou par CTIME ? Arbitrairement, par magie ? Comment les clients s'assurent-ils que cet ordre est respecté lors du déploiement ? Comment ces informations magiques sur l'ordre doivent-elles vous être transmises ?

0 votes

@Michuelnik Il n'y a pas vraiment d'ordre correct, mais quelque chose de répétable signifierait que nous obtenons le même résultat à chaque fois, ce qui serait mieux que rien. Idéalement, nous devrions utiliser l'ordre de HFS+, qui est alphabétique, je pense.

15voto

Greg Dubicki Points 303

Je sais que ce n'est pas la réponse que vous cherchez, mais je crois que la solution correcte est de éviter en fonction de l'ordre des fichiers dans un répertoire. Peut-être que c'est toujours cohérent dans tous les systèmes de fichiers HFS+, et peut-être que vous pourriez trouver un moyen de le rendre cohérent dans ext4 ou un autre système de fichiers également, mais cela vous causera plus de problèmes à long terme que cela n'en sauvera. Une autre personne utilisant votre application aura une mauvaise surprise lorsqu'elle ne réalisera pas qu'elle n'est compatible qu'avec certains types de systèmes de fichiers et pas d'autres. L'ordre peut changer si un système de fichiers est restauré à partir d'une sauvegarde. Vous rencontrerez probablement des problèmes de compatibilité car l'ordre cohérent HFS+ et l'ordre cohérent ext4 peuvent ne pas être les mêmes.

Il suffit de lire toutes les entrées du répertoire et de trier la liste lexicographiquement avant de l'utiliser. Tout comme ls fait.

Vous mentionnez des fichiers a.rb y b.rb Mais si nous parlons de fichiers sources de langages de programmation, chaque fichier ne devrait-il pas déjà être responsable de l'importation de toutes ses dépendances ?

0 votes

Le problème est que nous n'avons pas écrit le code que nous exécutons. Nous exécutons le code des clients et nous n'avons aucun contrôle sur la façon dont le code a été écrit. Notre problème est donc que l'on nous accuse d'être à l'origine du problème, parce qu'il fonctionne sur leur machine mais pas sur la nôtre. Si nous pouvions forcer tout le monde à écrire du code correct, nous le ferions, mais ce n'est pas en notre pouvoir :)

10 votes

@PaulBiggar : mais n'est-ce pas "ça tourne ici mais pas en production" ? exactement le problème que l'IC est censé résoudre ? En d'autres termes : La réponse à la question "Pourquoi mon code se casse-t-il dans votre système ?" devrait être : "Parce que nous faisons exactement ce que vous nous demandez" ;-)

4 votes

Je ne sais pas ce qu'il en est pour les autres, mais lorsqu'un code fonctionne sur ma machine et échoue sur celle d'un collègue ou d'un CI, je suppose immédiatement qu'il y a quelque chose qui dépend de la plate-forme ou de l'environnement et que je dois corriger...

5voto

Tom Points 720

L'appel POSIX dans Linux readdir() ne garantit pas un ordre cohérent. Si vous voulez des résultats ordonnés, l'application qui manipule les fichiers est responsable de l'ordre dans lequel ils sont présentés aux fonctions appelantes.

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

Maintenant, puisque vous avez dit que c'était le code de votre client et que vous ne pouvez pas le réparer, vous pourriez éventuellement modifier les bibliothèques liées qui sont utilisées pour fournir un appel readdir() cohérent. Cela demanderait un peu de travail et mériterait une question à part entière. Pour une référence rapide à ce sujet, voir http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .

Le modifier pourrait engendrer toute une série d'autres problèmes que je ne suis pas en mesure de prévoir. Vous êtes fortement mis en garde, mais cela peut être une solution si votre client ne peut pas être correctement éduqué.

2voto

Yup Points 11

Linux moderne (ext4) ajoute un index B-tree pour les listes de fichiers. Un de ses effets est que l'ordre des fichiers par défaut dépend d'un hash de leurs noms.

Pour désactiver cette fonction, utilisez :

tune2fs -O^dir_index

1voto

Dale Points 453

Expliquez à votre client qu'il existe une dépendance inhérente à la commande qui doit être explicitement indiquée. Proposez au client de l'aider à exprimer cette dépendance de manière à ce qu'une compilation fonctionne sur tous les systèmes et demandez-lui d'adopter le flux modifié qui tient compte de la dépendance de l'ordre de compilation.

Si le client souhaite pouvoir compiler sur d'autres machines, il serait malvenu de sa part de penser que cela est gratuit.

0 votes

Nous allons certainement le faire. Toutefois, il serait utile qu'ils deviennent nos clients pour que nous puissions le faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X