テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(writeboost report) ライトバックの安全性

ライトブーストは, RAMバッファ - SSD - HDDと副作用を運ぶ.

加えて, RAMバッファ上のデータ並び順は, ack順そのものである. この性質は, 単にブロックデバイスとして成り立つだけであれば必要ないと思うが, こういう順序性の保存をライトブーストにオフロードするユースケースを考えると, 価値のある性質である.

ライトブーストのライトバックについて述べる. ライトバックでは,

  1. いくつのセグメントをライトバックするか決める.
  2. writeback_segに全セグメントのデータを読み込む.
struct writeback_segment {
    struct segment_header *seg; /* Segment to write back */
    struct writeback_io *ios;
    void *buf; /* Sequentially read */
};
  1. writeback_ioをセグメントIDとライトバック先sectorのペアで昇順にソートして, ライトバックする.
struct writeback_io {
    struct rb_node rb_node;

    sector_t sector; /* Key */
    u64 id; /* Key */

    void *data;
    u8 memorized_dirtiness;
};

ここで一つの疑問が生まれる. ライトバックでは, ID=aのデータがID=b(<a)のデータより先にライトバックされることがある. これは, ID=bのデータは残らず, ID=aのデータだけ残り, せっかく保存した順序が台無しになってしまうのではないか?

答えは, backing deviceが不死身と仮定出来るならば, Noである. 今, ライトブーストはキャッシュであり, backing deviceの信頼性については何の向上も出来ないから, backing deviceは不死身を仮定して設計して良い. ライトブーストがロジックとして担保すべきは, cache deviceの故障のみである.

2でライトバック対象の全セグメントを読み込むのは意味がある. これらはアトミックに扱われる. つまり, 全部が成功しなければすべてが失敗したものとみなす. もう一つの意味は, SSDの故障に対する耐性である. ライトバックは, 全セグメントが始まるまで決して始まらない. そして, もしいずれかの読み込みが失敗した場合, SSDが故障したものとみなして, backing deviceへの副作用適用を停止する. これによって, SSDの故障とHDDへの副作用が同期することとなる. 私が, ライトブーストにライトスルーモードを決して追加しないのは, 副作用は必ずSSDを通るという性質自体が, 障害耐性を担保しているからである.

結果として, cache device上に並べられたデータはack順であるし, backing device上にライトバックされたデータは, もっとも古いデータ(t=t_a)ともっとも新しいデータ(t=t_b)をとった時, t_a <= t <= t_bの時間をもついかなるデータのロストもあり得ないということになる. 一言でいうと, 無駄に書くくらいならば捨てて上を守るという割り切りがこの堅牢さを実現している.