Section 4: Lab 3
CSE 452 Autumn 2025
Announcements
Where we are in the course:
Lab 1: exactly-once execution of RPCs despite unreliable network conditions
Lab 2: primary/backup replication
What if server crashes :’)
What if view server crashes :’)
Motivation
At a high level, Paxos works with majorities (more than half) and promises
Simple Paxos
Simple Paxos
Implementation Details
Messages
Acceptor State
Example: Proposer Protocol
A
Q
M
K
Proposers
Acceptors
HP#
HP#
HP#
*HP#: highest prepare proposal number
2
2
2
2
-1, null
-1, null
-1, null
-1, null
-1, null
2, V1
2, V1
2, V1
A(2, V1)
Example: Proposer Protocol
A
Q
M
K
Proposers
Acceptors
HP#
HP#
HP#
*HP#: highest prepare proposal number
2
2
-1, null
-1, null
2, V1
4
4
2
4
4
-1, null
-1, null
4, V2
4, V2
4, V2
A(4, V2)
Example: Proposer Protocol
A proposer chooses a new proposal number n and sends a prepare request to each member of some (majority) set of acceptors, asking it to respond with:
A
Q
M
K
Proposers
Acceptors
2, V1
4, V2
8
8
8
Prepare Request
HP# 2
HP# 4
HP# 4
-1, null
*HP#: highest prepare proposal number
Example: Proposer Protocol
A proposer chooses a new proposal number n and sends a prepare request to each member of some (majority) set of acceptors, asking it to respond with:
A
Q
M
K
Proposers
Acceptors
2, V1
4, V2
HP# 8
HP# 8
HP# 8
-1, null
i solemnly promise to never accept anything less than 8
*HP#: highest prepare proposal number
Example: Proposer Protocol
A proposer chooses a new proposal number n and sends a prepare request to each member of some (majority) set of acceptors, asking it to respond with:
A
Q
M
K
Proposers
Acceptors
2, V1
4, V2
HP# 8
HP# 8
HP# 8
-1, null
2, V1
-1, null
4, V2
Prepare Reply
*HP#: highest prepare proposal number
majority,
:D
i solemnly promise to never accept anything less than 8
Example: Proposer Protocol
A
Q
M
K
Proposers
Acceptors
2, V1
4, V2
HP# 8
HP# 8
HP# 8
-1, null
*HP#: highest prepare proposal number
What value could be proposed?
8, V2
8, V2
8, V2
Accept Request
A more detailed example…
p1
p2
A1
A2
A3
HP#, HA#, HAV
-1, -1, null
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
-1, -1, null
-1, -1, null
p1
p2
A1
A2
A3
HP#, HA#, HAV
-1, -1, null
-1, -1, null
-1, -1, null
P(1)
P(1)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, -1, null
-1, -1, null
1, -1, null
PR(-1, null)
PR(-1, null)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, -1, null
-1, -1, null
1, -1, null
A(1, v1)
A(1, v1)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
-1, -1, null
1, -1, null
AR(accept)
A(1, v1)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
-1, -1, null
1, -1, null
A(1, v1)
P(2)
P(2)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
2, -1, null
2, -1, null
A(1, v1)
PR(-1, null)
PR(-1, null)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
2, -1, null
2, -1, null
A(1, v1)
A(2, v2)
A(2, v2)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
2, 2, v2
2, -1, null
A(1, v1)
A(2, v2)
AR(accept)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
Worksheet: Once A3 has accepted A(2, v2), what are the possible final consensus values?
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
2, 2, v2
2, -1, null
A(1, v1)
A(2, v2)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
2, 2, v2
2, -1, null
AR(reject)
A(2, v2)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
1, 1, v1
2, 2, v2
2, -1, null
A(2, v2)
P(3)
P(3)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
Worksheet: What are acceptor responses to P(3), what happens to HP#, HA#, HAV?
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 1, v1
2, 2, v2
3, -1, null
A(2, v2)
PR(1, v1)
PR(-1, null)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 1, v1
2, 2, v2
3, -1, null
A(2, v2)
A(3, v1)
A(3, v1)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
2, 2, v2
3, 3, v1
A(2, v2)
AR(accept)
AR(accept)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
Worksheet: Once A1 and A2 accept A(3, v1), what are the possible final consensus values?
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
2, 2, v2
3, 3, v1
A(2, v2)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
Worksheet: What happens to the delayed A(2, v2)?
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
2, 2, v2
3, 3, v1
AR(reject)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
2, 2, v2
3, 3, v1
P(4)
P(4)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
4, 2, v2
4, 3, v1
PR(3, v1)
PR(2, v2)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
4, 2, v2
4, 3, v1
A(4, v1)
A(4, v1)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
4, 4, v1
4, 4, v1
AR(accept)
AR(accept)
P: Prepare Request
PR: Prepare Reply
A: Accept Request
AR: Accept Reply
HP#: Highest Prepare Proposal Number
HA#: Highest Accepted Proposal Number
HAV: Highest Accepted Value
p1
p2
A1
A2
A3
HP#, HA#, HAV
3, 3, v1
4, 4, v1
4, 4, v1
Consensus Value: v1
🥳🎉🙌
A Problem: Reusing Proposal Numbers
P1
P2
P3
P(0)
P(0)
P(0)
P(0)
(0, -)
(0, -)
(0, -)
(0, u), (0, v)???
A(0, u)
A(0, u)
(0, u)
(0, u)
(0, v)
(0, v)
A(0, v)
A(0, v)
What could now go wrong at p3 when it sends the Prepare msg?
Guaranteeing Unique Proposal Numbers
Putting it all together…
Server1
1
2
3
4
...
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server1
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
P(1, 1.1)
P(1, 1.1)
Key:
<message>(<slot #>, <proposal #>)
Colors:
Not started
In progress
Value chosen
Server1
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
PR(1, -1, null)
PR(1, -1, null)
Key:
P(<slot #>, <proposal #>)
PR(<slot #>, HP#, HAV)
Colors:
Not started
In progress
Value chosen
Server1
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
PR(1, -1, null)
PR(1, -1, null)
Key:
P(<slot #>, <proposal #>)
PR(<slot #>, HP#, HAV)
Colors:
Not started
In progress
Value chosen
P(2, 1.3)
P(2, 1.3)
Paxos election can happen across multiple slots simultaneously.
Server1
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
A(1, 1.1, S1)
A(1, 1.1, S1)
Key:
P(<slot #>, <proposal #>)
PR(<slot #>, HP#, HAV)
A(<slot #>, <proposal #>, <proposal value>)
Colors:
Not started
In progress
Value chosen
PR(2, -1, null)
PR(2, -1, null)
Paxos election can happen across multiple slots simultaneously.
Server1
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
AR()
A(1, 1.1, S1)
Key:
P(<slot #>, <proposal #>)
PR(<slot #>, HP#, HAV)
A(<slot #>, <proposal #>, <proposal value>)
AR() // accepted
Colors:
Not started
In progress
Value chosen
PR(2, -1, null)
PR(2, -1, null)
Paxos election can happen across multiple slots simultaneously.
Server1
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:1.3
HA#:1.3
HAV:S2
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:
HAV:
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
A(1, 1.1, S1)
Key:
P(<slot #>, <proposal #>)
PR(<slot #>, HP#, HAV)
A(<slot #>, <proposal #>, <proposal value>)
AR() // accepted
Colors:
Not started
In progress
Value chosen
A(2, 1.3, S3)
A(2, 1.3, S3)
Paxos election can happen across multiple slots simultaneously.
Server1
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:1.3
HAV:S3
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:1.3
HA#:1.3
HAV:S2
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:1.3
HAV:S3
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
A(1, 1.1, S1)
Key:
P(<slot #>, <proposal #>)
PR(<slot #>, HP#, HAV)
A(<slot #>, <proposal #>, <proposal value>)
AR() // accepted
Colors:
Not started
In progress
Value chosen
AR()
AR()
Paxos election can happen across multiple slots simultaneously.
Server1
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:1.3
HAV:S3
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server3
1
2
3
4
...
HP#:1.1
HA#:
HAV:
HP#:1.3
HA#:1.3
HAV:S2
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
Server2
1
2
3
4
...
HP#:1.1
HA#:1.1
HAV:S1
HP#:1.3
HA#:1.3
HAV:S3
HP#:
HA#:
HAV:
HP#:
HA#:
HAV:
A(1, 1.1, S1)
Key:
P(<slot #>, <proposal #>)
PR(<slot #>, HP#, HAV)
A(<slot #>, <proposal #>, <proposal value>)
AR() // accepted
Colors:
Not started
In progress
Value chosen
Paxos election can happen across multiple slots simultaneously.