10.03.2015 Views

Odporność na błędy bizantyjskie w systemach peer-to-peer - Instytut ...

Odporność na błędy bizantyjskie w systemach peer-to-peer - Instytut ...

Odporność na błędy bizantyjskie w systemach peer-to-peer - Instytut ...

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.

4.4 Pro<strong>to</strong>kół zachłanny 73<br />

Uzgadnianie wielowar<strong>to</strong>ściowe. Zanim repliki przystąpią do wyko<strong>na</strong>nia zlecenia<br />

muszą tą czynność potwierdzić za pomocą wielowar<strong>to</strong>ściowego uzgadniania<br />

opisanego w poprzednim rozdziale. Pro<strong>to</strong>kół realizujący wyko<strong>na</strong>nie zleceń <strong>na</strong>dsyłanych<br />

do grupy przez klientów jest wykonywany w <strong>na</strong>stępujących krokach:<br />

1. Gdy replika i otrzyma zlecenie r c s wysyła komunikat < vote-request, r g ,<br />

R i = r c s > σi do wszystkich replik, gdzie r g , <strong>to</strong> aktualny numer rundy,<br />

a R i , <strong>to</strong> wek<strong>to</strong>r zleceń, w tym przypadku zakładamy, że replika nie posiadała<br />

żadnych zleceń w kolejce Q i . Gdyby okazało się, że w kolejce<br />

są zlecenia, <strong>to</strong> powinny zostać umieszczone <strong>na</strong> początku wek<strong>to</strong>ra R i ,tak<br />

by zlecenia były ułożone z rosnącym porządkiem sekwencji s rozpatrując<br />

poszczególnych klientów (np. R i = {r 1 1 ,r 1 2 ,r 3 2 ,,...}). War<strong>to</strong> zauważyć,<br />

że sposób uporządkowania elementów w R i ustawia zlecenia <strong>na</strong>dane przez<br />

tych samych klientów w jednej grupie. Takie postępowanie zapewnia brak<br />

wystąpienia konfliktów typu zapis-zapis w obrębie jednej rundy.<br />

2. Odebranie komunikatu < vote-request, r g , R j = r s c > σj <strong>na</strong>kłada obowiązek<br />

rozesłania odpowiedzi przez replikę, używając komunikatu < voteresponse,<br />

r g , R i > σi . Jeżeli r g okazałoby się nieprawidłowe, <strong>to</strong> replika<br />

powin<strong>na</strong> odpowiedzieć komunikatem z poprawnym r g . Komunikat voteresponse<br />

powinien zostać <strong>na</strong>dany wtedy i tylko wtedy, gdy replika wcześniej<br />

nie wysłała własnego komunikatu vote-request dla rundy o numerze<br />

r g . Replika otrzymawszy f +1 wiadomości z r g , różnym od własnego, ale<br />

takim samym z<strong>na</strong>czniku, powin<strong>na</strong> wprowadzić korektę i rozesłać jeszcze<br />

raz vote-response z poprawnym r g .<br />

3. Zgromadzenie przez i-tą replikę 2f +1 odpowiedzi vote-response uwzględniając<br />

siebie samą i/lub vote-request rozpoczy<strong>na</strong> fazę uzgadniania. Wek<strong>to</strong>ry<br />

R j składane są przez replikę w jeden wek<strong>to</strong>r R g zachowując porządek<br />

taki sam jak w R i , który <strong>na</strong>stępnie jest rozgłoszony < request-ready, r g ,<br />

R g > σi .Zebranief +1 takich samych komunikatów request-ready, może<br />

rozpocząć fazę przetwarzania zleceń.<br />

4. Pro<strong>to</strong>kół, który realizuje wyko<strong>na</strong>nie każdego zlecenia składa się z trójfazowego<br />

uzgadniania każdego wyko<strong>na</strong>nia:<br />

• Pierwszym komunikatem rozsyłanym przez replikę, jest < prepare,<br />

r g , H(R g (k)) > σi dla k-tego zlecenia w wek<strong>to</strong>rze R g .<br />

• Po odebraniu 2f +1 komunikatów prepare dla zlecenia R g (k), replika<br />

wykonuje żądanie i wysyła komunikat < pre-commit, r g , V g (k)<br />

> σi , który po odebraniu od 2f +1 powinien zostać potwierdzony komunikatem<br />

< commit, r g , H(V g (k)) > σi , co ostatecznie zatwierdza<br />

wyko<strong>na</strong>nie operacji R g (k).

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

Saved successfully!

Ooh no, something went wrong!