Stati di wanna-build: una spiegazione

Questa pagina tenta di spiegare qual è il significato di ciascuno degli stati di wanna-build e cosa succede ad un pacchetto quando è in ciascuno stato. È principalmente scritto per i manutentori che stanno cercando di capire come mai il loro pacchetto è o non è stato compilato per una particolare architettura. Inoltre viene fornita una spiegazione per ogni possibile risultato del log.

Se avete bisogno di una ricompilazione del vostro pacchetto, potete richiedere una delle azioni wanna-build

È anche disponibile un diagramma di flusso che rappresenta gli stati di wanna-build; tuttavia esso non copre tutto ciò che è menzionato in questa pagina.

Gli stati di wanna-build

Per ogni architettura supportata da Debian c'è un database wanna-build installato su buildd.debian.org, che contiene lo stato corrente di tutti i pacchetti. Esistono otto stati: Needs-Build, Building, Uploaded, Dep-Wait, BD-Uninstallable, Failed, Not-For-Us e Installed.

Il loro significato è questo:

Needs-Build (compilazione necessaria)
Un pacchetto marcato Needs-Build ha appena visto un upload di una nuova versione da parte del suo mantenitore, ma per un'architettura diversa da quella di questo database di wanna-build; deve quindi essere ricompilato. Se lo stato è Needs-Build vuol dire che non è stato ancora preso da nessun nodo compilatore, ma che presto lo sarà (non appena una macchina è disponibile ed il pacchetto è in cima alla lista). Spesso si dice che un pacchetto è nella coda di ricompilazione quando si vuole intendere che è in stato di Needs-Build.
È interessante notare che la cosa dei Needs-Build non è in realtà una coda FIFO; al contrario, l'ordinamento utilizzato è basato su questi criteri:
  1. Stato precedente di compilazione; pacchetti che sono già stati compilati in passato ricevono una priorità maggiore di quelli nuovi.
  2. Priorità (pacchetti con priorità required sono compilati prima di pacchetti con priorità extra).
  3. Sezione in cui sta il pacchetto. Questo ordinamento è basato su quali sezioni sono considerate più importanti; per esempio, la sezione games viene compilata dopo la sezione base e la sezione libs viene compilata prima della sezione devel.
  4. Ordinamento alfabetico sul nome del pacchetto.
