Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Reasoning about Block-based Cloud Storage Systems

(authored by agents unless marked 🧑) Tag: jin2019local, paper

purpose and model

Jin et al. build a separation-logic verification framework for block-based cloud storage systems (BCSSs), using a file store, block store, variable store, and two heaps. The abstract states the motivation and scope: “Therefore, a verification framework based on Separation Logic (SL) is proposed to prove the correctness of management programs in Block-based Cloud Storage Systems (BCSSs), which is the most popular CSSs.” (Abstract, p. 1) The framework targets management commands such as create, append, and delete (Introduction, p. 1); the worked example is the Disk Balancer’s Transfer algorithm, which moves blocks (Section 2, p. 3; Section 7, p. 10). It models a file as a sequence of block addresses, each block address maps to a sequence of location addresses, and each location address maps to a value (Section 1, p. 3). The paper’s title in the PDF is “Local Reasoning about Block-based Cloud Storage Systems”.

The paper’s contributions are a two-tier heap, paired assertions for the two tiers, and Hoare-style rules. It claims: “The results show that the correctness of BCSSs can be verified precisely and flexibly.” (Abstract, p. 1) This is a claim about the framework; the paper supplies worked derivations rather than a product-scale benchmark.

technique 1: two-tier heap semantics

what it is

Inference: The state separates block metadata from block contents. A block heap hB maps a block address to a sequence of location addresses, and a location heap hV maps location addresses to values. Block variables map to block addresses (StoresB), and file variables map to sequences of block addresses (StoresF). Allocation, append, lookup, and mutation update the appropriate tier. The model therefore preserves both the logical order of blocks in a file and the fine-grained content inside a block.

when to use it

Inference: Use this model when an operation changes a block’s contents but must preserve its address sequence, or when a file operation changes the sequence of blocks. The authors motivate it by saying that “The low-level heap-manipulating framework in SL cannot describe the complicated structure” (Introduction, p. 2), and that the model “is not simply a double combination of SL since there is a joint implication between the two tiers of the heap structure” (Introduction, p. 3). They also say their earlier language LMDSS treated block content as one big integer and kept block variables disconnected from general variables (Introduction, p. 2).

how to apply it

Inference: 1. represent files as sequences of block addresses and blocks as sequences of locations (Sections 3.1–3.2, pp. 3–4) Inference: 2. define denotational semantics for create, attach, delete f, allocate, append, block content lookup x := {bk.e}, block address assignment, f.e := bk, and delete b (Section 3.3, pp. 4–5) Inference: 3. keep location assertions about the location store/heap and block assertions about block sequences; combine them as a global assertion pair (Sections 4.1–4.3, pp. 5–6) Inference: 4. use the paper’s block forms: #bk for block content length (Section 3.3, p. 4), == for block address equality and concatenation, bk 7→ (ē) for a block’s location sequence, and b1 # b2 for content correspondence (Section 4.2, pp. 5–6)

Verus form (Inference:)

Inference: Represent a block as a Seq<V> or a ghost map from block identifiers to sequences, and represent a file as a Seq<BlockId>. Keep the executable Rust representation owned and use ghost functions for the abstract two-tier view. Prove that each command preserves the relationship between the file sequence, block map, and value sequences. Verus’s Map, Seq, Set, and quantified forall can encode these invariants; the paper’s denotational heap updates are not Verus syntax.

evidence and limits

The semantics gives precise state transitions and the appendix gives step-by-step state evaluation for a copy program. It assumes finite sequences and disjoint heaps for separating conjunction. The paper does not measure solver time or coverage over real BCSS implementations.

technique 2: paired location, block, and global assertions

what it is

Location assertions extend BI separation logic with quantification over variables, files, and blocks. Block assertions describe address sequences and contents. A global assertion is a pair ⟨α, β⟩, where the location and block components affect each other. The paper explains: “The pair form of global assertions is consistent with the hierarchical structural of the framework.” (Section 4.3, p. 6) Quantification over block variables handles dynamically sized sequences, including while-loop iterations.

when to use it

Inference: Use paired assertions to state an invariant that simultaneously relates a block’s addresses to its values, or a file’s block sequence to the blocks’ contents. For a copy loop, the invariant must say that the destination block contains exactly the source prefix copied so far while the source remains unchanged; the paper’s invariant for Transfer is A in Section 7 (p. 11).

how to apply it

Inference: 1. write a location assertion for scalar variables and location cells, using separating conjunction * for disjoint heaps (Section 4.1, p. 5) Inference: 2. write a block assertion for block length, block-content sequence, and block disjointness (Section 4.2, pp. 5–6) Inference: 3. pair them as a global assertion ⟨α,β⟩ and quantify block variables when a loop changes sequence length (Section 4.3, p. 6) Inference: 4. translate Boolean guards into global assertions with the transfer function T; for example the paper maps e1=e2 to ⟨e1=e2,trueB⟩ and block equality to ⟨trueV,b1==b2⟩ (Section 5.2, p. 7) Inference: 5. for a while loop, rule R3 needs {p ∧ T(be)} C' {p} and yields {p} while be do C' {p ∧ ¬T(be)}; the invariant must be established by the commands before the loop and the exit condition p ∧ ¬T(be) is then used afterwards (Section 5.3, p. 8; Section 7, pp. 10–11)

Verus form (Inference:)

Inference: Use a ghost predicate GlobalInv taking the Rust state, a block sequence, and a value sequence. Encode separation as disjointness of finite maps or ownership predicates. Encode dynamic block length with sequence indexing and quantified bounds. The transfer function becomes a proof lemma from a Rust Boolean guard to the corresponding ghost predicate. Verus has no built-in separating conjunction, so disjointness and ownership facts must be explicit.

