• Non ci sono risultati.

4.2 Implementazione di PAM

4.2.4 Le operazioni

Le operazioni non sono altro che delle azioni da eseguire in certi istanti di tem- po. Tutte le operazioni da eseguire implementano la classe PamOperation come mostrato in figura 4.14. La classe PamOperation implementa l’interfaccia Abstrac- tOperation del simulatore e deve contenere l’istanza dell’host che deve eseguire l’operazione richiesta (variabile component ).

82 PAM:Implementazione

Le operazioni lato Server

Le operazioni definite e schedulate per il servernode estendono la classe PamOp- eration. Le operazioni progettate sono:

• JoinPamOperation:(algoritmo 8) `e eseguita per gestire la fase inizale del processo di join in un servernode. L’host che la esegue prende un contatto di un servernode dal nodo di bootstrap e gli invia un messaggio di tipo

JoinPamMessage. Se non esiste un servernode nella rete allora l’host `e

il primo che entra, a cui viene assegnata la zona corrispondente all’intero

spazio virtuale. Quando la zona `e stata assegnata, il servernode si registra

presso il nodo di bootstrap e presso il balancingnode in modalit`a online. Il

servernode che ha richiesto la join viene registrato presso il nodo di bootstrap e presso il balancingnode solo quando gli viene effetivamente assegnata una zona.

• LeavePamOperation:(algoritmo 9) `e l’operazione eseguita da un servernode che intende uscire volontariamente dalla rete. Per ogni zona dell’host us- cente viene eseguita la funzione findNearestContactZoneVid che restituisce

il contatto del vicino che possiede la zona con il vid pi`u simile ad essa, a

cui affidarla. Occorre inoltre eliminare la zona considerata dalla tabella di routing dei suoi vicini laterali e diagonali inviandola respettivamente mes- saggi di tipo RemoveNeihbourPamMessage e RemoveDiagonalPamMessage. Infine viene inviato un messaggio AddZonePamMessage al vicino a cui viene affidata la zona.

• PutPamOperation:(algoritmo 10) `e l’operazione eseguita per inserire entit`a

di tipo PamObject nella DHT. Tale operazione deve essere eseguita in uno

stato della rete in cui `e presente un unico servernode che possiede l’intera

area di gioco. Nell’algoritmo gli oggetti vengono semplicemente aggiunti alla zona gestita dal nodo che esegue l’operazione.

• QueryReplyPamOperation:(algoritmo 11) `e l’operazione eseguita dai servern- ode per risolvere le range query per tutti gli avatar che gestiscono. In parti- colare deve calcolare i risultati della range query per le zone che gestisce ed

4.2 Implementazione di PAM 83

Algorithm 8: executeJoinPamOperation

begin

joiningN ode = getComponent(); bootstrap = getBootstrapN ode(); balancingN ode = getBalancingN ode(); if bootstrap.hasContacts() then

(contact, zoneId) = bootstrap.getContactZone(); J oinM essage(joiningN ode.getContact(), zoneId); send msg to contact;

end else

joiningN ode.setAllSpace();

bootstrap.registerN ode(joiningN ode); balancingN ode.AddInOnline(joiningN ode); end

end

inviare messaggi di tipo RangeQueryPamMessage ai nodi vicini che posseg- gono zone che intersecano le Aoi dei giocatori. Infine viene schedulata una

nuova QueryReplyPamOperation per l’iterazione i + 1 al tempo ti+ 3t, dove

ti `e il tempo in cui `e stata eseguita l’operazione per l’iterazione i. Se viene

raggiunto il numero di iterazioni configurato nella classe PamConfig allora si interrompe l’operazione.

84 PAM:Implementazione

Algorithm 9: executeLeavePamOperation

begin

leavingN ode = getComponent();

for each zone ∈ leavingN ode.getZoneT able() do zoneId = zone.getZoneId();

contact = f indN earestContactZoneV id(zoneId); (znt, zdt) = leavingN ode.getRoutingT able(zoneId); (avts, objs) = leavingN ode.getEntities(zoneId); for each n ∈ (znt ∪ zdt) do

if n.isDiagonal() then

msg = createRemoveN eighbourM essage(leavingN ode, zoneId); end

else

msg = createRemoveDiagonalM essage(leavingN ode, zoneId); end

send msg to n.getContact(); end

msg = createAddZoneM essage(znt, zdt, objs, avts, zone); send msg to contact; end bootstrap = getBootstrap(); bootstrap.remove(leavingN ode); end Algorithm 10: executePutPamOperation input : objectList begin 1 node = getComponent(); 2 node.addAllObjects(objectList); 3 end 4

4.2 Implementazione di PAM 85

Algorithm 11: executeQueryReplyOperation

input : iteration begin

1

if iteration > P amConf ig.iterationN umber then

2 return 3 end 4 node = getComponent; 5

for each zone ∈ node.getZoneT able() do

6

zoneId = zone.getZoneId();

7

for each avtContact ∈ node.getAvatars(zoneId) do

8

p = avtContact.getP osition();

9

(objects, avatars) = f indEntities(zoneId, p, P amConf ig.aoi radius);

