SearchWiki:

Seções:

Recent Changes Printable View Page History Edit Page

Fase 3 - two phase commit

Nessa fase do trabalho foi implementado o two phase commit com uma pequena extensão. O protocolo funciona da seguinte maneira:

coordenador nodos
inicia o 2pc enviando para todos os nodos vivos uma mensage de "oktocommit" com o valor e o id da transação se o nodo não estiver participando de outra transação ele responde com "readytocommit", caso contrário com um "abort"
inicia um timer e espera as mensagens de todos os nodos inicia um timer e aguarda a mensagem de commit ou abort
se todos os nodos vivos responderam "readytocommit", envia um "commit", caso contrario envia um "abort" comita ou não a operação baseado na mensagem do coordenador, caso o timer expire e a mensagem não tenha chegado inicia a fase de recuperação
transação encerrada  
 recuperação: verifica se o coordenador esta vivo, envia uma mensagem de "sendagain" com o id da transação e inicia um timer
consulta o resultado da ultima transacao (verifica o id), envia o resultado para o nodo comita ou não operação. Caso não chegue a resposta ou o coordenador morreu, entra em estado "block"

Nessa fase do trabalho foi melhorado o sistema de log do servidor, e o servidor foi instrumentado para simular falhas em diferentes fases da transação. Os códigos se encontram logo abaixo:

Servidor

membership.py

msghandler.py

mysender.py

myserver.py

server.py

serverconf.py

twophasecommit.py

Cliente

client.py

clientconf.py

arquivo de configuracao

config.ini

Exemplos de execução

Uma execução sem falhas:

 macalan: ./client.py -f config.ini -i macalan -m try  -n 15
 {'resultado': 'commit', 'id': 'macalan', 'tipo': 'result'}

 macalan: ./server.py -f config.ini -i macalan
 recebi: {'tipo': 'try', 'valor': '15'}
 iniciando o twophasecommit
 Sending oktocommit to: ['talisker']
 Acionando o timer
 mensagem recebida de talisker tipo readytocommit
 verifica se todo mundo respondeu
 ['talisker'] = ['talisker']
 ok, todo mundo respondeu
 phase2 commit
 Novo Valor: 15
 Enviando {'trans': 'macalan-1163864113.47', 'type': 'commit', 'id': 'macalan'} para ['talisker']
 sending client: {'resultado': 'commit', 'id': 'macalan', 'tipo': 'result'}
 client conection closed

 talisker:  ./server.py -f config.ini -i talisker
 enviando {'trans': 'macalan-1163864113.47', 'type': 'readytocommit', 'id': 'talisker'} para  macalan endereco ('macalan', 45005)
 iniciando o timer
 Recebi de macalan um commit
 operacao confirmada pelo controlador
 iniciando 2 fase com: commit
 Novo Valor: 15

Execução com falha na fase 2, seguida de recuperação:

 macalan: ./client.py -f config.ini -i macalan -m try  -n 10
 {'resultado': 'commit', 'id': 'macalan', 'tipo': 'result'}

 macalan: ./server.py -f config.ini -i macalan
 recebi: {'tipo': 'try', 'valor': '10'}
 iniciando o twophasecommit
 Sending oktocommit to: ['talisker']
 Acionando o timer
 mensagem recebida de talisker tipo readytocommit
 verifica se todo mundo respondeu
 ['talisker'] = ['talisker']
 ok, todo mundo respondeu
 phase2 commit
 Novo Valor: 10
 Enviando {'trans': 'macalan-1163864540.57', 'type': 'commit', 'id': 'macalan'} para ['talisker']
 sending client: {'resultado': 'commit', 'id': 'macalan', 'tipo': 'result'}
 client conection closed
 re-enviando mensagem da fase 2: {'trans': 'macalan-1163864540.57', 'type': 'commit', 'id': 'macalan'} para talisker

 talisker: ./server.py -f config.ini -i talisker
 enviando {'trans': 'macalan-1163864540.57', 'type': 'readytocommit', 'id': 'talisker'} para  macalan endereco ('macalan', 45005)
 iniciando o timer
 timer expirou!
 Perdemos a mensagem da fase 2, iniciando recuperacao
 enviando {'trans': 'macalan-1163864540.57', 'type': 'sendagain', 'id': 'talisker'} para macalan endereco ('macalan', 45005)
 iniciando o timer
 Recebi de macalan um commit
 operacao confirmada pelo controlador
 iniciando 2 fase com: commit
 Novo Valor: 10

Exemplo de execução com erro na fase2 e na recuperação:

 macalan: ./client.py -f config.ini -i macalan -m try  -n 50
 {'resultado': 'commit', 'id': 'macalan', 'tipo': 'result'}

 macalan: ./server.py -f config.ini -i macalan
 recebi: {'tipo': 'try', 'valor': '50'}
 iniciando o twophasecommit
 Sending oktocommit to: ['talisker']
 Acionando o timer
 mensagem recebida de talisker tipo readytocommit
 verifica se todo mundo respondeu
 ['talisker'] = ['talisker']
 ok, todo mundo respondeu
 phase2 commit
 Novo Valor: 50
 Enviando {'trans': 'macalan-1163864707.65', 'type': 'commit', 'id': 'macalan'} para ['talisker']
 sending client: {'resultado': 'commit', 'id': 'macalan', 'tipo': 'result'}
 client conection closed
 re-enviando mensagem da fase 2: {'trans': 'macalan-1163864707.65', 'type': 'commit', 'id': 'macalan'} para talisker

 talisker: ./server.py -f config.ini -i talisker
 enviando {'trans': 'macalan-1163864707.65', 'type': 'readytocommit', 'id': 'talisker'} para macalan endereco ('macalan', 45005)
 iniciando o timer
 timer expirou!
 Perdemos a mensagem da fase 2, iniciando recuperacao
 enviando {'trans': 'macalan-1163864707.65', 'type': 'sendagain', 'id': 'talisker'} para macalan endereco ('macalan', 45005)
 iniciando o timer
 timer expirou!
 iniciando 2 fase com: block
 nodo bloqueado!

Edit Page - Page History - Printable View - Recent Changes - WikiHelp - SearchWiki
Page last modified on November 18, 2006, at 01:48 PM