Modulo Neighborhood - Chiamate Lato Server

In questo documento vediamo passo passo come una applicazione debba usare il modulo Neighborhood per gestire gli aspetti "lato server" delle chiamate a metodi remoti.

Applicazione basata su MOD-RPC prodotta con "rpcdesign"

Supponiamo che con il tool rpcdesign abbiamo prodotto una libreria di livello intermedio (MOD-RPC) con le classi nel namespace "Netsukuku" che fornisce il root-dispatcher "AddressManager addr". Come sappiamo MOD-RPC si appoggia sulla libreria ZCD.

Poi viene costruita una APP che si appoggia su MOD-RPC. La APP contiene al suo interno il modulo Neighborhood.

La APP avvia sia un listener TCP sia uno UDP con i metodi della libreria MOD-RPC. Essi si avviano in una tasklet e richiamano i relativi listener della libreria ZCD.

Individuare il (o i) corretto root-dispatcher da invocare

Un messaggio viene recepito da uno dei listener nella libreria ZCD.

ZCD prepara un zcd.CallerInfo e chiama un metodo di un delegato fornito da MOD-RPC.

MOD-RPC prepara un Netsukuku.CallerInfo, che può essere una istanza di:

Poi MOD-RPC chiama un metodo (get_addr_set) di un delegato Netsukuku.IRpcDelegate, la cui implementazione è fornita dalla APP.

La APP in questo metodo scompone il CallerInfo in:

Poi la APP a seconda dei casi:

Infine MOD-RPC riceve un set (forse vuoto) di root-dispatcher su cui invocare un metodo remoto. Sa come proseguire.

Vediamo cosa è avvenuto nel metodo chiamato sul modulo Neighborhood.

Nel caso del metodo IAddressManagerSkeleton? get_dispatcher(ISourceID source_id, IUnicastID unicast_id, string peer_address, string? dev):

Nel caso del metodo Gee.List<IAddressManagerSkeleton> get_dispatcher_set(ISourceID source_id, IBroadcastID broadcast_id, string peer_address, string dev):

Interpretare l'arco da cui arriva la chiamata

Ora vediamo come l'implementatore dello skeleton, fornito dalla APP, nel metodo remoto che è stato invocato è in grado di interpretare l'oggetto CallerInfo, sempre avvalendosi del modulo Neighborhood, per individuare l'arco (arco-nodo o arco-identità) da cui ha ricevuto il messaggio. Questa operazione ha senso solo se il metodo remoto sa di essere stato invocato da un diretto vicino.

Il modulo che implementa il metodo remoto chiamato, passa il CallerInfo all'utilizzatore del modulo, che è anche l'utilizzatore del modulo Neighborhood. Questi è in grado di scomporre il CallerInfo in un ISourceID source_id e una stringa my_address o dev. Se la chiamata è arrivata con il protocollo TCP abbiamo la stringa my_address la quale (almeno per i metodi remoti chiamati sui diretti vicini) è sempre l'indirizzo di scheda assegnato dal modulo Neighborhood all'interfaccia di rete reale. In base alle sue conoscenze l'utilizzatore del modulo Neighborhood è in grado di associare alla stringa my_address una univoca stringa dev.

Se il modulo interessato è un modulo di nodo, l'utilizzatore chiama il metodo di Neighborhood get_node_arc(source_id, dev). Se il metodo get_node_arc restituisce un INeighborhoodArc, l'utilizzatore è poi in grado di associarlo ad un oggetto che il modulo interessato conosce come arco-nodo.

Se il metodo get_node_arc restituisce null, anche l'utilizzatore restituirà null. In teoria questo caso si può verificare solo se un arco-nodo prima valido (altrimenti il metodo remoto non doveva essere affatto invocato) è stato rimosso pochi istanti prima. In questo caso l'esecuzione del metodo andrebbe "probabilmente" interrotta, ma questo è di pertinenza del codice che implementa il metodo remoto.

Se il modulo interessato è un modulo di identità, allora il modulo ha passato all'utilizzatore del modulo Neighborhood anche la sua istanza. In questo modo questi sa individuare quale sia il NodeID dell'identità del nodo corrente interessata, chiamiamola identity_aware_my_id. Poi l'utilizzatore chiama il metodo di Neighborhood get_identity(source_id) e ottiene il NodeID dell'identità del mittente, chiamiamola identity_aware_peer_id. Avendo anche il nome dell'interfaccia di rete reale su cui è arrivato il messaggio, con le sue associazioni l'utilizzatore del modulo Neighborhood è in grado di identificare un oggetto (ad esempio un IQspnArc) che il modulo interessato conosce come arco-identità.

Se un arco-identità prima valido (altrimenti il metodo remoto non doveva essere affatto invocato) è stato rimosso pochi istanti prima, adesso l'utilizzatore del modulo non lo trova nelle sue associazioni e restituisce null. In questo caso l'esecuzione del metodo andrebbe "probabilmente" interrotta, ma questo è di pertinenza del codice che implementa il metodo remoto.

Netsukuku/ita/docs/ModuloNeighborhood/ChiamateLatoServer (last edited 2016-02-25 17:20:30 by lukisi)