Garantire un ordinamento di directory ripetibile in Linux


16

Gestisco una società di integrazione continua ospitata e eseguiamo il codice dei nostri clienti su Linux. Ogni volta che eseguiamo il codice, lo eseguiamo in una macchina virtuale separata. Un problema frequente che si presenta è che i test di un cliente a volte falliscono a causa dell'ordinamento delle directory del loro codice verificato sulla VM.

Lasciami andare più nel dettaglio. Su OSX, il file system HFS + assicura che le directory vengano sempre attraversate nello stesso ordine. I programmatori che usano OSX presumono che se funziona sulla propria macchina, deve funzionare ovunque. Ma spesso non funziona su Linux, perché i file system linux non offrono garanzie di ordinamento quando si attraversano le directory.

Ad esempio, considera che ci sono 2 file, a.rb, b.rb. a.rb definisce MyObjecte b.rb usa MyObject. Se a.rb viene caricato per primo, tutto funzionerà. Se b.rb viene caricato per primo, tenterà di accedere a una variabile non definita MyObjecte fallirà.

Ma la cosa peggiore è che non sempre fallisce. Poiché l'ordinamento del file system su Linux non è ordinato, sarà un ordine diverso su macchine diverse. Questo è peggio perché a volte i test passano e a volte falliscono. Questo è il peggior risultato possibile.

Quindi la mia domanda è: c'è un modo per rendere ripetibile l'ordinamento dei file system. Qualche bandiera su ext4 forse, che dice che attraverserà sempre le directory in qualche ordine? O forse un file system diverso che ha questa garanzia?



Oltre alle risposte veramente vere - qual è l'ordine "corretto"? Ordinati alfanumericamente? O da CTIME? Arbitrariamente magicamente? In che modo i clienti garantiscono questo ordine al momento della distribuzione? Come dovrebbero essere trasferite queste informazioni magiche sull'ordine?
Michuelnik,

@Michuelnik Non esiste un vero ordine corretto, ma qualcosa di ripetibile significherebbe ottenere sempre lo stesso risultato, il che sarebbe meglio di niente. Idealmente, utilizzeremmo l'ordinamento HFS +, che penso sia alfabetico.
Paul Biggar,

@Michuelnik Questo problema riguarda i test molto più della distribuzione La distribuzione avviene principalmente su Linux, ma se qualcosa fallisce lo risolveranno. I test vengono eseguiti principalmente su OSX, quindi se qualcosa non riesce deve essere colpa nostra.
Paul Biggar,

1
@PaulBiggar: capisco il tuo problema e non posso offrire una buona soluzione (a meno che tu non riesca a trovare un modo per rilevare se l'ordine dei file è la causa del problema). Ma non sono d'accordo sul fatto che "un successo ripetibile è meglio di un errore incoerente": se il mio ambiente di sviluppo (e CI) ha un successo ripetibile ma la mia piattaforma di distribuzione ha il sindaco "fallimento inaffidabile", allora sono davvero in una brutta posizione. Vorrei piuttosto vedere il fallimento inaffidabile il più presto possibile (idealmente sul mio sistema di sviluppo, ma almeno sul mio sistema CI).
Joachim Sauer, l'

Risposte:


16

So che non è la risposta che stai cercando, ma credo che la soluzione corretta sia quella di evitare a seconda dell'ordinamento dei file in una directory. Forse è sempre coerente in tutti i filesystem HFS + e forse potresti trovare un modo per renderlo coerente in ext4 o in qualche altro filesystem, ma a lungo termine ti costerà più problemi di quanti ne salverà. Qualcun altro che utilizza l'applicazione avrà una brutta sorpresa quando non si rendono conto che è compatibile solo con alcuni tipi di filesystem e non altri. L'ordine può cambiare se un file system viene ripristinato dal backup. Probabilmente incontrerai problemi di compatibilità perché l'ordine coerente HFS + e l'ordine coerente ext4 potrebbero non essere gli stessi.

Basta leggere tutte le voci della directory e ordinare l'elenco lessicograficamente prima di usarlo. Proprio come lsfa.

Lei menziona i file a.rbe b.rb, ma se stiamo parlando di file di origine del linguaggio di programmazione, ogni file non dovrebbe già essere responsabile di garantire che importa tutte le sue dipendenze?


Il problema è che non abbiamo scritto il codice che stiamo eseguendo. Eseguiamo il codice clienti e non abbiamo alcun controllo su come è stato scritto il codice. Quindi il nostro problema è davvero che ci stiamo incolpando del problema, perché funziona sulla loro macchina ma non sulla nostra. Se potessimo forzare tutti a scrivere il codice corretto, lo faremmo, ma non è in nostro potere :)
Paul Biggar,

10
@PaulBiggar: ma non è "funziona qui ma non in produzione" esattamente il problema che CI dovrebbe risolvere? In altre parole: "Perché il mio codice si rompe nel tuo sistema?" dovrebbe essere risposto con "Perché stiamo facendo esattamente quello che ci stai chiedendo!" ;-)
Joachim Sauer il

4
Non conosco nessun altro, ma quando il codice funziona sulla mia macchina e poi fallisce su un CI o su un checkout di un collega, presumo immediatamente che c'è qualcosa che dipende dalla piattaforma o dall'ambiente che devo correggere ...
matt5784

1
Sicuramente lo sviluppo dell'applicazione su una piattaforma che non userai in produzione è una cattiva idea? Falli sviluppare sulla stessa piattaforma per cui stanno scrivendo.
Matthew Ife,

2
Non sono d'accordo. Penso che sia un'ottima idea. Fa apparire molti più errori durante il passaggio dallo sviluppo ai server di test. E quindi il codice è molto più robusto prima di spostarsi sui server di produzione. Quindi in un mondo corretto o teorico è molto meglio. Questo è lo stesso mondo in cui puoi costringere tutti a scrivere il codice corretto, noto anche come terra dei sogni.
Hennes,

5

La chiamata POSIX in Linux readdir () non garantisce alcun ordinamento coerente. Se si desidera risultati ordinati, l'applicazione che gestisce i file è responsabile per ordinare come vengono presentati alle funzioni di chiamata.

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

Ora, poiché hai detto che questo era il codice del tuo cliente e non puoi risolverlo, puoi eventualmente modificare le librerie collegate che vengono utilizzate per fornire una chiamata readdir () coerente. Ciò richiederebbe un po 'di lavoro e varrebbe la sua domanda. Per un rapido riferimento a ciò, consultare http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .

La modifica di questo potrebbe generare alcune altre serie di problemi che potrei non essere in grado di prevedere. Siete fortemente avvisati, ma potrebbe essere una soluzione se il vostro cliente non può essere adeguatamente istruito.


1

Informare il cliente che esiste una dipendenza inerente all'ordine che deve essere esplicitamente dichiarata. Offrire di aiutare il cliente a esprimere la dipendenza in modo tale che una compilazione funzioni su tutti i sistemi e fare in modo che il cliente adotti il ​​flusso modificato che acquisisce la dipendenza dell'ordine di compilazione.

Se il cliente desidera essere in grado di compilare su altre macchine, sarebbe scortese da parte sua pensare che sia gratuito.


Lo faremo sicuramente. Tuttavia, sarebbe utile se diventassero effettivamente nostri clienti per poterlo fare.
Paul Biggar,

0

Modern Linux (ext4) aggiunge un indice B-tree per gli elenchi di file. Uno dei suoi effetti è l'ordine dei file predefinito dipende da un hash dei loro nomi.

Per disabilitare questa funzione usare:

tune2fs -O ^ dir_index

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.