{
  "status": "unknown",
  "advantages": [],
  "limitations": [],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-11-04",
  "slug": "flexible-paxos",
  "term": "Flexible Paxos",
  "aliases": [
    "FPaxos"
  ],
  "definition": "Flexible Paxos generalizes Paxos by requiring intersection between phase-1 and phase-2 quorum families without requiring intersection within each phase.",
  "note": "For arbitrary q1- and q2-member subsets of N acceptors, q1 + q2 > N ensures cross-phase intersection. These are proposal phases, not application read/write quorums. [fpaxos]\n\nAt N=5, q1=4, q2=2, two reachable acceptors can meet a prepared, unpreempted leader's phase-2 count; replacing it needs four for phase 1. [fpaxos]\n\nRestricted families differ: in a 2-by-3 grid, full rows for phase 1 intersect full columns for phase 2. Losing a row preserves phase 1 but blocks phase 2. Identities matter, not just counts. [fpaxos]\n\nOrdered proposals, promises, accepted-value selection and retained state remain necessary. Changing membership or families requires a protocol. Six size-based and four grid examples check sets, not messages, crash persistence or probabilities. [paxos-simple] [hesela-quorums]\n\nAcross three two-acceptor domains, none of the 15 placements preserves both families after every domain loss: nine do for two losses, six for none. All retain phase 2, usable with a surviving prepared, unpreempted leader. These are not outage probabilities. [hesela-domains]\n\nA failed set blocks a family by hitting every quorum. The grid has nine minimal phase-1 cuts and eight phase-2 cuts. A fresh round needs both families: their blocking union has eleven inclusion-minimal cuts, nine cross-row pairs and two whole-row triples. Minimal is not minimum-size; keeping only pairs misses the triples. These are not data-loss or outage probabilities. Naor/Wool supplies the event definition, not these counts or its independent-failure assumption for this grid. [naor-wool] [hesela-cuts]",
  "related": [
    "paxos",
    "quorum-intersection",
    "write-quorum",
    "linearizability",
    "failure-domain"
  ],
  "citations": [
    {
      "id": "fpaxos",
      "title": "Howard, Malkhi and Spiegelman. Flexible Paxos: Quorum Intersection Revisited. OPODIS 2016, LIPIcs 70 (2017), sections 3-7.",
      "url": "https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.OPODIS.2016.25",
      "accessed": "2026-11-04"
    },
    {
      "id": "paxos-simple",
      "title": "Leslie Lamport. Paxos Made Simple (2001), sections 2-3.",
      "url": "https://lamport.azurewebsites.net/pubs/paxos-simple.pdf",
      "accessed": "2026-11-04"
    },
    {
      "id": "hesela-quorums",
      "title": "Hesela: Flexible Paxos phase availability, exact set examples and limits",
      "url": "https://hesela.com/analyses/replica-repair-coverage/#flexible-quorums",
      "accessed": "2026-11-04"
    },
    {
      "id": "hesela-domains",
      "title": "Hesela: all 15 grid placements and 45 single-domain-loss cases, exact constructed enumeration",
      "url": "https://hesela.dev/research/flexible-quorum-domains.json",
      "accessed": "2026-11-04"
    },
    {
      "id": "naor-wool",
      "title": "Naor and Wool. The Load, Capacity, and Availability of Quorum Systems. SIAM J. Comput. 27(2), 1998, section 2.2.",
      "url": "https://doi.org/10.1137/S0097539795281232",
      "accessed": "2026-11-04"
    },
    {
      "id": "hesela-cuts",
      "title": "Hesela: minimal-cut certificates and all 64 failure subsets for the fixed six-acceptor grid",
      "url": "https://hesela.dev/research/flexible-quorum-cuts.json",
      "accessed": "2026-11-04"
    }
  ],
  "provenance": [
    "The OPODIS 2016 paper was published in LIPIcs on 6 April 2017; its prototype, safety proof and scope were reviewed separately. [fpaxos]",
    "The worked calculation does not rerun the authors' Mininet benchmark or TLA+ verification. No deployment speedup or availability percentage is claimed.",
    "Protocol classification, not a hardware lifecycle; status is unknown and firstSeen remains unset."
  ]
}
