Sprzeczność w prostym papierze Lamporta

Faza 2. a) jeżeli wnioskodawca otrzyma odpowiedź na swoje wnioski przygotowawcze (numerowane n) od większości akceptantów, to wysyła żądanie Akceptuj do każdego z tych akceptantów dla propozycji numerowanej n o wartości v, gdzie v jest wartością najwyżej ponumerowanej propozycji wśród odpowiedzi lub jest dowolną wartością, jeśli odpowiedzi nie zgłosiły żadnych propozycji.

Jak wspomniano w artykule,

Wnioskodawca wystawia propozycję wysyłając, do pewnego zestawu akceptantów, wniosek o przyjęcie wniosku. (nie musi to być ten sam zestaw akceptantów, którzy odpowiedzieli na początkowe wnioski.)"

Ale jak rozumiem, jeśli zmienimy fazę 2. a) do:

Jeśli wnioskodawca otrzyma odpowiedź na swoje żądania prepare (numerowane n) od większości akceptantów, wysyła żądanie accept do arbitralny zbiór akceptantów większości dla propozycji numerowanej n o wartości v, gdzie v jest wartością najwyżej numerowanego wniosku spośród odpowiedzi, lub jest dowolną wartością, jeśli odpowiedzi nie zgłosiły żadnych propozycji.

Algorytm się nie powiedzie, oto przykład. Należy wziąć pod uwagę, że istnieją całkowicie 3 akceptantów ABC. Użyjemy X (n: v,m), aby określić status akceptanta X: propozycja n: v jest największą ponumerowaną propozycją zaakceptowaną przez X, gdzie n to numer propozycji, A v to wartość propozycji, A m to liczba największego ponumerowanego żądania przygotowania, które X nigdy nie odpowiedział.

  1. P1 wysyła 'prepare 1' do AB
  2. oba AB odpowiadają P1 z obietnicą, że nie przyjmą żadnego żądania o numerze mniejszym niż 1. Teraz status to: A(-:-,1) B (-: -, 1) C(-:-,-)
  3. P1 odbiera odpowiedzi, a następnie utknie i biegnie bardzo powoli
  4. P2 wysyła 'przygotuj 100' do AB
  5. oba AB odpowiadają P2 z obietnicą, że nie przyjmą żadnego żądania o numerze mniejszym niż 100. Teraz status to: A(-:-,100) B (-: -, 100) C(-:-,-)
  6. P2 odbiera odpowiedzi, Wybiera wartość b i wysyła 'accept 100: b' do BC
  7. BC odbiór i akceptacja żądania accept, status to: a(-:-,100) B(100:b,100) C(100:B,-). Uwaga: propozycja 100: b została wybrana.
  8. P1 wznawia, Wybiera wartość a i wysyła 'accept 1: a'do BC
  9. B nie akceptuje tego, ale c akceptuje to, ponieważ c nigdy niczego nie obiecuje. Status to: A(-:-,100) B(100:b,100) C(1:a,-). Wybrana propozycja została odrzucona, Paxos zawiedzie.

Czy tęskniłem masz coś? Dzięki.

Author: lambda, 2015-04-26

7 answers

Przegapiłeś coś w kroku 7. Gdy C przetwarza {[0] } ustawia swój stan na C(100:b,100). akceptując wartość węzeł obiecuje również nie akceptować wcześniejszych wartości.


Aktualizacja. myślałem o tym cały miesiąc, ponieważ wiedziałem, że powyższa odpowiedź nie jest absolutnie poprawna.

Co więcej, przejrzałem kilka implementacji Paxos o otwartym kodzie źródłowym i wszystkie miały błąd zgłoszony przez OP!

Oto poprawna odpowiedź, gdy oglądane W Całości z Paxos Made Simple:

Jeśli wnioskodawca otrzyma odpowiedź na swoje żądania prepare (ponumerowane n) od większości akceptantów, wysyła żądanie accept do każdego z nich Ci akceptanci dla wniosku o numerze N z wartością v, gdzie v jest wartością wniosku o najwyższym numerze spośród odpowiedzi, lub jest dowolną wartością, jeśli odpowiedzi nie zgłosiły żadnych propozycji. (podkreślenie moje)