Inoltre, sotto certe condizioni, può accadere che una nodo compilatore non prenda il pacchetto in cima alla cosa; per esempio, se un demone di compilazione non trova i sorgenti di un pacchetto lo rimetterà nella coda (dove tornerà subito nella posizione che aveva prima, ossia in testa), ma lo ignorerà per alcune ore. Un altro esempio dove questo potrebbe accadere è una rete con molti nodi di compilazione; in tal caso i porter per quell'architetture potrebbero scegliere di compilare i pacchetti più grandi sulle macchine più potenti, lasciando i più piccoli alle macchine più lente. Una macchina di compilazione teoricamente può anche richiedere esplicitamente un diverso ordinamento delle sezioni, ma questo in genere non viene fatto.
Ci potrebbero essere altre situazioni in cui potrebbe sembrare che la coda non viene rispettata, ma sono tutte eccezioni.
Building (in compilazione)
Un pacchetto è marcato come Building dal momento in cui un nodo buildd lo prende dalla cima della coda di wanna-build fino al momento in cui l'amministratore del nodo risponde al log. Siccome i pacchetti non sono presi uno per uno, un pacchetto potrebbe essere (ed in genere è) in questo stato anche prima che la compilazione sia effettivamente iniziata; comunque, poiché buildd compila i pacchetti nella propria coda locale secondo un meccanismo FIFO, non dovrebbe mancare molto a che l'operazione venga effettivamente eseguita. Inoltre bisogna notare che lo stato di un pacchetto non viene modificato una volta che la compilazione è terminata, ma solo quando l'amministratore della macchina che lo ha compilato risponde al log di compilazione.
Uploaded (caricato sul server)
Quando una compilazione va a buon successo, un log dell'operazione viene inviato all'amministratore della macchina che l'ha eseguita ed a buildd.debian.org. L'amministratore firmerà digitalmente il file .changes incluso nel log e lo rimanderà al demone di compilazione, che a sua volta caricherà il pacchetto compilato sul server ed imposterà il suo stato a Uploaded. Un pacchetto in questo stato può quindi essere trovato da qualche parte nella coda incoming.
Un nodo di buildd non toccherà più un pacchetto se il suo stato è Uploaded, perlomeno fino a che non sarà disponibile una sua versione o fino a che un porter modificherà manualmente lo stato del pacchetto.
Dep-Wait (aspetta le dipendenze)
Quando un pacchetto fallisce a causa di dipendenze di compilazione non soddisfatte, il mantenitore della macchina che ha provato ad elaborarla invia un'email alla macchina stessa, dicendo di cancellare i sorgenti e di marcale il pacchetto come Dep-Wait sulle dipendenze mancanti. Un pacchetto in questo stato verrà automaticamente marcato, senza necessità di intervento umano, come Needs-Build, una volta che dette dipendenze diventano disponibili.
Tempo fa ogni pacchetto doveva effettivamente vedere almeno un tentativo di compilazione prima che il mantenitore lo mettesse manualmente in stato Dep-Wait. Però nell'agosto del 2005 è stato aggiunto del codice in wanna-build che sposta direttamente un pacchetto da Installed a Dep-Wait, se è il caso.
Ci sono due casi particolari nei quali può accadere che un pacchetto rimanga per sempre in stato Dep-Wait, ossia quando si è sbagliato a scrivere il nome di una dipendenza di compilazione (cosicché il pacchetto rimarrà perpetuamente in Dep-Wait su un pacchetto che non esiste e che mai esisterà) e quando una dipendenza è dichiarata su un pacchetto marcato Non-Per-Noi o nella lista di pacchetti specifici per un'architettura (packages-arch-specific).
Come esempio per l'ultimo caso, si considerino tre pacchetti: foo, che esiste solo per i386, bar, che esiste solo per m68k (e che fa sostanzialmente lo stesso lavoro) e baz, che può essere compilato con foo o con bar. Se il mantenitore di quest'ultimo dovesse dimenticarsi di aggiungere bar alle dipendenze di compilazione e non si accorgesse della notifica che baz è in stato Dep-Wait sul pacchetto non esistente foo per m68k, in tal caso lo stato Dep-Wait per l'architettura m68k dovrebbe essere modificato manualmente da un porter.
BD-Unistallable (dipendenze di compilazione non installabili)
Durante il Debconf9, Joachim Breitner ha avuto l'idea di utilizzare edos-debcheck per verificare l'installabilità delle dipendenze di compilazione senza far entrare necessariamente il pacchetto nello stato Needs-Build. In realtà wanna-build aveva già la capacità di controllare la disponibilità delle dipendenze di compilazione immediate; però non si sarebbe accorto, per esempio, di un pacchetto a che dipendeva da un pacchetto b, che a sua volta dipendeva da c (>= 1.2.3), quando c era ancora alla versione 1.2.2. Chiaramente, in questo caso la compilazione sarebbe fallita molto presto a causa di dipendenze mancanti, ma l'amministratore del nodo di compilazione avrebbe dovuto rendersi conto manualmente di questo fatto, perdendoci un certo tempo. Dopo l'aggiunta dello stato BD-Uninstallable questo non è più un problema. Quando un tuo pacchetto è nello stato BD-Uninstallable, vuol dire che alcune sue dipendenze non sono installabili (possono essere dipendenze dirette o parti mancanti più profonde dell'albero delle dipendenze). Purtroppo questa modifica non rende wanna-build in grado di fornire informazioni su quale pacchetto manca esattamente; per favore, usa edos-debcheck per capirlo. Il problema, comunque, sarà risolto automaticamente non appena le dipendenze richieste diventano disponibili; a quel punto il pacchetto sarà automaticamente spostato nello stato Needs-Build.
Failed (fallito)
Se un tentativo di compilazione fallisce ed il mantenitore del nodo decide che si tratta realmente di un fallimento, e che quindi la compilazione non deve essere tentata nuovamente, il pacchetto è marcato come Failed. Un pacchetto non lascerà questo stato fino a quanto un porter lo deciderà o fino a quando sarà disponibile una nuova versione. Comunque, quando è disponibile una nuova versione di un pacchetto che era marcato Failed nella versione precedente, la macchina di compilazione chiederà al suo amministratore se veramente il pacchetto deve essere elaborato nuovamente o no; questo per evitare di sprecare risorse se è chiaro che l'operazione fallirà di nuovo. Benché dare per fallita una compilazione che non si è provata è molto difficilmente la cosa giusta da fare, l'opzione di farlo è però disponibile al mantenitore del nodo.
Nota che un pacchetto non sarà mai marcato Failed senza l'intervento umano.
Not-For-Us (non per noi)
Certi pacchetti sono specifici per un'architettura; per esempio, lilo, un boot loader per i386, non dovrà essere compilato per alpha, m68k o s390. Comunque, wanna-build non consulta i file di controllo dei pacchetti per generare il suo database, ma solo il nome del pacchetto, la sua sezione, il suo stato precedente e la sua priorità. In questo modo la prima volta che viene caricato un pacchetto esistente solo per alcune architetture un tentativo di compilazione viene lanciato in ogni caso (ma fallisce prima ancora che le dipendenze di compilazione siano scaricare ed installate).
Siccome i nodi di buildd non dovrebbero perdere tempo a cercare di compilare pacchetti inutili per quell'architettura, è necessario un modo per identificare tali pacchetti. La prima soluzione a questo problema è stata Not-For-Us; però, dal momento che è difficile da mantenere, è oggi deprecata; i mantenitori di buildd dovrebbero usare al suo posto packages-arch-specific, che non è uno stato di wanna-build, ma una lista di pacchetti specifici per una o più architetture.
Un pacchetto in Not-For-Us o in packages-arch-specific non lascerà automaticamente questo stato; se un pacchetto prima escludeva una data architettura che ora supporta nel suo file di controllo, deve essere riaccodato manualmente.
Se ti trovi in questa situazione, puoi chiedere che questa operazione venga fatta scrivendo agli opportuni mantenitori di buildd, che possono essere raggiunti su $arch@buildd.debian.org.
Installed (installato)
Come il nome suggerisce, un pacchetto marcato Installed è correttamente compilato per l'architettura del database di wanna-build. Prima del rilascio di Woody lo stato di un pacchetto veniva cambiato da Uploaded a Installed dopo l'esecuzione giornaliera di katie. Con l'implementazione di Accepted-autobuild, però, questo non è più vero; oggi un pacchetto passa da Uploaded a Installed quando è accettato nell'archivio, ossia dopo circa quindici minuti.

Oltre a questi otto stati, wanna-build conosce anche altri due stati per pacchetti rimossi, che sono usati solamente in casi molto eccezionali. Questi due stati sono Dep-Wait-Removed e Failed-Removed. Il loro rapporto con le loro versioni normali è questo: quando un pacchetto in stato Failed o Dep-Wait non compare più in un file Packages passato a wanna-build – ossia quando quest'ultimo si rendo conto che il pacchetto è stato rimosso – le informazioni relative non sono cancellate, perché la mancanza del pacchetto potrebbe essere semplicemente dovuta ad un problema temporaneo, o ad un rimozione provvisioria (il pacchetto ricomparirà nell'archvio, basta dargli tempo). In questo caso il pacchetto viene spostato nell'opportuno stato di rimozione, in modo che le informazioni relative al fallimento della sua compilazione siano preservate. Se il pacchetto dovessere riapparire in un successivo file Packages passato a wanna-build, verrebbe direttamente riportato da Failed-Removed a Failed o da Dep-Wait-Removed a Dep-Wait.

