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.