Innymi słowy, kandydat może wysyłać tylko Accept Wiadomości do akceptantów, które otrzymałPromises od dla tego numeru głosowania.

Czy jest to sprzeczność w artykule Lamporta? Teraz mówię "tak".


Jeśli spojrzysz na dowody Paxos Lamporta, on traktuje accept jako promise, tak jak sugeruje moja oryginalna odpowiedź. Ale nie jest to wskazane w Paxos Made Simple. W rzeczywistości wydaje się, że Lamport zadał sobie wiele trudu, aby sprecyzować, że an accept nie było promise.

Problem polega na połączeniu słabszych części obu wariantów; tak jak zrobił to OP i kilka implementacji. Potem wpadasz na ten katastrofalny błąd.

 7
Author: Michael Deardeuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-14 08:53:04

Z pewnością nie ma problemu z wysłaniem żądania Akceptuj do wszystkich akceptantów. Nie musisz ograniczać go tylko do tych, które odpowiedziały na oryginalne żądanie przygotowania. Znalazłeś rzadki przypadek złego sformułowania w piśmie doktora Lamporta.

Jest jednak błąd w kontrprzykładu. Po pierwsze, zapis jest zdefiniowany w następujący sposób:

X(n:v,m) aby określić status akceptanta X: propozycja n:v jest największą ponumerowaną propozycją zaakceptowaną przez X

Ale potem w kroku 7 węzeł C ma stan C(100:b,-), a następnie w kroku 9 zmienia się na stan C(1:a,-). Nie jest to poprawne przejście: po zaakceptowaniu 1:a powinna pozostać w stanie C(100:b,-), ponieważ 100:b jest nadal największą ponumerowaną propozycją zaakceptowaną przez C.

Zauważ, że to jest w porządku, że akceptuje 1:a po 100:b, głównie dlatego, że sieć jest asynchroniczna, więc wszystkie wiadomości mogą być opóźnione lub zmienione bez niszczenia czegokolwiek, więc reszta świata Nie wiem, która propozycja została przyjęta jako pierwsza.

 6
Author: Dave Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 10:59:03

NECROBUMP. Nawet przy słabszej części obu wariantów nie ma niespójności. Spójrzmy na krok 9 w przykładzie w pytaniu:

"Stan jest a (-: -, 100) B (100:b,100) C(1:a,-). Wybrana propozycja jest porzucona, Paxos zawiedzie "

Jednak w tym momencie wszystko, co mamy, to wartość nieokreślona, ponieważ nie ma wartości akceptowanej przez większość (musimy ostatecznie wybrać "b", ponieważ b została zaakceptowana przez większość podczas kroku 6.)

Aby kontynuować protokół, my potrzebujesz nowych kart do głosowania i ostatecznie niektóre nowsze karty do głosowania zostaną zaakceptowane. Głosowanie musi mieć wartość "b",

Dowód: C odpowie za pomocą (100, 'b') na każde przygotowane żądanie, ponieważ najwyżej numerowaną kartą do głosowania jest (100, 'b'), nawet jeśli ostatnia zaakceptowała kartę do głosowania (1, 'a'). B odpowie również za pomocą (100, 'b'). W związku z tym nie jest już możliwe uzyskanie większości głosów z jakąkolwiek wartością, ale "b".

Język Lamporta polega na tym, że akceptant odpowie " propozycją z najwyższa liczba mniejsza od N, którą zaakceptowała, jeśli Dowolna "

Zaakceptowana odpowiedź myli "najwyższy numer" z "ostatnio zaakceptowaną", ponieważ przykład pokazuje, że akceptant może przyjmować wartości w malejącej kolejności. Aby całkowicie dostosować się do protokołu Lamporta, C musi pamiętać, że odpowiedział na (100, 'b'), nawet jeśli" najnowsza " akceptacja jest (1, 'a').

