Argosy: Verifying layered storage systems with recovery refinement
Tej Chajed, Joseph Tassarotti, Frans Kaashoek, Nickolai Zeldovich MIT
Argosy: Verifying layered storage systems with recovery refinement - - PowerPoint PPT Presentation
Argosy: Verifying layered storage systems with recovery refinement Tej Chajed , Joseph Tassarotti, Frans Kaashoek, Nickolai Zeldovich MIT logical disk disk 1 disk 2 Bob writes a replication system 2 logical disk write 1 write 2 disk 1 disk
Tej Chajed, Joseph Tassarotti, Frans Kaashoek, Nickolai Zeldovich MIT
2
disk1 disk2 logical disk Bob writes a replication system
2
disk1 disk2 write1 logical disk write2 Bob writes a replication system
3
disk1 disk2 write1 logical disk Bob writes a replication system
3
disk1 disk2 write1 logical disk
?
Bob writes a replication system
3
disk1 disk2 write1
rep_recover
logical disk
?
and implements its recovery procedure Bob writes a replication system
3
disk1 disk2 write1
rep_recover
logical disk
?
recovery restores invariants and implements its recovery procedure Bob writes a replication system
4
replication
read write rep_recover
read and write are atomic if you run rep_recover after every crash
Disk interface Two-disk interface Bob is careful and writes a machine-checked proof of correctness
Transactions
5
write-ahead logging
log_recover
…
Disk interface
Transactions
5
write-ahead logging
log_recover
…
log_recover after every crash
Disk interface
6
write-ahead log replication logging + replication
Transactions Disk interface Two-disk interface
?
6
write-ahead log replication logging + replication
Transactions Disk interface Two-disk interface
rep_recover ; log_recover
?
7
rep_recover ; log_recover
?
log_recover
under crashes
rep_recover
under crashes
how do we prove correctness under crashes using the existing proofs?
8
CHL [SOSP ’15] not modular Yggdrasil [OSDI ’16] single recovery Flashix [SCP ’16] restricted recovery procedures
write-ahead log replication
9
developer proves developer proves
write-ahead log replication
Transactions Disk interface Two-disk interface
9
logging + replication
Argosy proves
write-ahead log replication
Transactions Disk interface Two-disk interface
10
Recovery refinement for modular proofs
10
see paper see paper
Recovery refinement for modular proofs CHL for proving recovery refinement Verified example: logging + replication
10
see paper see paper see code
Recovery refinement for modular proofs CHL for proving recovery refinement Verified example: logging + replication Machine-checked proofs in Coq
11
replication
Disk interface Two-disk interface
using refinement
using recovery refinement
12
Background
Background
13
Disk interface Two-disk interface
replication
Background
13
Disk interface Two-disk interface
replication write write1 write2 write_impl
Background
13
Disk interface Two-disk interface
replication write write1 write2 write_impl
Background
13
Disk interface
read
Two-disk interface
replication write write1 write2 write_impl read_impl read1 read2
Background
13
Disk interface
read
Two-disk interface
replication write write1 write2 write_impl read_impl read1 read2 code code_impl write write_impl read read_impl
correctness is based on how we use replication : run code using Disk interface on top of two disks
Background
14
replication
Disk interface Two-disk interface
code code_impl
⊇
spec’s behaviors running code’s behaviors
Background
15
disk1 disk2 logical disk
R
1. developer provides abstraction relation R spec state
Background
15
disk1 disk2 logical disk
R
write1 write2
1. developer provides abstraction relation R spec state
Background
15
disk1 disk2 logical disk
R
write1 write2 write
1. developer provides abstraction relation R
spec state
Background
15
disk1 disk2 logical disk
R
write1 write2 write
R
1. developer provides abstraction relation R
spec state
16
17
Disk interface
read
Two-disk interface replication
write write1 write2 write_impl read_impl read1 read2
17
Disk interface
read
Two-disk interface replication
write write1 write2 write_impl rep_recover read_impl read1 read2
17
Disk interface
read
Two-disk interface replication
write write1 write2 write_impl rep_recover read_impl read1 read2
18
replication
Disk interface Two-disk interface
code code_impl
⊇ ⊇
specification for crash behavior crash & recovery behavior
18
replication
Disk interface Two-disk interface
code code_impl
⊇ ⊇
specification for crash behavior crash & recovery behavior ? crash semantics
recover
? recovery semantics
19
replication
Disk interface Two-disk interface
code code_impl
⊇
…
|
|
|
:=
code
⊇
crash & recovery behavior
recover
? recovery semantics
19
replication
Disk interface Two-disk interface
code code_impl
⊇
…
|
|
|
:=
code
⊇
crash & recovery behavior
recover
? recovery semantics
20
replication
Disk interface Two-disk interface
code code_impl
⊇ ⊇
code recover code_impl
21
replication
Disk interface Two-disk interface
code code_impl
⊇ ⊇
code recover code_impl
zero-or-more iterations
recover ⋆
21
replication
Disk interface Two-disk interface
code code_impl
⊇ ⊇
code recover code_impl recover ⋆
22
replication
Disk interface Two-disk interface
code code_impl
⊇ ⊇
code recover code_impl recover ⋆
23
recover
recover
⋆
23
recover
recover
⋆
crash must occur during some operation
23
recover
recover
⋆
23
recover
recover
⋆
R R
23
recover
recover
⋆ R
23
recover
recover
⋆ R
| R
24
R
R
non-crash execution crash and recovery execution
R
recover
recover
⋆
|
R
Recovery refinement
24
R
R
non-crash execution crash and recovery execution
R
recover
recover
⋆
|
R
Recovery refinement
implies
Trace inclusion
specification behavior
⊇
running code behavior
25
26
|
r
⋆
expression
26
|
r
⋆ …
r r r
expression matching transitions
27
write-ahead log
log_recover …
replication
rep_recover …
If
Transactions Two-disk interface Disk interface
27
write-ahead log
log_recover …
replication
rep_recover …
then If
logging + replication
… rep_recover; log_recover
Transactions Two-disk interface Transactions Two-disk interface Disk interface
28
rep_recover ; log_recover
?
log_recover
under crashes
rep_recover
under crashes
29
under crashes
log rep
under crashes
rep log
;
?
rep_recover log_recover
30
log log
⋆
rep rep
⋆
30
log log
⋆
rep rep
⋆
rep log rep
|
rep log
⋆
30
log log
⋆
rep rep
⋆
rep log rep
|
rep log
⋆ how to re-use recovery proofs here?
31
rep log rep
|
rep log
⋆
31
rep log rep
|
rep log
⋆
after de-nesting (p ∣ q)⋆ = p⋆(qp⋆)⋆
31
rep log rep
|
rep log
⋆
rep rep log rep
rep log
⋆
=
⋆ ⋆ after de-nesting (p ∣ q)⋆ = p⋆(qp⋆)⋆
31
rep log rep
|
rep log
⋆
rep rep log rep
rep log
⋆
=
⋆ ⋆ after de-nesting (p ∣ q)⋆ = p⋆(qp⋆)⋆
rep rep log rep (
rep log
⋆
⋆
⋆
=
(pq)⋆p = p(qp)⋆
after sliding
32
rep rep log rep (
rep log
⋆
⋆
⋆
replication proof
32
rep rep log rep (
rep log
⋆
⋆
⋆
rep invariants restored
replication proof
32
rep rep log rep (
rep log
⋆
⋆
⋆
rep invariants restored
log
behaves like
write-ahead log proof replication proof
32
rep rep log rep (
rep log
⋆
⋆
⋆
rep invariants restored
log
behaves like
log log
⋆ log invariants restored
33
github.com/mit-pdos/argosy
3,200 lines for framework 4,000 lines for verified example (logging + replication) Example extracts to Haskell and runs
34
34
rep rep
|
( )⋆
log
Kleene algebra
34
r impl r
⋆
|
recovery refinement
rep rep
|
( )⋆
log
Kleene algebra
34
r impl r
⋆
|
recovery refinement modular proofs
rep rep
|
( )⋆
log
Kleene algebra
34
r impl r
⋆
|
recovery refinement modular proofs
rep rep
|
( )⋆
log
Kleene algebra
come find us after! Tej and Joe