Cairn · module

Cairn.Optimistic.Server

lean/Cairn/Optimistic/Server.lean

Optimistic values against a server: convergence for any order of replies

The abstract server Cairn.Optimistic is proved against (docs/optimistic.md, "The server model"). A World is a table, the server (a register per key, reg), and the network: every request the table sent and every answer on its way back, as a bag (net) that any step may take any element of. The steps (World.press, serve, refuse, deliver, lose, retry, look) are every way the person, the server and the network can act:

  • the person sets a key (press);
  • the server handles a request: applies a write (its answer is acked) or answers a read with what it holds (serve), or refuses either (refuse): a refused write changes nothing;
  • the network delivers an answer to the table (deliver), or loses a request or an answer, before or after the server handled it: the table hears lost or readFailed (lose);
  • the backoff timer fires (retry), and the app fetches a view of a key (look), which may arrive after the key has changed.

Writes are idempotent: applying one sets the register to its value, so applying it once or twice is the same. A write is applied at most once here (serve takes the request out of the bag), which loses nothing: a second application would set the same value.

Ok is the invariant, kept by every step (Ok.press … Ok.look); from it:

  • Ok.converges: a settled key shows what the server holds (by same). So once nothing is in flight or in doubt, whatever order the replies came in, every key shows the server's value;
  • Ok.oneWrite: at most one write in flight per key;
  • Ok.writes_le_sets: never more writes sent for a key than the person's sets of it;
  • Ok.count: a settled key's count is the view's other people plus the server's own.

Every step changes one key; Ok is per key (KeyOk), and a step at one key leaves every other key's part as it was (World.at_*), which is also why replies for different keys commute (Table.feed_comm).

Imports Cairn.Optimistic

Order

Structures 4

structure

Cairn.Optimistic.KeyOk

lean/Cairn/Optimistic/Server.lean:97
KeyOk {V : Type} (same : V → V → Bool) (e : Entry V) (r : V)
  (ps : List (Pkt V)) : Prop

One key is consistent with the server's value r and its packets ps: no packet is from a request not yet made; every write in flight is the current request; a key never written is idle and every view of it says r; and the current packets fit the phase.

Fields
le : n ≤ e.seq
writes : p.seq? = some e.seq
unwritten : e.phase = Phase.idle ∧ ∀ (v : V), Pkt.view v ∈ ps → v = r
phase : PhaseOk same e r (List.filter (Pkt.cur e.seq) ps)
structure

Cairn.Optimistic.World

lean/Cairn/Optimistic/Server.lean:105
World (K V : Type) [Ord K] : Type

The person, the table, the server and the network.

Fields
table : Table K V
srv : Std.TreeMap K V compare

The server: a register per key (reg).

net : List (K × Pkt V)

Every request and answer on its way, keyed.

sets : List K

The key of every set, in order.

writes : List K

The key of every write the table sent, in order.

structure

Cairn.Optimistic.World.Ok

lean/Cairn/Optimistic/Server.lean:226
Ok {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) : Prop

The invariant: same is an equivalence, and every key is consistent, with writes within sets.

Fields
same : Same w.table.same
key : KeyOk w.table.same (w.table.get k) (w.reg k) («at» w.net k)
budget : Entry.Budget w.table.same (w.table.get k) (List.count k w.sets) (List.count k w.writes)
structure

Cairn.Optimistic.KeyOk.Rest

lean/Cairn/Optimistic/Server.lean:268
Rest {V : Type} (m : Nat) (ps : List (Pkt V)) : Prop

The packets of a key after its current request left: none from a later request, no write, none current.

Fields
le : n ≤ m
noWrite : q.isWrite = false
noCur : List.filter (Pkt.cur m) ps = []

Inductive types 3

inductive

Cairn.Optimistic.Pkt

lean/Cairn/Optimistic/Server.lean:44
Pkt (V : Type) : Type

A packet about one key, in the network. Numbers are the key's request numbers.

Constructors
write {V : Type} (n : Nat) (v : V) : Pkt V

A write the server hasn't handled.

read {V : Type} (n : Nat) : Pkt V

A read the server hasn't handled.

acked {V : Type} (n : Nat) : Pkt V

The server applied write n; the answer is on its way.

refused {V : Type} (n : Nat) : Pkt V

The server refused write n and didn't apply it.

answer {V : Type} (n : Nat) (v : V) : Pkt V

The server answered read n with v, what it held then.

failed {V : Type} (n : Nat) : Pkt V

The server refused read n.

view {V : Type} (v : V) : Pkt V