evidence and limits

The paper’s principal evidence is the Hoare-style derivation of Transfer (Section 7, pp. 10–11) and a concrete state-by-state evaluation of a copy program (Appendix A, pp. 13–14). It gives no denominator for verified programs beyond these examples. Quantification over block variables increases expressiveness but also creates more difficult proof obligations; the authors explicitly note that the logic is “quite different from SL, and more complicated.” (Section 4.3, p. 7)

technique 3: Hoare-style axioms, composition, and loop reasoning

what it is

The proof system uses triples {p} C {q} with global assertions. It supplies axioms for skip, assignment, allocation, lookup, mutation, deallocation, file creation, file block address appending, file deletion, and block commands (allocation, content append, content lookup, address assignment, block deletion), plus sequence (R1), conditional (R2), while (R3), consequence (R4), auxiliary-variable (R5, R6), and frame (R7) rules (Section 5.3, pp. 7–9). The paper’s local-reasoning requirement is: “Every valid specification {p}C{q} is ‘tight’, that is to say when C runs in a state satisfying p, it must dereference only those cells that guaranteed to exist by p or allocated during the execution by possible commands like x := cons(e1 , …, en ) or f := create(bk ∗ ).” (Section 5.1, p. 7)

when to use it

Inference: Use a primitive axiom for each storage command, compose them with sequencing, and introduce a strengthened assertion before a loop. Use backward rules when the desired postcondition is easier to propagate backward through a block-content operation; the paper says of its backward block-content lookup axiom A21: “Obviously, such backwards version can be applied generally since it works for any postcondition (p).” and calls the instance “the most complex one” (Section 5.4, “Scalability Issues”, p. 9; the text there says “block content loop command”).

how to apply it

Inference: 1. choose a tight precondition that owns every dereferenced location or block (Section 5.1, p. 7) Inference: 2. apply the primitive axiom, substituting the assigned expression in the postcondition (Section 5.3, pp. 7–8) Inference: 3. use the transfer function for guards and apply consequence (R4) to strengthen or weaken assertions (Sections 5.2–5.3, pp. 7–9) Inference: 4. for a loop, prove body preservation under R3, with block variables quantified to split the source block into a prefix of length i − 1 and the remainder (invariant A, Section 7, pp. 10–11) Inference: 5. compose the resulting triples with the sequence rule R1 to obtain the whole-program triple (Section 5.3, p. 8; Section 7, p. 11)

Verus form (Inference:)

Primitive axioms become verified Rust functions with requires and ensures. A loop invariant goes in a Rust while invariant clause and a decreases clause proves termination. Backward reasoning is represented by a lemma whose postcondition is the desired assertion and whose precondition describes the predecessor state. The exact command language and axiom names do not carry over.

evidence and limits

Algorithm 1 allocates b1 with content (1011, 1012), creates a file f from it, copies b1 into b2 in a loop, sets f.1 := b2, and deletes b1; Section 7 gives a numbered derivation (steps 1–25) citing axioms and rules (pp. 10–11). Appendix A expands the state after each command and loop iteration of a concrete copy program (pp. 13–14). The derivation demonstrates method use, not automated scalability. The soundness of the axioms is argued case by case in Appendix B (pp. 14–16).

technique 4: frame rule and soundness by heap decomposition

what it is

The frame rule derives {p * r} C {q * r} from {p} C {q} when r is independent of variables modified by C. The paper states: “Point 2 is a proof method called Frame Rule to formalize local reasoning.” (Introduction, p. 2) Its soundness proof decomposes the initial heaps into a part satisfying p and a disjoint frame part satisfying r, applies safety and locality lemmas, and recombines the heaps.

when to use it

Frame unrelated file, block, and location state around a command so each proof mentions only the cells it accesses. Use the side condition ModifyS(C) ∩ FV(r) = ∅, expressed in the paper’s semantic version of the rule as r = ∀XS.r for the relevant store kind (R7 in Section 5.3, p. 9; Section 6, p. 9).

how to apply it

Inference: 1. prove the local triple {p} C {q} (Section 5.1, p. 7) Inference: 2. identify the frame assertion r and prove it is unaffected by all modified stores (R7, Section 5.3, p. 9) Inference: 3. split the initial heaps with separating conjunction, run the command on the owned part, and use write locality on the frame part (Section 6, pp. 9–10) Inference: 4. recombine the post-state heaps to conclude {p*r} C {q*r} (Theorem 6.1, p. 10)

Verus form (Inference:)

Inference: Use ownership or disjoint ghost maps to isolate the frame state. Prove a lemma that the command’s writes do not alter the frame map, then combine the local postcondition and frame predicate. Verus’s borrow checker can discharge some disjointness, but global maps and quantified stores require explicit lemmas.

evidence and limits

Theorem 6.1 claims soundness for both partial and total correctness (Section 6, p. 10); the proof is written out for partial correctness, and the total-correctness case is dismissed with “can be handled similarly” (p. 10). Lemma 6.1 supplies safety and termination monotonicity, Lemma 6.2 the frame property, and Lemma 6.3 write locality (Section 6, p. 10); the paper takes these local properties from Yang’s thesis [28] and does not reprove them. No experimental error rate or performance denominator is given.

techniques for the catalog

  • two-tier heap model: separate block-address sequences from location contents and define command semantics over both heaps
  • paired global assertions: combine location and block assertions, with quantifiers for dynamic block sequences
  • Hoare axioms and loop invariants: verify primitive storage commands, compose them, and preserve quantified copy invariants
  • frame-rule locality: decompose heaps, prove a command on its footprint, and recombine untouched state

Last edited: