In ogni server c’è una tabella di corrispondenze Stringhe- Interi.
I Client si rivolgono ad uno dei Server attivi nella rete per le operazioni di lettura di un valore attraverso la chiave, o di update di un valore.Lettura:
In fase di lettura esistono 3 casi:1) Il dato è presente nel server
Il cliente chiama Read(chiave) sul server, che restituisce il valore cercato2) Il dato non è presente nel server, ma è presente su un altro serverIl cliente chiama Read(chiave) sul server, il server effettua una lookup(chiave, server mittente) sugli altri server, fino a che non ne trova uno (cioè finchè la lookup non restituisce un valore diverso da zero), restituisce il valore al cliente aggiunge l’entry nella tabella con lo status = ‘c’. L’altro server cambia l’entry della tabella secondo queste regole:3) Il dato non è presente su nessun server.
a) se status = ‘n’ => status =’r’ , e aggiungo il server al vettore
b) se status =’r’ =>aggiunge il server al vettore
c) se status = ‘c’ deve leggere dalla lista dei vettori di questa entry da dove è stato replicato il dato, e chiamare la lookup(chiave, servermittente)sul server che contiene la prima copia del dato, dove servermittente è il PRIMO server.La lookup fallisce su tutti i server, e quindi restituisco 0 al client
Update:
In fase di update abbiamo 2 casi:1) Il dato non è presente sul server
1.a) Il dato è su un altro server
Il server se ne accorge con lookup, poi chiama update su un altro server1.b) Il dato non è presente nella rete
Il server si accorge che non è presente nella rete con lookup, ed effettua l’inserimento della entry nella sua tabella
2) Il dato è presente nel server
2.a) Il dato è presente solo in questo server
Il dato è presente nel server, e lo stato è ‘n’. Effettuo tranquillamente l’update2.b) Il dato è stato replicato su altri server
Lo stato del dato nel server è ‘r’. Effettuo l’update, e chiamo il metodo reCache() su tutti i server del vettore, che aggiorna il valore di quell’Entry nei server dove il dato è cachato.2.c) Il dato è una copia cachata proveniente da un altro server.
Lo stato del server è ‘c’. In questo caso, restituisco al client il nome del server che contiene il dato valido, ed il client (in maniera trasparente) effettua l’update sul server principale.
Occorre creare un protocollo tra i server per gestire il caso della “caduta” di un server e tutte le informazioni che ha cachato su altri server.
IPOTESI DI BASE: esiste un ordine di priorità
tra i server dato dal numero random che viene associato ad ogni server all’atto
della creazione.