10

for each n ∈ node.getRoutingT able(zoneId) do

11

if n.intersect(p, P amConf ig.aoiRadius) then

12

msg =

13

createRangeQueryM sg(iteration, avtContact, n.getZoneId()); send msg to n.getContact(); 14 end 15 end 16 end 17 end 18

qrOp = createQueryReplyOperation(node, iteration + 1);

19

qrOp.scheduleW ithDelay(3 ∗ P amConf ig.delay);

20

end

86 PAM:Implementazione Algorithm 12: executeMovePamOperation input : iteration begin 1 node = getComponent(); 2

if iteration > P amConf ig.iterationN umber then

3 return 4 end 5 zoneId = node.getZoneId(); 6 serverContact = node.getServerContact(); 7

msg = createM oveM essage(iteration, node.getContact(), zoneId);

8

send msg to serverContact;

9

moveOp = newM oveAvatarP amOperation(node.getContact(), iteration + 1);

10

moveOp.scheduleW ithDelay(3 ∗ P amConf ig.delay);

11

end

12

Le operazioni lato Client

Anche il clientnode prevede l’implementazione delle operazioni che implementano la classe PamOperation. Le operazioni previste sono:

• MoveAvatarPamOperation: (algoritmo 12) viene eseguita per aggiornare la posizione dell’avatar nella DHT. L’operazione invia un MovePamMessage al

servernode a cui `e registrato specificando anche la zona in cui era posizionato

all’iterazione i − 1. Successivamente l’operazione crea una nuova MoveA-

vatarPamOperation per l’iterazione i + 1 da schedulare al tempo ti+ 3t. Se

viene raggiunto il numero di iterazioni configurato nella classe PamConfig allora si interrompe l’operazione.

• RegisterClientPamOperation:(algoritmo 13) questa operazione permette di registrare un clientnode presso il servernode che lo deve gestire. L’operazione invia un FindPamMessage ad un servernode presente nella rete. Successi- vamente l’operazione crea una MoveAvatarPamOperation per l’iterazione 0

4.2 Implementazione di PAM 87 Algorithm 13: executeRegisterPamOperation input : serverContact begin 1 node = getComponent(); 2 bootstrap = getBootstrap(); 3 serverContact = bootstrap.getServerContact(); 4 zoneId = node.getZoneId(); 5

msg = createF indM essage(0, node.getContact(), zoneId);

6

send msg to serverContact;

7

moveOp = createM oveP amOperation(node.getContact(), 0);

8

moveOp.scheduleAtT ime(P amConf ig.start);

9

end

88 PAM:Implementazione Algorithm 14: executeBalancingOperation input : iteration begin 1 node = getComponent(); 2

if iteration > P amConf ig.iterationN umber then

3

return

4

end

5

(overloadedServer, overloadedZone) = node.getM axOverloadedZone();

6

if overloadedServer! = null then

7

if node.hasOf f lineServer() then

8

f reeServer = node.getF irstOf f lineServer();

9 node.addOnlineServer(f reeServer); 10 p = overloadedZone.getCentralP oint(); 11 f reeServer.setP osition(p); 12

f reeServer.joinOf f lineN ode(iteration, P amConf ig.start + 2 ∗

13 P amConf ig.delay); end 14 else 15

underloadedServer = node.getM inU nderloadedServer();

16

if underloadedServer! = null then

17

underloadedServer.splitOverloadedZone(iteration, overloadedServer, overloadedZone);

18 end 19 end 20 end 21

balOp = newBalancingP amOperation(node.getContact(), iteration + 1);

22

blaOp.scheduleW ithDelay(3 ∗ P amConf ig.delay);

23

end

24

Le operazioni del balancingnode

Nel balancingnode `e stata prevista una sola operazione da eseguire ciclamente per

ogni iterazione. L’operazione creata `e la BalancingPamOperation che estende la

classe PamOperation e il cui funzionamento `e descritto nell’algoritmo 14.

L’algoritmo cerca se esiste, un servernode sovraccarico per cui il carico deve

essere diminuito. La funzione getMaxOverloadedZone restituisce il servernode pi`u

sovraccarico insieme alla sua zona pi`u carica. Se sono presenti servernode nel

4.2 Implementazione di PAM 89

Figura 4.15: Nodi di PAM.

della zona pi`u carica (usata per guidare l’algoritmo di routing) e esegue l’azione

joinOfflineNode. La joinOfflineNode esegue la join relativamente al nuovo servern- ode passando l’iterazione corrente in modo che il nuovo servernode si sincronizzi con gli altri e un tempo necessario per sincronizzare l’invio delle viste al client.

Se invece non sono presenti servernode nel pool offline, allora il servernode pi`u

carico esegue l’azione splitOverloadedZone con la quale dividere la sua zona pi`u

sovraccarica con il servernode meno carico. Il metodo getMinUnderloadedServer restituisce, se esiste, il servernode meno carico della rete tra quelli non carichi. Infine l’operazione crea una nuova BalancingPamOperation per l’iterazione i + 1

da schedulare al tempo ti+ 3t.

Documenti correlati