Implementazione
Strutture dati
Ogni server mantiene in memoria la propria parte di Rubrica.
La Rubrica è composta di due valori: una chiave unica e un numero
(es. il numero di telefono). Al caricamento in memoria ad ogni coppia chiave-valore
vengono aggiunti altri campi per l'imlementazione della replicazione.
Ogni Rubrica in memoria diviene così un elenco di Entry
composte da:
-
chiave: stringa che rappresenta una chiave
-
valore: intero che rappresenta il valore
-
stato: carattere con i seguenti significati:
-
'n': il server è il proprietario del dato che non è
replicato in nessun altro server
-
'r': il server è il proprietario del dato che è replicato
su altri server, l'elenco di questi server e nella lista server
-
'c': il server non è il proprietario del dato, ma ne mantiene
solo una copia. Il server proprietario è indicato come l'unico elemento
della lista
-
server: lista di nomi di server che possono essere:
-
i server sui quali il dato è replicato
-
il server proprietario del dato
Con server proprietario si intende il primo server sul quale il
dato è stato salvato.
Metodi remoti
- String lookup (String chiave,
String serverMittente)
Chiamata da un server verso un altro server.
La lookup controlla che sul server su cui è chiamata sia presente
una Entry con valore chiave chiave.
-
Entry non presente: ritorna il valore "No"
-
Entry presente con stato:
-
'n': unica occorrenza della entry nella rete: modifica lo stato
in 'r' ed aggiunge serverMittente alla lista dei server associati
alla Entry.
-
'r': la Entry è replicata e il server è il proprietario
di tale Entry: aggiunge semplicemente serverMittente alla lista
dei server associati alla Entry. Ritorna il valore richiesto.
-
'c': la Entry è una copia di un'altra Entry: risale al server
proprietario attaravero la lista e ne richiede una lookup(chiave,serverMittente).
Ritorna una stringa con concatenati il valore richiesto ed il server proprietario
di tale valore.
- int Read(String Chiave)
Chiamata da un client verso un server
Controlla che sul server su cui è chiamata sia presente una
Entry
con valore chiave chiave.
-
Entry presente: ritorna il valore della Entry.
-
Entry non presente: manda lookup agli altri server in rete alla
ricerca del valore. Se ottiene risposta affermativa aggiunge la Entry nella
propria rubrica con stato 'c' il server proprietario come unico
elemento della lista. Se al contrario, la Entry non è presente nella
rete, ritorna il valore 0.
- String Update(String chiave,int
valore)
Chiamata da un client verso un server.
Aggiorna il valore della Entry con chiave chiave o ne
inserisce una nuova se in rete non esiste già.
-
Entry non presente sul server: controllo che la Entry non sia su altri
server, attraverso una look(chiave).
-
Se esiste chiama la Update(chiave,valore) sul server proprietario
-
Se non esite crea nella propria rubrica una nuova Entry con quel valore
e stato 'n'
-
Entry presente sul server con stato 'n': aggiorna il valore
della Entry. Ritorna 'OK'
-
Entry presente sul server con stato 'r': aggiorna il valore e chiama
reCache(chiave,val,nomeServer) su tutti i server della lista. Ritorna
'OK'.
-
Entry presente sul server con stato 'c': ritorna il nome del server
proprietario.
- int reCache(String chiave, int
valore, String serverMittente)
Chiamata dal server proprietario della Entry a tutti i server che hanno
tale Entry come copia
Modifica il valore della Entry e controlla che il server della lista
della Entry sia effettivamente serverMittente.
- String look(String chiave)
Chiamato da un server ad un altro server.
Simile alla lookup con la differenza che non effettua cambiamenti
di stato sulle Entry del server su cui è chiamato.
Ritorna il server proprietario della Entry con chiave chiave.
- int new()
Chiamata da ogni server appena divenuto attivo, per avvisare gli altri
del proprio ingresso nella rete.
Client
Inizializzazione:
-
Si collega all'ORB
-
Ottiene i riferimenti dei server presenti nella rete
-
Attende comandi dall'utente
Metodi:
- boolean checkServer(String nServer)
Utilizzato dai metodi aggiorna e richiesta per controllare l'esistenza
del server nServer sulla rete prima di compiere un operazione. Restituisce
true se il server esiste, false al contrario.
- int aggiorna(String chiave,
int valore, int server)
Consente all'utente di modificare la Entry con chiave chiave con il
valore valore, o di inserirla se non è già presente in
rete.
Il client ha la possibilità di collegarsi al server che preferisce
scegliendo dall'elenco dei server in rete.
Questo metodo richiama il metodo update sul server specificato. Update
ritorna un indicazione di successo o insuccesso oppure il nome del server
al quale chiedere l'update.
La seconda richiest avviene in maniera trasparente all'utente.
- int richiesta(String chiave,
int server)
Questo metodo consente di interrogare la Rubrica per conoscere il valore della
chiave passata come parametro.
Il metodo richiama la read sul server specificato.
Ritorna il valore richiesto o 0 in caso non esista.
Server
Quando un server diventa attivo esegue le seguenti operazioni:
-
Carica da disco la Rubrica
-
Si collega all'ORB
-
Si assegna un numero random che indicherà il suo nome all'interno
della rete
-
Ottiene dal Location Service di CORBA la lista di tutti i
server attivi presenti in rete
-
Per ogni Entry nella sua Rubrica controlla che in rete non ne esista già
una copia, se esiste prende il suo valore, considerandolo più aggiornato.
-
Fa partire il metodo Down
Questo metodo ha il compito di controllare ad intervalli regolari se
qualche server in rete si è disattivato.
In tal caso si procede al riassegnamento di un server proprietario
alle Entry rimaste orfane (ovvero quelle Entry replicate che non hanno
più il server proprietario)
-
Segnala a tutti gli altri server attivi che un nuovo server è in
rete.
Torna all'indice.