Garantindo uma ordenação de diretório repetível no linux

16

Eu gerencio uma empresa de integração contínua hospedada e gerimos o código de nossos clientes no Linux. Cada vez que executamos o código, o executamos em uma máquina virtual separada. Um problema freqüente que surge é que os testes de um cliente, às vezes, falham por causa da ordem do diretório de seu código verificado na VM.

Deixe-me entrar em mais detalhes. No OSX, o sistema de arquivos HFS + garante que os diretórios sejam sempre percorridos na mesma ordem. Os programadores que usam o OSX presumem que, se ele funcionar em sua máquina, ele deve funcionar em todos os lugares. Mas muitas vezes não funciona no Linux, porque os sistemas de arquivos linux não oferecem garantias de pedidos ao atravessar diretórios.

Como exemplo, considere que existem dois arquivos, a.rb, b.rb. a.rb define MyObject e b.rb usa MyObject . Se a.rb for carregado primeiro, tudo funcionará. Se b.rb for carregado primeiro, ele tentará acessar uma variável indefinida MyObject e falhará.

Mas pior que isso, é que nem sempre falha. Como a ordenação do sistema de arquivos no Linux não é ordenada, será uma ordem diferente em máquinas diferentes. Isso é pior porque às vezes os testes são aprovados e às vezes falham. Este é o pior resultado possível.

Então, minha pergunta é, existe uma maneira de tornar a ordenação do sistema de arquivos repetível. Alguma bandeira para ext4 talvez, que diz que sempre irá percorrer diretórios em alguma ordem? Ou talvez um sistema de arquivos diferente que tenha essa garantia?

    
por Paul Biggar 10.07.2012 / 03:06

4 respostas

16

Eu sei que não é a resposta que você está procurando, mas acredito que a solução correta é evitar dependendo da ordem dos arquivos em um diretório. Talvez seja sempre consistente em todos os sistemas de arquivos HFS +, e talvez você possa encontrar uma maneira de torná-lo consistente no ext4 ou em algum outro sistema de arquivos, mas custará mais problemas a longo prazo do que economizará. Alguém que usa seu aplicativo terá uma surpresa desagradável quando não perceber que é compatível apenas com alguns tipos de sistemas de arquivos e não com outros. A ordem pode mudar se um sistema de arquivos for restaurado a partir do backup. Você provavelmente terá problemas de compatibilidade porque a ordem consistente do HFS + e a ordem consistente do ext4 podem não ser as mesmas.

Basta ler todas as entradas de diretório e classificar a lista lexicograficamente antes de usá-la. Assim como ls faz.

Você menciona os arquivos a.rb e b.rb , mas se estamos falando de arquivos de origem de linguagem de programação, cada arquivo já não deve ser responsável por garantir que ele importe todas as suas dependências?

    
por 10.07.2012 / 03:50
5

A chamada POSIX no Linux readdir () não garante nenhuma ordenação consistente. Se você deseja obter resultados ordenados, o aplicativo que está manipulando arquivos é responsável por ordenar como eles são apresentados às funções de chamada.

link

Agora, como você disse que esse era o código de seu cliente e não pode corrigi-lo, é possível alterar as bibliotecas vinculadas usadas para fornecer uma chamada readdir () consistente. Isso exigiria algum trabalho e valeria a sua própria pergunta. Para uma referência rápida, consulte o link .

Alterar isso pode gerar outra série inteira de problemas que talvez eu não consiga prever. Você é strongmente avisado, mas pode ser uma solução se seu cliente não puder ser educado adequadamente.

    
por 10.07.2012 / 04:02
1

Informe ao seu cliente que existe uma dependência de ordem inerente que deve ser explicitamente declarada. Ofereça-se para ajudar o cliente a expressar a dependência de tal forma que uma compilação funcione em todos os sistemas e faça com que o cliente adote o fluxo alterado que captura a dependência da ordem de compilação.

Se o cliente quiser ser capaz de compilar em outras máquinas, seria grosseiro pensar que ele vem de graça.

    
por 10.07.2012 / 13:15
0

O Modern Linux (ext4) adiciona um índice de árvore B para listas de arquivos. Um de seus efeitos é que a ordem dos arquivos padrão depende de um hash de seus nomes.

Para desativar esse recurso, use:

tune2fs -O^dir_index

    
por 16.03.2015 / 09:25