It's magic!
--- Paxos Proposer ---
1 proposer(v):
2 choose n, unique and higher than any n seen so far
3 send prepare(n) to all servers including self
4 if prepare_ok(n, n_a, v_a) from majority:
5 v' = v_a with highest n_a; choose own v otherwise
6 send accept(n, v') to all
7 if accept_ok(n) from majority:
8 send decided(v') to all
--- Paxos Acceptor ---
acceptor state:
must persist across reboots
n_p (highest prepare seen)
n_a, v_a (highest accept seen)
acceptor's prepare handler:
10 prepare(n):
11 if n > n_p
12 n_p = n
13 reply prepare_ok(n, n_a, v_a)
14 else
15 reply prepare_reject
acceptor's accept(n, v) handler:
16 accept(n, v):
17 if n >= n_p
18 n_p = n
19 n_a = n
20 v_a = v
21 reply accept_ok(n)
22 else
23 reply accept_reject