Modulo Coordinator - Analisi Funzionale

Il modulo cerca di fare sì che un singolo g-nodo di livello l, sebbene costituito da un numero di singoli nodi, abbia un comportamento coerente come singola entità.

Il modulo fa uso delle tasklet, un sistema di multithreading cooperativo.

Il modulo fa uso del framework ZCD, precisamente appoggiandosi ad una libreria intermedia prodotta con questo framework per formalizzare i metodi remoti usati nel demone ntkd.

Il modulo fa uso diretto delle classi e dei servizi forniti dal modulo PeerServices. In particolare, esso realizza un servizio peer-to-peer, chiamato appunto Coordinator, per mezzo del quale svolge alcuni dei suoi compiti.

Il servizio Coordinator

Il servizio Coordinator è un servizio non opzionale, cioè tutti i nodi partecipano attivamente. Si tratta di un servizio che mantiene un database distribuito della tipologia a chiavi fisse.

Lo scopo del servizio Coordinator è quello di realizzare una sorta di memoria condivisa di un g-nodo g. Quando un nodo n vuole accedere alla memoria condivisa del suo g-nodo g di livello l, con 0 < llevels, fa una richiesta al servizio Coordinator usando come chiave il livello l.

Il livello l è maggiore di 0 poiché non serve realizzare una memoria condivisa per il singolo nodo. Può essere uguale al numero dei livelli, poiché è necessario avere una memoria condivisa anche per l'unico g-nodo di livello l = levels che costituisce l'intera rete.

Lo spazio delle chiavi definito dal servizio Coordinator è appunto l'insieme dei valori che può assumere l.

La funzione hp è definita dal servizio in modo da dare ai dati la visibilità locale circoscritta al g-nodo in esame. In altre parole, il nodo corrente può contattare solo il Coordinator di uno dei suoi g-nodi; sia l'hash-node che il nodo che risponde si trovano all'interno del g-nodo stesso.

Servizi previsti

Elenchiamo tutte le richieste che si possono fare al Coordinator.

Prenota un posto

La richiesta r di prenotare un posto può arrivare ad un nodo x come Coordinator di un g-nodo g di livello l, con 0 < llevels. I membri di r sono:

Il nodo x valuta se ci sono posti liberi in g considerando la sua mappa dei percorsi. Deve considerare anche le prenotazioni concesse in precedenza, le quali restano valide per un certo tempo anche se ancora non sono nella sua mappa perché non sono ancora state confermate da un ETP.

Se un posto è disponibile il nodo x lo prenota. Questo equivale ad una scrittura nella memoria condivisa, quindi è necessario provvedere anche alle repliche con il meccanismo fornito dal modulo PeerServices.

Il nodo che fa la richiesta è un nodo n che già appartiene al g-nodo g. Questi richiede la prenotazione di un nuovo posto per conto di un altro nodo suo vicino, m, il quale non è ancora in g o perfino non è ancora nella rete.

Nella risposta al nodo n, x segnala:

Altre informazioni di cui il nodo m necessita per fare ingresso in g (e eventualmente nella rete) sono direttamente fornite dal nodo n che già le conosce. Queste sono:

A questo punto il nodo n comunica tutte queste informazioni al suo vicino m.

Se nessun posto è disponibile il nodo x lo segnala con una eccezione, che viene ricevuta da n. Anche in questo caso n comunica l'esito al vicino m.

Richiesta al diretto vicino di accesso al servizio Coordinator

In alcuni casi un nodo n può voler chiedere ad un suo diretto vicino di accedere al servizio peer-to-peer del Coordinator.

Non sono ancora nella rete

Si consideri un nodo n che non ha fatto ancora ingresso in una rete. Comunicando con un suo vicino v, il nodo n apprende che v appartiene al g-nodo g e che in tale g-nodo c'è ancora spazio. Vorrebbe quindi richiedere l'accesso nel g-nodo g. In questo caso n chiede a v di accedere alla memoria condivisa del g-nodo g per cercare di riservargli un posto.

Sono in un isola che deve migrare

Si consideri un nodo n che fa parte di un g-nodo g di livello l. Il g-nodo g fa a sua volta parte di un g-nodo h di livello l + 1. Supponiamo che il g-nodo g diventi disconnesso, cioè avviene lo split del g-nodo, mentre h è ancora connesso. Supponiamo che l'isola in cui si trova n sia una di quelle che non contengono il nodo più anziano. Supponiamo che n abbia un vicino v che appartiene a h ma non appartiene a g. Per questo il nodo n riceve da v l'informazione che tutta la sua isola (di livello l) deve cambiare indirizzo.

In questo momento il nodo n non ha più un indirizzo valido in g e non è sicuro nemmeno che ci sia ancora spazio per un nuovo g-nodo in h.

Supponiamo che a seguito di tale evento, per una strategia che non è di pertinenza di questo modulo, il nodo n voglia accedere alla memoria condivisa del g-nodo h. Se cercasse di farlo autonomamente potrebbe risultare dal calcolo dell'hash_node che esso si trova proprio in g. Ma il nodo n non è più parte del vero g e non può nemmeno avere percorsi nella sua mappa che lo colleghino al vero g. Allora n deve chiedere a v di accedere in vece sua alla memoria condivisa del g-nodo h. Anche se l'hash_node si trova proprio in g il nodo v saprà instradare il messaggio verso il vero g.

Requisiti

Durante le sue operazioni, il modulo viene informato quando il nodo ha completato la fase di bootstrap. In quello stesso momento gli vengono forniti:

Deliverables

Fornisce metodi per:

Implementa il servizio Coordinator derivando la classe CoordinatorService dalla classe base PeerService.

Il modulo Coordinator si occupa di registrare con il PeersManager l'implementazione del servizio Coordinator e di usare gli algoritmi forniti dal modulo PeerServices per il mantenimento del relativo database a chiavi fisse. Cioè, esso crea una istanza della classe CoordinatorService.DatabaseDescriptor, che implementa IFixedKeysDatabaseDescriptor. Con questa istanza come parametro, al bisogno, chiama i metodi fixed_keys_db_on_startup e fixed_keys_db_on_request di PeersManager.

Deriva la classe CoordinatorClient dalla classe base PeerClient per avviare il contatto del Coordinator di un suo g-nodo e richiederne i servizi.

Classi e interfacce

La mappa delle posizioni libere/occupate ai vari livelli è un oggetto di cui il modulo conosce l'interfaccia ICoordinatorMap. Tramite essa il modulo può:


Il metodo get_neighbor_map restituisce una istanza di ICoordinatorNeighborMap. Tramite questa interfaccia il modulo può:


Il metodo get_reservation restituisce una istanza di ICoordinatorReservation. Tramite questa interfaccia il modulo può:

Netsukuku/ita/docs/ModuloCoordinator/AnalisiFunzionale (last edited 2015-12-02 09:12:29 by lukisi)