Here are the 4 options I know of for linearizable reads in Paxos that don't require a full protocol execution. Did I miss anything?

1. Read the state at the leader and then have the leader check with a quorum to verify it was still the leader at the time of the read. Slow due to round-trip message delay for quorum check, but does not require any clocks and can instantly fail over to a new leader.

2. Read the state at the leader and return immediately to the client, given that the leader still holds a lease. Much faster, but requires clocks with skew bound and forces clients to wait out the lease time on leader failure.

3. ("Paxos Quorum Reads") Find the latest possibly-accepted proposal from a Phase-1 quorum of acceptors, then contact a single learner and wait for it to apply that proposal to its local state and return the result. Interestingly, this still works even if the original proposal was abandoned (so its slot might be overwritten with a no-op by a new leader), or if the learner has already applied a higher-numbered proposal to its state. Why? Because a Phase-1 quorum intersects with any Phase-2 quorum, the highest accepted slot observed in a Phase-1 quorum is either the latest committed write or is an upper bound on the latest committed write, so the final read observes either the latest committed write before the read started, or a write that was logically committed during the read (i.e., between its invocation and completion events). Hence reads are always linearizable.

4. ("Paxos Quorum Leases") Ensure that the acceptor instance associated with a given learner is always part of the write quorum for writes to the objects the learner holds a lease on. Then the learner can serve reads directly to those objects, unless its associated acceptor has accepted a proposal affecting those objects, in which case the learner must wait until the leader commits this proposal and it applied the proposal to its local state before serving a local read to that object. Similarly to (2), a learner failure requires the leader to wait out the lease time before configuring a new lease quorum, so for the duration of the lease it must reject any proposals affecting objects in that lease quorum.

Linearizable, Wait-free Reads of Replicated State Machines

@tobinbaker This approach is most similar to (3) but has the advantage of not relying on a Paxos instance to complete, so it’s actually wait-free and completes in a set number of round trips to a quorum.
@emichael Interesting post! To use the classical "acceptor"/"learner" terminology (which I find helpful in general), what's interesting to me about this "synchronous read repair of learners" is that it's not just analogous to the read phase of ABD, but also to Paxos itself! (I.e., any proposer must propagate the highest-round accepted value that it finds, if it exists, within a read quorum of acceptors to a write quorum of acceptors.) Here we're doing basically the same thing, but for learners instead of acceptors. (Another difference is that unlike Phase 2 of Paxos, this propagation must inevitably succeed, while in Paxos it can be aborted by a competing proposer.) Also note that if learners are independent of acceptors, we can deploy any read/write quorum system we want for learners, regardless of the quorum system we're using for acceptors.