A view of the key, saying v.

Instances

Repr

inductive

Cairn.Optimistic.World.Step

lean/Cairn/Optimistic/Server.lean:204
Step {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V] :
  World K V → World K V → Prop

Every step.

Constructors
press {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (f : V → V) : w.Step (w.press k f)
serve {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : w.Step (w.serve k p)
refuse {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : w.Step (w.refuse k p)
deliver {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : w.Step (w.deliver k p)
lose {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : w.Step (w.lose k p)
retry {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) : w.Step (w.retry k)
look {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) : w.Step (w.look k)
inductive

Cairn.Optimistic.World.Reach

lean/Cairn/Optimistic/Server.lean:214
Reach {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V] :
  World K V → World K V → Prop

Some steps, in order.

Constructors
refl {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) : w.Reach w
tail {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  {a b c : World K V} : a.Reach b → b.Step c → a.Reach c

Definitions 24

def

Cairn.Optimistic.Pkt.seq?

lean/Cairn/Optimistic/Server.lean:64
seq? {V : Type} : Pkt V → Option Nat
def

Cairn.Optimistic.Pkt.isWrite

lean/Cairn/Optimistic/Server.lean:69
isWrite {V : Type} : Pkt V → Bool

A write, before or after the server handled it: a write in flight.

def

Cairn.Optimistic.Pkt.cur

lean/Cairn/Optimistic/Server.lean:74
cur {V : Type} (n : Nat) (p : Pkt V) : Bool

Whether the packet is request n of its key.

def

Cairn.Optimistic.Readish

lean/Cairn/Optimistic/Server.lean:79
Readish {V : Type} (n : Nat) (r : V) (p : Pkt V) : Prop

A read n, before or after the server handled it; an answer says r.

def

Cairn.Optimistic.PhaseOk

lean/Cairn/Optimistic/Server.lean:84
PhaseOk {V : Type} (same : V → V → Bool) (e : Entry V) (r : V)
  (cur : List (Pkt V)) : Prop

What a key's packets with its current number say, by phase. cur is those packets, r the server's value.

def

Cairn.Optimistic.World.reg

lean/Cairn/Optimistic/Server.lean:120
reg {K V : Type} [Ord K] (w : World K V) (k : K) : V

What the server holds for k.

def

Cairn.Optimistic.World.at

lean/Cairn/Optimistic/Server.lean:123
at {K V : Type} [DecidableEq K] (net : List (K × Pkt V)) (k : K) :
  List (Pkt V)

The packets about k.

def

Cairn.Optimistic.World.pktOf

lean/Cairn/Optimistic/Server.lean:127
pktOf {K V : Type} : Out K V → Option (K × Pkt V)

A table output, as the packet it puts in the network.

def

Cairn.Optimistic.World.writeOf

lean/Cairn/Optimistic/Server.lean:133
writeOf {K V : Type} : Out K V → Option K

A table output's key, if it is a write.

def

Cairn.Optimistic.World.feed

lean/Cairn/Optimistic/Server.lean:138
feed {K V : Type} [Ord K] (w : World K V) (i : Input K V) : World K V

The table hears i; what it sends goes into the network.

def

Cairn.Optimistic.World.press

lean/Cairn/Optimistic/Server.lean:144
press {K V : Type} [Ord K] (w : World K V) (k : K) (f : V → V) :
  World K V

The person sets k to f of what it shows.

def

Cairn.Optimistic.World.serve

lean/Cairn/Optimistic/Server.lean:148
serve {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : World K V

The server handles packet (k, p): applies a write, or answers a read with what it holds.

def

Cairn.Optimistic.World.refuse

lean/Cairn/Optimistic/Server.lean:157
refuse {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : World K V

The server refuses packet (k, p), and changes nothing.

def

Cairn.Optimistic.World.heard

lean/Cairn/Optimistic/Server.lean:166
heard {K V : Type} (k : K) : Pkt V → Option (Input K V)

The input the table hears when (k, p) arrives.

def

Cairn.Optimistic.World.missed

lean/Cairn/Optimistic/Server.lean:175
missed {K V : Type} (k : K) : Pkt V → Option (Input K V)

The input the table hears when (k, p) is lost on the way.

def

Cairn.Optimistic.World.deliver

lean/Cairn/Optimistic/Server.lean:181
deliver {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : World K V

The network delivers answer (k, p) to the table.

def

Cairn.Optimistic.World.lose

lean/Cairn/Optimistic/Server.lean:189
lose {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : World K V

The network loses (k, p), before or after the server handled it.

def

Cairn.Optimistic.World.retry

lean/Cairn/Optimistic/Server.lean:197
retry {K V : Type} [Ord K] (w : World K V) (k : K) : World K V

k's backoff timer fires.

def

Cairn.Optimistic.World.look

lean/Cairn/Optimistic/Server.lean:200
look {K V : Type} [Ord K] (w : World K V) (k : K) : World K V

The app fetches a view of k: what the server holds now, delivered whenever.

def

Cairn.Optimistic.World.start

lean/Cairn/Optimistic/Server.lean:220
start {K V : Type} [Ord K] (dflt : V) (same : V → V → Bool) :
  World K V

A world at the start: an empty table, a server holding dflt for every key (srv empty), nothing in the network.

def

Cairn.Optimistic.Pkt.ofAct

lean/Cairn/Optimistic/Server.lean:237
ofAct {V : Type} : Act V → Option (Pkt V)

An entry's action, as the packet it puts in the network.

def

Cairn.Optimistic.Pkt.heard

lean/Cairn/Optimistic/Server.lean:243
heard {V : Type} : Pkt V → Option (Ev V)

What the key hears when p arrives.

def

Cairn.Optimistic.Pkt.missed

lean/Cairn/Optimistic/Server.lean:252
missed {V : Type} : Pkt V → Option (Ev V)

What the key hears when p is lost.

def

Cairn.Optimistic.KeyOk.after

lean/Cairn/Optimistic/Server.lean:263
after {V : Type} (same : V → V → Bool) (e : Entry V)
  (ps : List (Pkt V)) (ev : Ev V) : List (Pkt V)

The key hears ev, with ps its packets after the one that brought ev left.

Theorems 71

theorem

Cairn.Optimistic.KeyOk.PhaseOk.small

provedlean/Cairn/Optimistic/Server.lean:273
small {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {cur : List (Pkt V)} (h : PhaseOk same e r cur) :
  cur = [] ∨ ∃ x, cur = [x]
theorem

Cairn.Optimistic.KeyOk.cur_mem

provedlean/Cairn/Optimistic/Server.lean:283
cur_mem {V : Type} [DecidableEq V] {ps : List (Pkt V)} {n : Nat}
  {p : Pkt V} (hp : p ∈ ps) (hc : Pkt.cur n p = true) : p ∈ List.filter (Pkt.cur n) ps
theorem

Cairn.Optimistic.KeyOk.single

provedlean/Cairn/Optimistic/Server.lean:287
single {V : Type} [DecidableEq V] {same : V → V → Bool} {e : Entry V}
  {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {p : Pkt V} (hp : p ∈ ps)
  (hc : Pkt.cur e.seq p = true) : List.filter (Pkt.cur e.seq) ps = [p]

A current packet is the only one.

theorem

Cairn.Optimistic.KeyOk.isWrite_cur

provedlean/Cairn/Optimistic/Server.lean:294
isWrite_cur {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {q : Pkt V}
  (hq : q ∈ ps) (hw : q.isWrite = true) : Pkt.cur e.seq q = true
theorem

Cairn.Optimistic.KeyOk.rest_erase

provedlean/Cairn/Optimistic/Server.lean:299
rest_erase {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {p : Pkt V}
  (hp : p ∈ ps) (hc : Pkt.cur e.seq p = true) : Rest e.seq (ps.erase p)

With the current packet gone, the rest.

theorem

Cairn.Optimistic.KeyOk.rest_self

provedlean/Cairn/Optimistic/Server.lean:311
rest_self {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps)
  (hnc : List.filter (Pkt.cur e.seq) ps = []) : Rest e.seq ps

With nothing current, all of them.

theorem

Cairn.Optimistic.KeyOk.fresh

provedlean/Cairn/Optimistic/Server.lean:320
fresh {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e e' : Entry V} {r : V} {ps : List (Pkt V)}
  (hle : ∀ (q : Pkt V), q ∈ ps → ∀ (n : Nat), q.seq? = some n → n ≤ e.seq)
  (hnw : ∀ (q : Pkt V), q ∈ ps → q.isWrite = false) (hs : e'.seq = e.seq + 1) {q : Pkt V}
  (hq : q.seq? = some e'.seq) (hph : PhaseOk same e' r [q]) (hw : e'.written = true) :
  KeyOk same e' r (ps ++ [q])

A new request: the rest, and the request's one packet.

theorem

Cairn.Optimistic.KeyOk.quiet

provedlean/Cairn/Optimistic/Server.lean:342
quiet {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e e' : Entry V} {r : V} {ps : List (Pkt V)} (h : Rest e.seq ps) (hs : e'.seq = e.seq)
  (hph : PhaseOk same e' r [])
  (hu : e'.written = false → e'.phase = Phase.idle ∧ ∀ (v : V), Pkt.view v ∈ ps → v = r) :
  KeyOk same e' r ps

Nothing new: the rest, with nothing current.

theorem

Cairn.Optimistic.KeyOk.erase_stale

provedlean/Cairn/Optimistic/Server.lean:350
erase_stale {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {p : Pkt V}
  (hc : Pkt.cur e.seq p = false) : KeyOk same e r (ps.erase p)

A packet that isn't current can go.

theorem

Cairn.Optimistic.KeyOk.open_facts

provedlean/Cairn/Optimistic/Server.lean:361
open_facts {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps)
  (ho : e.phase.isOpen = true) :
  (∀ (q : Pkt V), q ∈ ps → q.isWrite = false) ∧ e.server = r ∧ same e.want e.server = true

Nothing in flight: no write among the packets, and the server's value is confirmed.

theorem

Cairn.Optimistic.KeyOk.write_cases

provedlean/Cairn/Optimistic/Server.lean:383
write_cases {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {p : Pkt V}
  (hp : p ∈ ps) (hw : p.isWrite = true) :
  Pkt.cur e.seq p = true ∧
    e.written = true ∧
      ∃ w,
        e.phase = Phase.writing w ∧
          (p = Pkt.write e.seq w ∧ r = e.server ∨
            p = Pkt.acked e.seq ∧ r = w ∨ p = Pkt.refused e.seq ∧ r = e.server)

A write in flight is the current request, and the key is writing it.

theorem

Cairn.Optimistic.KeyOk.read_cases

provedlean/Cairn/Optimistic/Server.lean:407
read_cases {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {p : Pkt V}
  (hp : p ∈ ps) (hc : Pkt.cur e.seq p = true) (hw : p.isWrite = false) :
  Readish e.seq r p ∧
    e.written = true ∧
      (e.phase = Phase.checking ∧ e.server = r ∧ same e.want e.server = true ∨
        ∃ w, e.phase = Phase.doubt w)

A current read, before or after the server: the key is checking or in doubt.

theorem

Cairn.Optimistic.KeyOk.settle_ok

provedlean/Cairn/Optimistic/Server.lean:429
settle_ok {V : Type} [DecidableEq V] {same : V → V → Bool}
  (_hs : Same same) {e : Entry V} {r : V} {ps : List (Pkt V)} (h : Rest e.seq ps)
  (hw : e.written = true) (hr : e.server = r) :
  KeyOk same (Entry.settle same e).fst r
    (ps ++ List.filterMap Pkt.ofAct (Entry.settle same e).snd)

The server's value r is known: rest, or write toward want.

theorem

Cairn.Optimistic.KeyOk.rollback_ok

provedlean/Cairn/Optimistic/Server.lean:441
rollback_ok {V : Type} [DecidableEq V] {same : V → V → Bool}
  (hs : Same same) {e : Entry V} {r : V} {ps : List (Pkt V)} (h : Rest e.seq ps)
  (hw : e.written = true) (hr : e.server = r) (why : Reason) :
  KeyOk same (Entry.rollback same e why).fst r
    (ps ++ List.filterMap Pkt.ofAct (Entry.rollback same e why).snd)

Back to the server's value r.

theorem

Cairn.Optimistic.KeyOk.readFailed_ok

provedlean/Cairn/Optimistic/Server.lean:451
readFailed_ok {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {p : Pkt V}
  (hp : p ∈ ps) {n : Nat} (hn : p.seq? = some n) (hw : p.isWrite = false) :
  KeyOk same (Entry.step same e (Ev.readFailed n)).fst r
    (after same e (ps.erase p) (Ev.readFailed n))

A read's failure, current or stale.

theorem

Cairn.Optimistic.KeyOk.lost_ok

provedlean/Cairn/Optimistic/Server.lean:471
lost_ok {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {p : Pkt V}
  (hp : p ∈ ps) {n : Nat} (hn : p.seq? = some n) (hw : p.isWrite = true) :
  KeyOk same (Entry.step same e (Ev.lost n)).fst r (after same e (ps.erase p) (Ev.lost n))

A write's answer lost: in doubt, and a read.

theorem

Cairn.Optimistic.KeyOk.press

provedlean/Cairn/Optimistic/Server.lean:483
press {V : Type} [DecidableEq V] {same : V → V → Bool}
  (_hs : Same same) {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps)
  (f : V → V) : KeyOk same (Entry.step same e (Ev.set f)).fst r (after same e ps (Ev.set f))
theorem

Cairn.Optimistic.KeyOk.retry

provedlean/Cairn/Optimistic/Server.lean:510
retry {V : Type} [DecidableEq V] {same : V → V → Bool}
  (_hs : Same same) {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) :
  KeyOk same (Entry.step same e Ev.retry).fst r (after same e ps Ev.retry)
theorem

Cairn.Optimistic.KeyOk.look

provedlean/Cairn/Optimistic/Server.lean:522
look {V : Type} [DecidableEq V] {same : V → V → Bool} {e : Entry V}
  {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) : KeyOk same e r (ps ++ [Pkt.view r])
theorem

Cairn.Optimistic.KeyOk.deliver

provedlean/Cairn/Optimistic/Server.lean:538
deliver {V : Type} [DecidableEq V] {same : V → V → Bool}
  (hs : Same same) {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps)
  {p : Pkt V} (hp : p ∈ ps) {ev : Ev V} (hev : p.heard = some ev) :
  KeyOk same (Entry.step same e ev).fst r (after same e (ps.erase p) ev)
theorem

Cairn.Optimistic.KeyOk.lose

provedlean/Cairn/Optimistic/Server.lean:619
lose {V : Type} [DecidableEq V] {same : V → V → Bool}
  (_hs : Same same) {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps)
  {p : Pkt V} (hp : p ∈ ps) {ev : Ev V} (hev : p.missed = some ev) :
  KeyOk same (Entry.step same e ev).fst r (after same e (ps.erase p) ev)
theorem

Cairn.Optimistic.KeyOk.drop

provedlean/Cairn/Optimistic/Server.lean:644
drop {V : Type} [DecidableEq V] {same : V → V → Bool} {e : Entry V}
  {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {v : V} :
  KeyOk same e r (ps.erase (Pkt.view v))
theorem

Cairn.Optimistic.KeyOk.write_phase

provedlean/Cairn/Optimistic/Server.lean:649
write_phase {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {n : Nat} {v : V}
  (hp : Pkt.write n v ∈ ps) :
  n = e.seq ∧ e.phase = Phase.writing v ∧ r = e.server ∧ e.written = true

The current write's phase: writing v, the server's value the confirmed one.

theorem

Cairn.Optimistic.KeyOk.swapWrite

provedlean/Cairn/Optimistic/Server.lean:668
swapWrite {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {n : Nat} {v : V}
  (hp : Pkt.write n v ∈ ps) {q : Pkt V} {r' : V}
  (hq : q = Pkt.acked n ∧ r' = v ∨ q = Pkt.refused n ∧ r' = r) :
  KeyOk same e r' (ps.erase (Pkt.write n v) ++ [q])
theorem

Cairn.Optimistic.KeyOk.serveWrite

provedlean/Cairn/Optimistic/Server.lean:690
serveWrite {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {n : Nat} {v : V}
  (hp : Pkt.write n v ∈ ps) : KeyOk same e v (ps.erase (Pkt.write n v) ++ [Pkt.acked n])
theorem

Cairn.Optimistic.KeyOk.swapRead

provedlean/Cairn/Optimistic/Server.lean:694
swapRead {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {n : Nat}
  (hp : Pkt.read n ∈ ps) {q : Pkt V} (hq : q = Pkt.answer n r ∨ q = Pkt.failed n) :
  KeyOk same e r (ps.erase (Pkt.read n) ++ [q])
theorem

Cairn.Optimistic.KeyOk.serveRead

provedlean/Cairn/Optimistic/Server.lean:747
serveRead {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {n : Nat}
  (hp : Pkt.read n ∈ ps) : KeyOk same e r (ps.erase (Pkt.read n) ++ [Pkt.answer n r])
theorem

Cairn.Optimistic.KeyOk.refuseWrite

provedlean/Cairn/Optimistic/Server.lean:751
refuseWrite {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {n : Nat} {v : V}
  (hp : Pkt.write n v ∈ ps) : KeyOk same e r (ps.erase (Pkt.write n v) ++ [Pkt.refused n])
theorem

Cairn.Optimistic.KeyOk.refuseRead

provedlean/Cairn/Optimistic/Server.lean:755
refuseRead {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) {n : Nat}
  (hp : Pkt.read n ∈ ps) : KeyOk same e r (ps.erase (Pkt.read n) ++ [Pkt.failed n])
theorem

Cairn.Optimistic.KeyOk.converges

provedlean/Cairn/Optimistic/Server.lean:760
converges {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps)
  (hi : e.phase.isIdle = true) : same e.want r = true

A settled key shows the server's value.

theorem

Cairn.Optimistic.KeyOk.oneWrite

provedlean/Cairn/Optimistic/Server.lean:769
oneWrite {V : Type} [DecidableEq V] {same : V → V → Bool}
  {e : Entry V} {r : V} {ps : List (Pkt V)} (h : KeyOk same e r ps) :
  List.countP Pkt.isWrite ps ≤ 1

At most one write in flight.

theorem

Cairn.Optimistic.World.at_append

provedlean/Cairn/Optimistic/Server.lean:784
at_append {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (a b : List (K × Pkt V)) (k : K) :
  «at» (a ++ b) k = «at» a k ++ «at» b k
theorem

Cairn.Optimistic.World.at_single

provedlean/Cairn/Optimistic/Server.lean:787
at_single {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (j : K) (p : Pkt V) (k : K) :
  «at» [(j, p)] k = if j = k then [p] else []
theorem

Cairn.Optimistic.World.at_erase

provedlean/Cairn/Optimistic/Server.lean:790
at_erase {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (net : List (K × Pkt V)) (j : K) (p : Pkt V) (k : K) :
  «at» (net.erase (j, p)) k = if j = k then («at» net k).erase p else «at» net k
theorem

Cairn.Optimistic.World.mem_at

provedlean/Cairn/Optimistic/Server.lean:810
mem_at {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {net : List (K × Pkt V)} {j : K} {p : Pkt V}
  (h : (j, p) ∈ net) : p ∈ «at» net j
theorem

Cairn.Optimistic.World.at_out

provedlean/Cairn/Optimistic/Server.lean:814
at_out {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (os : List (Act V)) (j k : K) :
  «at» (List.filterMap pktOf (List.map (Act.out j) os)) k =
    if j = k then List.filterMap Pkt.ofAct os else []
theorem

Cairn.Optimistic.World.count_writeOf

provedlean/Cairn/Optimistic/Server.lean:824
count_writeOf {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (os : List (Out K V)) (k : K) :
  List.count k (List.filterMap writeOf os) = Table.writesFor k os
theorem

Cairn.Optimistic.World.reg_feed

provedlean/Cairn/Optimistic/Server.lean:833
reg_feed {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (w : World K V) (i : Input K V) (k : K) :
  (w.feed i).reg k = w.reg k
theorem

Cairn.Optimistic.World.get_feed

provedlean/Cairn/Optimistic/Server.lean:835
get_feed {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (w : World K V) (i : Input K V) (k : K) :
  (w.feed i).table.get k =
    if i.key = k then (Entry.step w.table.same (w.table.get i.key) i.ev).fst
    else w.table.get k
theorem

Cairn.Optimistic.World.at_feed

provedlean/Cairn/Optimistic/Server.lean:840
at_feed {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (w : World K V) (i : Input K V) (k : K) :
  «at» (w.feed i).net k =
    if i.key = k then KeyOk.after w.table.same (w.table.get k) («at» w.net k) i.ev
    else «at» w.net k
theorem

Cairn.Optimistic.World.ok_feed

provedlean/Cairn/Optimistic/Server.lean:851
ok_feed {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (w : World K V) (i : Input K V) (hs : Same w.table.same)
  (hk : ∀ (k : K), i.key ≠ k → KeyOk w.table.same (w.table.get k) (w.reg k) («at» w.net k))
  (hi :
    KeyOk w.table.same (Entry.step w.table.same (w.table.get i.key) i.ev).fst (w.reg i.key)
      (KeyOk.after w.table.same (w.table.get i.key) («at» w.net i.key) i.ev))
  (sets : List K)
  (hsets : ∀ (k : K), List.count k sets = List.count k w.sets + Table.setsFor k [i])
  (hb :
    ∀ (k : K),
      Entry.Budget w.table.same (w.table.get k) (List.count k w.sets)
        (List.count k w.writes)) :
  (have __src := w.feed i;
    { table := __src.table, srv := __src.srv, net := __src.net, sets := sets,
      writes := __src.writes }).Ok

The table hears i in a world whose other keys are fine and whose key i.key is fine after it: then every key is. Budget: s more sets of i.key (1 for a set).

theorem

Cairn.Optimistic.World.Ok.start

provedlean/Cairn/Optimistic/Server.lean:875
start {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] (dflt : V) (same : V → V → Bool) (hs : Same same) :
  (World.start dflt same).Ok
theorem

Cairn.Optimistic.World.Ok.sets_single

provedlean/Cairn/Optimistic/Server.lean:888
sets_single {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (w : World K V) (j : K) (f : V → V)
  (k : K) :
  List.count k (w.sets ++ [j]) = List.count k w.sets + Table.setsFor k [Input.set j f]
theorem

Cairn.Optimistic.World.Ok.sets_other

provedlean/Cairn/Optimistic/Server.lean:894
sets_other {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (w : World K V) (i : Input K V)
  (hi : ∀ (j : K) (f : V → V), i ≠ Input.set j f) (k : K) :
  List.count k w.sets = List.count k w.sets + Table.setsFor k [i]
theorem

Cairn.Optimistic.World.Ok.press

provedlean/Cairn/Optimistic/Server.lean:898
press {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) (f : V → V) :
  (w.press k f).Ok
theorem

Cairn.Optimistic.World.Ok.retry

provedlean/Cairn/Optimistic/Server.lean:902
retry {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) : (w.retry k).Ok
theorem

Cairn.Optimistic.World.Ok.reg_insert

provedlean/Cairn/Optimistic/Server.lean:907
reg_insert {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (m : Std.TreeMap K V compare)
  (k j : K) (v d : V) : (m.insert k v)[j]?.getD d = if k = j then v else m[j]?.getD d
theorem

Cairn.Optimistic.World.Ok.local_

provedlean/Cairn/Optimistic/Server.lean:916
local_ {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w w' : World K V} (h : w.Ok) (ht : w'.table = w.table)
  (hs : w'.sets = w.sets) (hw : w'.writes = w.writes) (k : K)
  (hk : KeyOk w.table.same (w.table.get k) (w'.reg k) («at» w'.net k))
  (ho : ∀ (j : K), k ≠ j → w'.reg j = w.reg j ∧ «at» w'.net j = «at» w.net j) : w'.Ok

A step that changes only the server and the network, at key k.

theorem

Cairn.Optimistic.World.Ok.look

provedlean/Cairn/Optimistic/Server.lean:926
look {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) : (w.look k).Ok
theorem

Cairn.Optimistic.World.Ok.serve

provedlean/Cairn/Optimistic/Server.lean:934
serve {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) (p : Pkt V) :
  (w.serve k p).Ok
theorem

Cairn.Optimistic.World.Ok.refuse

provedlean/Cairn/Optimistic/Server.lean:957
refuse {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) (p : Pkt V) :
  (w.refuse k p).Ok
theorem

Cairn.Optimistic.World.Ok.heard_key

provedlean/Cairn/Optimistic/Server.lean:976
heard_key {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (k : K) (p : Pkt V) (i : Input K V)
  (hi : heard k p = some i) : i.key = k ∧ p.heard = some i.ev
theorem

Cairn.Optimistic.World.Ok.missed_key

provedlean/Cairn/Optimistic/Server.lean:981
missed_key {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (k : K) (p : Pkt V) (i : Input K V)
  (hi : missed k p = some i) : i.key = k ∧ p.missed = some i.ev
theorem

Cairn.Optimistic.World.Ok.heard_set

provedlean/Cairn/Optimistic/Server.lean:986
heard_set {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (k : K) (p : Pkt V) (i : Input K V)
  (hi : heard k p = some i) (j : K) (f : V → V) : i ≠ Input.set j f
theorem

Cairn.Optimistic.World.Ok.missed_set

provedlean/Cairn/Optimistic/Server.lean:990
missed_set {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] (k : K) (p : Pkt V) (i : Input K V)
  (hi : missed k p = some i) (j : K) (f : V → V) : i ≠ Input.set j f
theorem

Cairn.Optimistic.World.Ok.erase_feed

provedlean/Cairn/Optimistic/Server.lean:995
erase_feed {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K)
  (p : Pkt V) (i : Input K V) (hk : i.key = k)
  (hset : ∀ (j : K) (f : V → V), i ≠ Input.set j f)
  (hi :
    KeyOk w.table.same (Entry.step w.table.same (w.table.get k) i.ev).fst (w.reg k)
      (KeyOk.after w.table.same (w.table.get k) ((«at» w.net k).erase p) i.ev)) :
  ({ table := w.table, srv := w.srv, net := w.net.erase (k, p), sets := w.sets,
          writes := w.writes }.feed
      i).Ok

The packet (k, p) leaves the network and the table hears i about k.

theorem

Cairn.Optimistic.World.Ok.deliver

provedlean/Cairn/Optimistic/Server.lean:1011
deliver {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) (p : Pkt V) :
  (w.deliver k p).Ok
theorem

Cairn.Optimistic.World.Ok.lose

provedlean/Cairn/Optimistic/Server.lean:1023
lose {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) (p : Pkt V) :
  (w.lose k p).Ok
theorem

Cairn.Optimistic.World.Ok.step

provedlean/Cairn/Optimistic/Server.lean:1043
step {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w w' : World K V} (h : w.Ok) (hs : w.Step w') : w'.Ok

Every step keeps Ok.

theorem

Cairn.Optimistic.World.Ok.converges

provedlean/Cairn/Optimistic/Server.lean:1055
converges {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K)
  (hk : w.table.settled k = true) : w.table.same (w.table.shown k) (w.reg k) = true

Convergence. In a world reached by any steps, in any order, every settled key (nothing in flight, nothing in doubt) shows what the server holds.

theorem

Cairn.Optimistic.World.Ok.oneWrite

provedlean/Cairn/Optimistic/Server.lean:1061
oneWrite {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) :
  List.countP Pkt.isWrite («at» w.net k) ≤ 1

One write in flight per key: at most one write about k in the network, before or after the server handled it.

theorem

Cairn.Optimistic.World.Ok.writes_le_sets

provedlean/Cairn/Optimistic/Server.lean:1066
writes_le_sets {K V : Type} [Ord K] [Std.TransOrd K]
  [Std.LawfulEqOrd K] [DecidableEq K] [DecidableEq V] {w : World K V} (h : w.Ok) (k : K) :
  List.count k w.writes ≤ List.count k w.sets

Never more writes than sets.

theorem

Cairn.Optimistic.World.Ok.count

provedlean/Cairn/Optimistic/Server.lean:1072
count {K : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] {w : World K Bool} (h : w.Ok) (hsame : w.table.same = fun a b => a == b)
  (k : K) (hk : w.table.settled k = true) (o : Nat) (v : Bool) :
  Optimistic.count (o + ind v) v (w.table.shown k) = o + ind (w.reg k)

Counts. For a boolean key with the view's count o + [v] (others o, the person's own v), a settled key shows o + [what the server holds]; exactly the server's count when no one else acted since the view.

theorem

Cairn.Optimistic.World.Ok.reach

provedlean/Cairn/Optimistic/Server.lean:1083
reach {K V : Type} [Ord K] [Std.TransOrd K] [Std.LawfulEqOrd K]
  [DecidableEq K] [DecidableEq V] {w w' : World K V} (h : w.Ok) (hr : w.Reach w') : w'.Ok

Any run of steps from the start keeps Ok.

theorem

Cairn.Optimistic.World.press_same

provedlean/Cairn/Optimistic/Server.lean:1095
press_same {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (f : V → V) : (w.press k f).table.same = w.table.same
theorem

Cairn.Optimistic.World.retry_same

provedlean/Cairn/Optimistic/Server.lean:1096
retry_same {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) : (w.retry k).table.same = w.table.same
theorem

Cairn.Optimistic.World.look_same

provedlean/Cairn/Optimistic/Server.lean:1097
look_same {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) : (w.look k).table.same = w.table.same
theorem

Cairn.Optimistic.World.serve_same

provedlean/Cairn/Optimistic/Server.lean:1098
serve_same {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : (w.serve k p).table.same = w.table.same
theorem

Cairn.Optimistic.World.refuse_same

provedlean/Cairn/Optimistic/Server.lean:1102
refuse_same {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : (w.refuse k p).table.same = w.table.same
theorem

Cairn.Optimistic.World.deliver_same

provedlean/Cairn/Optimistic/Server.lean:1106
deliver_same {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : (w.deliver k p).table.same = w.table.same
theorem

Cairn.Optimistic.World.lose_same

provedlean/Cairn/Optimistic/Server.lean:1110
lose_same {K V : Type} [Ord K] [DecidableEq K] [DecidableEq V]
  (w : World K V) (k : K) (p : Pkt V) : (w.lose k p).table.same = w.table.same

Instances 2

instance

Cairn.Optimistic.instDecidableEqPkt

lean/Cairn/Optimistic/Server.lean:59
instDecidableEqPkt {V✝ : Type} [DecidableEq V✝] : DecidableEq (Pkt V✝)
instance

Cairn.Optimistic.instReprPkt

lean/Cairn/Optimistic/Server.lean:59
instReprPkt {V✝ : Type} [Repr V✝] : Repr (Pkt V✝)