1. On any replica: | 2. Upon rL∉R ∧ rc ≠ self | 3. LE ← true | 4. rc ← SelectLeader() | 5. If rc = self then | 6. Reliably broadcast LE_QUERY to G∩R | 7. | 8. SelectLeader() | 9. Rc := | 10. If = 1, then | 11. Return ri: ri∈Rc | 12. Else | 13. Return ri: ri∈Rc ∧ ri.ID = | 14. | 15. | 16 Upon LE_QUERY from rc | 17. If rc∈R ∧ rc = SelectLeader(), then | 18. LE ← true | 19. LE_STATE ← (Qd, E, cid, G, epoch) | 20. Reliably send LAST_STATE to rc | 21. Else | 22. Reliably send NACK to rc | 23. | 24. Upon LOAD_LEADER(Qd’, E’, epoch’, cid’, G’, Init) | from rc ∧ rc∈R ∧ rc = SelectLeader() | 25. (Qd, E, cid, G, epoch) ← (Qd’, E’, cid’, G’, epoch’ + 1) | 26. (rL, rc) ← (rc, ⊥) | 27. LE ← false | 28. If newReplica = true, then // New replica initialization is | 29. Initialize(Init) needed, in case that a group | 30. newReplica ← false reconfiguration is interrupted | by a leader election | 31. | 32. | 33. Upon NACK from ri | 34. If self = Selectleader() | 35. Reliably send LE_QUERY to ri | 36. Else | 37. rc ← ⊥ | 38. | 39. Upon LE_STATE(Qd,i, Ei, cidi, Gi, epochi) from ri | 40. Events←Events∪ | 41. Decisions←Decision∪ | 42. Configs←Configs∪ | 43. Epochs←Epochs∪ | 44. Senders←Senders∪ | 45. | 46. Upon G∩R ⊆ Senders | 47. Qd ← Longest(Events) | 48. E ← Merge(Decisions) | 49. (cid, G) ← Latest(Configs) | 50. epoch ← Latest(Epochs) | 51. Init← (t0,, (λc, state), // state: current application | ,S) state | 52. LOAD_ LEADER ← (Qd, E, epoch, cid, G, Init) | 53. Reliably broadcast LOAD_LEADER to G∩R | 54. Broadcast G to S |
|