Protokół komunikacji
Priorytet stanu
Używany podczas aktualizacji stanu od strony wątku Sieci. Ma zapewnić jednoznaczność stanu na podstawie zbioru przekształceń niezależnie od ich kolejności. Niższy numer - wyższy priorytet:
- Obliczone
- Zajęte
- Wolne
W sytuacji konfliktu w ramach stanu wygrywa ten, którego właścicielem jest Node o niższym id.
Dołączanie do sieci
- Tworzy połączenie z nodem głównym publicznym.
- Wysyła wiadomość pytanie o listę nodów do głównego publicznego.
- Otrzymuje wiadomość odpowiedź z listą nodów.
- Tworzy połączenie ze wszystkimi pozostałymi nodami publicznymi.
- Rozpoczyna kolejkowanie wiadomości z sieci.
- Wysyła wiadomość powitalną do wszystkich nodów.
- Wysyła pytanie o postęp obliczeń do losowego noda.
- Otrzymuje odpowiedź z postępem obliczeń i inicjalizuje stan.
- Aplikuje otrzymane zmiany stanu do obiektu stanu.
- Node rozpoczyna zwykłą pracę.
Protokół jest zawodny w pewnym scenariuszu. Dlatego potrzebna jest dodatkowa synchronizacja stanu obliczeń między nodami. Zapewnia ją potwierdzenie zajęcia danych oraz protokół końcowej synchronizacji.
Heart beat
Potrzebne są dwie struktury danych:
- słownik
{node_id: beat_timeout}
. Dla każdego noda przechowuje czas przedawnienia ostatniej wiadomości heart beat. Elementy są dodawane podczas inicjalizacji na podstawie listy nodów, lub gdy node otrzyma wiadomość powitalną. Jest aktualizowana przy każdym otrzymaniu wiadomości heart beat. - kolejka priorytetowa zaiwerająca pary
(id_noda, beat_timeout)
. Priorytetem jest czas przedawnienia (od najwcześniejszych). Przy otrzymaniu wiadomości heart beat odpowiednia para jest dodawana do kolejki. Element jest ściągany, gdy czas przedawnienia upłynie. Wtedy jest sprawdzany czas przedawnienia w słowniku i jeśli również upłynął, odpowiedni node jest rozłączany.
Rezerwowanie zadania
- Wątek obliczeń prosi o zadanie.
- Wątek stanu daje zadanie i informuje wątek sieci o rezerwacji.
- Wątek sieci wysyła wiadomość “zajmuję dane”.
- Pozostałe nody aktualizują swój stan na podstawie priorytetu i odsyłają potwierdzenie zajęcia danych ze stanem po aktualizacji.
- Node otrzymuje potwierdzenia zajęcia danych.
- Aktualizuje stan na podstawie odpowiedzi i jeśli to konieczne, informuje odpowiedni wątek obliczeń o zadaniu do przerwania.
Kończenie zadania
- Wątek obliczeń po zakończeniu zadania informuje o tym wątek stanu.
- Wątek stanu zmienia stan i informuje o tym wątek sieci.
- Wątek sieci wysyła wiadomość broadcast “obliczyłem”.
- Pozostałe nody aktualizują stan według priorytetu.
Końcowa synchronizacja
- Aktywuje się, gdy wszystkie zadania w stanie lokalnym staną się zajęte, lub obliczone.
- Wysyła pytania o synchronizację niedokończonych zadań do nodów, które nie ukończyły swojego zadania (według lokalnego stanu). Pytanie dla każdego noda dotyczy tylko powiązanych z nim zadań.
- Otrzymuje odpowiedzi synchronizujące zadania i aktualizuje stan.