テストステ論

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

(writeboost report) 2.1.3に向けた改善案

Don't partially write back · Issue #69 · akiradeveloper/dm-writeboost · GitHub

ライトブーストは, ライトをログにしてSSDに書き込んでいく. 従って, LOG_ID=kの中にあるデータは, LOG_ID=k+1にあるデータより古いことが保証されている. 従って, 最初のHDDの状態を初期値として副作用LOG_ID=0..kをfoldしていけば, スナップショットのようにデータを復元出来る. (もちろん大抵はLOG_ID=0のデータなんかrotateしてしまってもうないけど, どこかに保存しておけば可能) ... 性質A

これがログ構造化キャッシングの美しい性質なのだけど, 実は,

  • 実装が少しややこしい
  • そこまでする必要があるか分からない (これがなくても十分に良い)
  • 実装が可搬性のあるものになるか分からない
  • これをやると, ライトのバイパスが不可能になる

などの理由で獲得してなかった性質として, 「SSDが突然ぶっ壊れた時にHDDだけで動作させると, 今までHDDに適用された副作用が性質Aを保つ」という性質がある (性質B). つまり, HDDの状態が常にスナップショット状態になる.

この性質を獲得すると, それが許されるかどうかは別にして, 万が一SSDがぶっ壊れた時にも, ブロックデバイス的にはちょっと古い状態に戻るだけという言い方が出来る. もちろんそれがファイルシステムを一時的には破壊するかも知れないけど, 修復出来る可能性はある.

なぜこの性質を獲得出来ていないかは, 4KB未満のライトが存在するからである. 今SSDに書かれているものがパーシャルであったり, 今から書くデータがパーシャルだったりして, SSD上のデータにヒットしてしまった場合, 「前のやつを無効化する」ことが必要になるのだけど, こういう特殊なケースだとデータを合成する必要が出てくる.

どの道ほとんどのライトは4KBであることが想定なので, 今は安全に「そういう場合は古いデータを完全にライトバックしてしまう」ということにしている. だから, backgroundライトバックされていない新しめのログのデータがライトバックされてしまうケースがあり, 性質Bが保てなくなる.

2.1.2までにライトブーストは結構改善したと思っていて, あとは受動的バグフィックスくらいでいいかなと思ってたんだけど, 今コードを見てたら, 行けるんじゃないか的全能感が満ちてきた. ライトのバイパスはもうやらないつもりなので, アカストも落ち着いたことだし, 気分次第ではやると思う.