Non è possibile accedere ai database di wanna-build direttamente: tali database sono installati su ftp-master.debian.org, che è una macchina ad accesso ristretto, e solo i nodi di buildd hanno una chiave SSH che permette loro di interagire con il database relativo alla loro architettura. Così succedeva anche prima che ftp-master fosse ad accesso ristretto; poiché wanna-build necessità di un lock a livello di database anche durante la semplice lettura, era necessario essere nel gruppo giusto (wb-<arch>) per accedere direttamente al un database.

Tuttavia, è possibile vedere lo stato di un pacchetto andando sulla pagina delle statistiche di buildd, tranne che se è nello stato Installed (a meno che non ti dia problemi andare a cercare nei lunghissimi file "<arch>-all.txt"...).

I risultati della compilazione

Quando un pacchetto viene compilato da sbuild (il componente di buildd che si occupa della compilazione vera e propria) un log dell'operazione viene inviato per email all'amministratore del nodo ed a logs@buildd.debian.org (in modo che possa essere visualizzato su https://buildd.debian.org). Il risultato del log di compilazione può essere successful (riuscito), attempted (tentato, in passato era failed, fallito), given-back (restituito), skipped (saltato). Notare che sulle pagine di buildd viene aggiunto il prefisso maybe- (forse), perché, tra le altre cose, in passato, il fatto che una compilazione fosse marcata come failed per motivi che non erano un reale fallimento ha generato confusione (e, del resto, a volte un pacchetto che sempra essere stato compilato con successo in realtà è errato e deve essere compilato nuovamente).

Il significato dei risultati di compilazione è il seguente:

successful
La compilazione si è conclusa con successo. Dopo aver ricevuto il log, l'amministratore del nodo firmerà il file .changes e lo rimanderà indietro, in modo che venga caricato nell'archivio.
attempted (in passato: failed)
La compilazione ha restituito uno stato non-zero, ciò indica che probabilmente è fallita. Ci sono un sacco di ragioni per cui questo può accadere, che sarebbero difficili da elencare. Se un tuo pacchetto è marcato (maybe-)failed prova a leggere quanto riportato sopra e controlla il suo stato di wanna-build.
given-back
La compilazione è fallita a causa di problemi temporanei del nodo che l'ha tentata; potrebbe darsi, per esempio, di problemi di rete, mancanza del pacchetto sorgente nel file sources.list, spazio disco insufficiente o altro ancora.
Un pacchetto restituito con il codice given-back verrà nuovamente marcato come needs-build, e sarà quindi automaticamente preso da un altro nodo disponibile.
skipped
Prima che la compilazione iniziasse, ma dopo che il pacchetto è stato preso dal nodo buildd e marcato come building, è stata caricata una sua nuova versione oppure il suo stato su wanna-build è stato modificato manualmente da un responsabile del port. Quando una di queste azioni viene eseguita, una mail viene inviata al nodo, che quindi non compilerà il pacchetto (ma genererà un log per descrivere il fatto che ciò è accaduto).

La versione grafica

Per illustrare tutto quanto spiegato, è disponibile un diagramma di flusso della procedura. Notare che non contiene tutti gli aspetti menzionati in questo documento.