Dettagli implementativi


Tutti gli indirizzi dei master sono memorizzati su memoria di massa, in file il cui nome indica un determinato ambito e il cui contenuto e' una lista di indirizzi ip separati da '\n'. All'avvio del Name Server tutti i dati vengono caricati in memoria in una Hashtable.
Vi sono, poi, 3 thread principali:

  1. uno per l'accettazione delle interrogazioni da parte dei Client e degli Slave;
  2. uno per l'accettazione dei comandi di modifica degli indirizzi;
  3. uno per il salvataggio periodico su disco delle entry modificate della tabella.
Lo thread 1 e' in ascolto su una porta x UDP, lo thread 2, invece, su una porta x TCP. Il numero x della porta viene assegnato dinamicamente dalla linea di comando:

java NameServer porta_di_ascolto .

(Per semplicita', visto l'alto numero di porte da gestire nelle prove effettuate su una singola macchina, il numero di porta del Name Server e' stato fissato a 1234).

Entrambi gli thread 1 e 2 eseguono le richieste sequenzialmente, visto che la durata dei servizi e' molto breve.

Formato delle query e dei comandi


Query
Per ottenere gli indirizzi ip dei master di un certo ambito 'AMBITO' occorre inviare al Name Server sulla porta x UDP un pacchetto contenente la stringa 'AMBITO'. In questo caso il server risponde con una lista di indirizzi separati da '\n'.
Per consentire una migliore distribuzione delle query di un client ai master di uno stesso ambito, la lista degli ip mandata in risposta viene ruotata a ogni query. Ad esempio:

Prima query 'musica' --> risposta: 135.23.56.41\n125.69.15.1\n227.39.11.3\n
Seconda query 'musica' --> risposta: 125.69.15.1\n227.39.11.3\n135.23.56.41\n
ecc...

In questo modo query ripetute relative allo stesso ambito portano al contattamento di master differenti (dato che il client contatta il primo master disponibile della lista).

Comandi di modifica indirizzi
Per modificare un indirizzo di un master occorre contattare il server sulla porta x TCP, inviando i comandi:

set ambito ip (per inserire l'indirizzo 'ip' nella lista corrispondente a 'ambito')
unset ambito ip (per cancellare l'indirizzo 'ip' dalla lista corrispondente a 'ambito')

Questi comandi vengono inviati al Name Server da un master che e' stato rieletto in una rete relativa a 'ambito', per consentire a tutti di contattarlo. Piu' precisamente un nuovo master, instaurata la connessione TCP, invia in sequenza:

unset ambito ip_del_master_caduto - set ambito ip_nuovo_master

Nota sui protocolli usati


Mentre il protocollo UDP risulta essere idoneo per le query effettuate dai client (e slave), la stessa cosa non si puo' dire per la ricezione dei comandi di modifica. Infatti si e' preferito usare il protocollo TCP per avere una maggiore affidabilita' nell'esecuzione di operazioni cosi' 'delicate'.

Nota sulla sicurezza


Per motivi di semplicita' non e' stato realizzato nessun meccanismo di sicurezza per proteggere il servizio via TCP da accessi non autorizzati. E' comunque impensabile, nella realta', fornire un servizio del genere senza preoccuparsi di tale aspetto.