18.03.2015 Views

XI Workshop de Testes e Tolerância a Falhas (WTF) - SBRC 2010

XI Workshop de Testes e Tolerância a Falhas (WTF) - SBRC 2010

XI Workshop de Testes e Tolerância a Falhas (WTF) - SBRC 2010

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

22 Anais<br />

Na fase <strong>de</strong> inicialização (linhas 3-15), consi<strong>de</strong>ramos que S 0 <strong>de</strong>tém o token. Consequentemente,<br />

os nós S 1 a S k possuem uma cópia do token (token = BACKUP ) e seus<br />

respectivos Ds são inicializados a {S 0 , . . . S i }. Cada um <strong>de</strong>stes nós começa então, com<br />

exceção <strong>de</strong>le mesmo, a monitorar os processos contidos no seu D (linha 15). Todos os<br />

outros nós do anel não possuem nenhuma cópia válida do token (token = NONE).<br />

A função SafeSendT oken(< T OKEN >) permite a S i = S t enviar o token a<br />

seu sucessor S i+1 e uma cópia <strong>de</strong>ste a {S i+2 . . . S t+k+1 }, indicando que o próximo proprietário<br />

do REAL token é o nó S i+1 , i.e. S i+1 = S t (Figuras 1(c) e 1(d)). Como<br />

S i não possui mais o token (token = NONE), ele não mais monitora os processos<br />

<strong>de</strong> seu D Si (linha 21). Vale lembrar que consi<strong>de</strong>ramos que S i chama a função<br />

SafeSendT oken(< T OKEN >) somente se ele <strong>de</strong>tiver o REAL token e ao fazê-lo<br />

ele não po<strong>de</strong> mais utilizá-lo até adquiri-lo novamente.<br />

Ao receber uma mensagem T OKEN <strong>de</strong> S j (função SafeReceiveT oken(<<br />

T OKEN, S t , count r >)) que não seja antiga, S i atualiza sua variável count Si com o<br />

valor (count r ) contido na mensagem T OKEN (linha 24). Ele então atribui ao seu D Si os<br />

nós entre S t e ele próprio, incluindo ambos os nós (linha 25). Assim, (1) se S i é o próximo<br />

<strong>de</strong>tentor do token, ele atribui o valor REAL à sua variável token Si e entrega o token à<br />

aplicação (linhas 27-28); (2) Se S i <strong>de</strong>tecta a falha <strong>de</strong> todos os nós que ele monitora, ele se<br />

torna o <strong>de</strong>tentor do REAL token executando para tanto a função UseBackup() (linhas<br />

39-42; Figura 1(e)). Ele entrega da mesma forma que em (1) o token à aplicação; (3)<br />

senão S i afeta o valor BACKUP à sua variável token Si (linha 32). Nos três casos, ele<br />

passa a monitorar os nós do seu novo D Si (linha 33).<br />

Quando S i é informado (ReceiveSuspected(S j ), linha 34) da falha <strong>de</strong> S j , um<br />

dos nós monitorado por S i , este atualiza o conteúdo <strong>de</strong> seu conjunto <strong>de</strong> nós falhos F Si . Se<br />

S i <strong>de</strong>tectar a falha <strong>de</strong> todos os nós que ele monitora, S i chama a função UseBackup(), a<br />

fim <strong>de</strong> se tornar o novo <strong>de</strong>tentor do REAL token.<br />

A função UseBackup() adiciona a count Si o número <strong>de</strong> nós que S i <strong>de</strong>tectou<br />

terem falhados (linha 39), o que garante a coerência <strong>de</strong> count Si e que mensagens antigas<br />

que possam chegar mais tar<strong>de</strong> a S i sejam <strong>de</strong>scartadas. Ela também altera o valor da<br />

variável token Si <strong>de</strong> BACKUP para REAL (linha 40). Antes <strong>de</strong> entregar o token à<br />

aplicação, S i po<strong>de</strong> atualizar a informação armazenada no token (linha 41), se necessário.<br />

Por exemplo, o algoritmo <strong>de</strong> <strong>de</strong>tecção <strong>de</strong> término da aplicação <strong>de</strong> Misra [Misra 1983]<br />

guarda um contador no token e este precisa ser atualizado antes que o token seja entregue<br />

à aplicação se o novo <strong>de</strong>tentor do token não o recebeu <strong>de</strong> seu nó pre<strong>de</strong>cessor. Para mais<br />

<strong>de</strong>talhes veja a seção 3.4. Vale ressaltar que a criação <strong>de</strong> um novo token é bastante eficaz<br />

pois basicamente consiste em consi<strong>de</strong>rar uma das cópias BACKUP do token como o<br />

REAL token.<br />

3.3. Esboço da Prova <strong>de</strong> Correção<br />

Alguns dos principais argumentos da prova <strong>de</strong> que o algoritmo da Figura 2 satisfaz as<br />

proprieda<strong>de</strong>s <strong>de</strong> segurança (safety) e vivacida<strong>de</strong> (liveness) são apresentados nesta subseção.<br />

Definições: Consi<strong>de</strong>ramos que o tempo é discretizado pela chamada às funções<br />

SafeSendT oken, SafeReceiveT oken e UseBackup. t = 0 é estabelecido pela<br />

chamada da função Initialisation. C <strong>de</strong>nota o tempo discretizado enquanto que C d , o<br />

tempo discretizado referente às chamadas das funções UseBackup. Processos não têm

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!