5.2 Implementac¸˜ao dos Protocolos
5.2.2 Protocolo ViewStamped Replication
O protocolo VR ´e muito mais complexo que o 2PC, pois os participantes tˆem que guardar um estado com muitas vari´aveis, as r´eplicas podem executar dois tipos de c´odigo diferen- tes, dependendo se s˜ao o prim´ario ou uma r´eplica backup, e o prim´ario recebe pedidos de v´arios clientes ao mesmo tempo que comunica com as r´eplicas para as informac¸˜ao dos pedidos. Ao contr´ario do 2PC em que apenas ´e executada uma instˆancia do protocolo de cada vez, no VR existem v´arias instˆancias a serem executadas ao mesmo tempo para cli- entes diferentes, o que torna mais complicado fazer a correspondˆencia entre o protocolo local e o programa.
Para implementar o protocolo VR foi criado um m´odulo para cada protocolo local e quatro estados adicionais, tendo assim um total de quatorze m´odulos. A ac¸˜ao do cli- ente ´e representada em apenas um m´odulo, cujo nome ´e vr_c, assim o cliente apenas
tem um processo a executar a sua ac¸˜ao. Os restantes m´odulos representam a ac¸˜ao das r´eplicas. Nesta implementac¸˜ao tamb´em existe um m´odulocentralque ´e o ponto central
das r´eplicas, onde ´e recebida toda a comunicac¸˜ao proveniente de clientes e outras r´eplicas. Este m´odulo apresenta uma func¸˜ao espec´ıfica para o prim´ario e outra para as r´eplicas, pois estes participantes recebem mensagens diferentes que s˜ao tratadas para m´odulos diferen- tes.
Figura 5.2: Diagramas de m´odulos que implementam o protocolo VR.
A ac¸˜ao normal do prim´ario est´a dividida por dois m´odulos, ovr_p_client, no qual
o prim´ario recebe os pedidos dos clientes e ap´os receber um pedido envia mensagens
prepare para as r´eplicas, e o m´odulo vr_p que espera por mensagens prepareok das
r´eplicas e envia as respostas para o cliente. O m´odulovr_rsconsiste na ac¸˜ao normal das
r´eplicas backup, em que elas recebem mensagenspreparedo prim´ario e respondem com
uma mensagemprepareok.
viewchange_rsconsiste na troca de prim´ario, neste m´odulo as r´eplicas ficam `a espera de
recebem mensagensstartviewchangee quando recebem as necess´arias continuam com o processo para eleger o novo prim´ario. No m´oduloviewchange_pas r´eplicas esperam
por mensagens doviewchange, que ir˜ao receber caso sejam o novo prim´ario, quando o novo prim´ario recebe as mensagens necess´arias envia mensagensstartviewpara todas
as r´eplicas e depois volta a ficar bloqueado `a espera de mensagensdoviewchange.
O m´odulorecovery_rconsiste na ac¸˜ao para a r´eplica conseguir recuperar e o m´odulo
recovery_rs consiste na ac¸˜ao para responder a pedidos de recuperac¸˜ao. No m´odulo recovery_rsas r´eplicas ficam bloqueadas `a espera de pedidos de recuperac¸˜ao, quando recebem uma enviam a resposta e depois voltam a ficar bloqueadas `a espera de mais pedidos de recuperac¸˜ao.
O m´odulostatetransfer_rconsiste no pedido de atualizac¸˜ao de estado, no caso em que a r´eplica se encontra atrasada e o m´odulostatetransfer_q consiste na resposta a
pedidos de atualizac¸˜ao de estado. No m´odulo statetransfer_q as r´eplicas ficam blo- queadas `a espera de uma mensagemgetstate, quando a recebem respondem com uma
mensagemnewstate. Ap´os ajudarem a r´eplica ficam novamente bloqueadas `a espera de atender a mais pedidos de atualizac¸˜ao de estado.
O m´odulostateapresenta diversas func¸˜oes que tratam da criac¸˜ao e alterac¸˜ao do es-
tado das r´eplicas. Por fim, o m´oduloserverserviceconsiste no servic¸o a que os clientes pretendem aceder, neste caso o nosso m´odulo apenas imprime uma frase no ecr˜a do ter- minal que diz que executou a operac¸˜ao n´umero x para o cliente y. Num sistema real este servic¸o seria algo mais complexo.
O cliente apenas tem um processo a executar o m´odulo vr_c. Todas as r´eplicas
tˆem 6 ou 7 processos a ser executados simultaneamente, dependendo se s˜ao o prim´ario ou n˜ao, sendo que tˆem um processo para cada um dos seguintes m´odulos: central, viewchange_rs,viewchange_p,recovery_rsestatetransfer_q. Para al´em dos pro-
cessos referidos acima o prim´ario tem ainda um processo a executar o m´odulo
vr_p_cliente outro a executar o m´odulo vr_p, enquanto que as r´eplicas backup tˆem um processo para executar o m´odulovr_rs.
De seguida iremos mostrar alguns excertos que mostram situac¸˜oes um pouco di- ferentes das usadas na implementac¸˜ao do 2PC, para explicar como s˜ao aplicados na implementac¸˜ao. No m´odulo vr_p ´e utilizado a func¸˜ao multireceive da API para re-
ceberfmensagensprepareok, mas neste caso a lista de etiquetas de mensagens passadas
na func¸˜ao consistem em tuplos de trˆes elementos. S˜ao usadas estes tuplos, porque ´e ne- cess´ario receber mensagens prepareok que tenham o mesmo OpNumber, visto que as
mensagens tˆem que pertencer ao mesmo pedido para se poder enviar a resposta para o cliente.
filter_prepareok que verifica se as mensagens da lista tˆem a etiqueta prepareok e que o segundo elemento dos parˆametr,o que corresponde ao OpNumber, ´e igual ao da
mensagem que acabou de receber. Ap´os receber as mensagens necess´arias avanc¸a para a func¸˜aoprimarycom argumentoreplyPhase, onde ´e enviada a mensagemreplypara
esse pedido, caso os pedidos anteriores j´a tenham sido respondidos. Estemultireceive
corresponde ao estado PrepareOkPhase do protocolo local VR p, no qual ´e definido uma operac¸˜ao de recec¸˜ao multireceive, que tem apenas a opc¸˜ao de mensagem prepareok que leva ao estado ReplyPhase, tal como na implementac¸˜ao.
No in´ıcio do m´odulo vr_rs ´e chamada a func¸˜ao recvda API, que recebe uma lista
com as etiquetasprepareecommite apresenta um timeout de 15 segundos. ... primary(prepareOkPhase, Central) -> ... LMessages = message:multireceive([{prepareok,Necessary,{vr_p, filter_prepareok}}], 0), ...
Quando o processo recebe uma mensagemprepare´e chamada a func¸˜aoreplicaque
recebe o argumentopreparePhase, na qual ´e verificado se o pedido tem oOpNumberse-
guinte ao ´ultimo recebido. Caso isso acontec¸a ´e chamada a func¸˜aoreplicaque recebe
o argumentoprepareOkPhase, na qual ´e enviada uma mensagemprepareokcorrespon- dente a esse pedido para o prim´ario.
... replica(Central) -> ... Message = message:recv([{prepare},{commit}], 15), {Label,{}} = Message, if Label == timeout -> if
Status == normal -> viewchange(Central); true -> ok
end;
Label == prepare ->
replica(preparePhase, Central, Message); Label == commit ->
replica(commitPhase, Central, Message) end,
...
Quando o processo recebe uma mensagemcommit´e chamada a func¸˜aoreplicaque
recebe o argumentocommitPhase. Nessa func¸˜ao tenta-se fazer commit da operac¸˜ao e de-
pois volta-se ao in´ıcio para receber mais mensagens. Caso ocorra um timeout ´e chamada a func¸˜aoviewchangedo m´oduloviewchang_xseque d´a inicio `a troca de prim´ario.
duas mensagens no mesmo recv, pois a r´eplica pode receber qualquer uma das men-
sagens a qualquer altura. No entanto continua a ser poss´ıvel verificar que estas opc¸˜oes seguem o mesmo caminho que no protocolo local. Na opc¸˜ao prepare do estado Pre- parePhase a comunicac¸˜ao avanc¸a para o estado PrepareOkPhase e o mesmo acontece na implementac¸˜ao. Na opc¸˜ao commit do estado CommitPhase a instˆancia do proto- colo termina e na implementac¸˜ao volta-se ao ´ınicio onde se espera por mais pedidos. A opc¸˜ao timeout em ambos os estado leva ao estado ViewChangePhase do protocolo local ViewChange xs, tal como acontece na implementac¸˜ao.
Por ´ultimo, no estado RetryPhase do protocolo local VR rs ´e recebida uma mensa- gem request do cliente. Segundo a descric¸˜ao do protocolo VR as r´eplicas ignoram esta mensagem, pois esta s´o tem significado para o prim´ario. Portanto na implementac¸˜ao esta mensagens tamb´em ´e ignorada, caso seja recebida o processo ir´a continuar no recv ini- cial `a espera de mensagens prepare ou commit. No protocolo local quando a mensagem request´e recebida a comunicac¸˜ao avanc¸a para o estado PreparePhase, mas o estado Com- mitPhasepode ser chamado a qualquer altura.