(nie zdziwiłbym się, gdyby wiele implementacji tego nie prawidłowo, a zatem są podatne na ten problem.)

 2
Author: Ben Braun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 03:03:51

W artykule jest pewna dwuznaczność, dlatego Specyfikacja TLA+, a nie Papier powinna być używana do implementacji algorytmu.

Akceptując wartość, akceptant musi ponownie zaktualizować swój stan, a mianowicie ostatnio obiecane głosowanie. Jest to jasne ze specyfikacji Paxos tla + , Sprawdź fazę 2b, w której acceptor aktualizuje maxBal, i porównaj z fazą 1b, gdzie robi to samo.

Leslie Lamport zajmuje się tym pytaniem w swoim ostatnim wykład , gdzie wyjaśnia, że odbywa się to specjalnie po to, aby zbiór akceptorów różnił się od zbioru węzłów obiecujących głosowanie.

 1
Author: Kostja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-26 08:24:09

C nie może przyjąć propozycji, ponieważ nie przeszła fazy 1. IOWs aby vale został zaakceptowany przez akceptanta, akceptant musi przejść przez obie fazy protokołu.

 0
Author: sparty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-24 14:28:23

Jeśli akceptując wartość węzeł obiecuje również nie akceptować wcześniejszych wartości, algorytm jest poprawny, ale w artykule Lamport nie wspomniał o tym wymogu, prawda?

Powyższy warunek nie jest wymagany. Załóżmy, że najwyższa karta do głosowania obiecana przez akceptanta to X. Załóżmy, że przychodząca wiadomość Akceptuj ma numer karty do głosowania Y. Jeśli Y X, oznacza to, że akceptant nie otrzymał żądania przygotowania dla Y. oznacza to, że otrzymaliśmy nieprawidłową wiadomość paxos. W takim przypadku wiadomość accept dla Y powinna zostać odrzucona.

Jedynym wyjątkiem jest sytuacja, gdy Y = = 0. W takim przypadku wystawienie karty z numerem do głosowania 0 nie ma sensu, ponieważ numery do głosowania poniżej 0 są nieważne. Tak więc faza 1 może zostać pominięta dla głosowania 0, a kandydat może bezpośrednio przejść do fazy 2. W tym przypadku, tzn. gdy y == 0, akceptor może przyjąć wartość tylko wtedy, gdy nie zaakceptował wartości. To jest to samo, co proponujesz powyżej, ale jest to wymagane tylko w zoptymalizowanej wersji Paxos, gdzie fazę 1 można pominąć dla Y == 0.

IOWs, jedyny raz, kiedy akceptor akceptuje wartość jest wtedy, gdy Y = = X. jedynym wyjątkiem jest, gdy Y = = 0. W takim przypadku akceptant może przyjąć wartość tylko wtedy, gdy nie zaakceptował wartości.

 0
Author: seattlesparty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 08:00:36

Zgadzam się z większością odpowiedzi Bena Brauna.

C może zaakceptować (1, a), nie zmienia wybranej wartości. Powiedzmy C accepted (1, a), a przyjrzymy się historii accept z perspektywy ucznia.

(100, b) przyjęte przez B i C
(1, a) jest akceptowane przez C

(100, b) jest wybierany, ponieważ jest akceptowany przez większość akceptantów.

W tym momencie protokół nie musi być kontynuowany, jeśli uczeń ma pełną historię akceptacji, chyba, że uczniowie nie zdali egzaminu lub wiadomości do uczniów zostały utracone. Tu nie zgadzam się z odpowiedzią Bena Brauna.

Ale akceptanci powinni zachować zaakceptowaną propozycję z największą liczbą, w przypadku wydania nowej propozycji.

Update: zgadzam się również z Dave ' em Turnerem, że w rzeczywistości nie ma powodu, aby zaakceptować niższą numerację propozycji. Numer wniosku jest jak logiczny zegar czasu, można bezpiecznie ignorować Starsze wiadomości.

 0
Author: Siyuan Xiang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-21 19:23:56