テストステ論

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

(writeboost report) 2.2.1をリリースしました

2.2.0のリリースが5/1だったので, 2月半ぶりのリリースということになります.

今回は重要なバグフィックスがいくつか入っています. いくつかピックアップして紹介します.

handling discard requests · Issue #110 · akiradeveloper/dm-writeboost · GitHub

thepax氏に, TRIMの戦略が誤ってるということを指摘されました. REQ_DISCARDをゼロデータ書き込みに変換することでZRATをemulateする策はありましたがコストが高すぎるため, 結局, TRIMはサポートしないことにしました.

read should be failed when merging is needed and reading from caching device failed · Issue #116 · akiradeveloper/dm-writeboost · GitHub

SSDにパーシャルデータがキャッシュされている時にそれを含んだリードをすると, HDDとSSDの両方から読み, それをbioのペイロード上でマージしてackするという処理にするのですが, SSDからの読み込みが失敗した場合にエラーとなってませんでした.

新しく実装したテストスイート(https://github.com/akiradeveloper/writeboost-test-suite)では, このようなケースを狙いうちしたテストを容易に書くことが出来, dm-flakeyを使ってディスクが障害を起こしているケースをemulateすることも書けるのですが,

[dm-devel] dm-flakey NOT to return -EIO on READ?

で指摘したように, dm-flakeyのread時の挙動が間違っていて, 現在のところいくつかのテストがignoreされています. dm-flakeyが治り次第, 障害注入したテストを追加していく予定です. (もしupstreamの対応が遅いならば, 独自に作ろうと思っています. 大した手間ではないため)

prepare_overwrite: don't retry but return error · akiradeveloper/dm-writeboost@3ebe7eb · GitHub

同じような問題ですが, SSDにパーシャルデータがキャッシュされている時に, それを上書きするようなライトをすると(もちろんログ構造化なので実際には上書きはしないです), SSDからデータを読み, 今持っているbioペイロードにマージするという処理をするのですが, この時, SSDからのデータ読み込みが失敗した場合, 成功するまでリトライするという実装になっていました. 2.2.0で, foregroundでの処理ではretryしないようにするという改革を行ったのですが, この時に, このパスだけは(ライトで副作用があるため)無理と諦めていたのですが, よく考えたらそこまで汚くならずに出来ると分かったのでやっていきました.

2.2.0: corruption with cryptdisk on top of writeboost · Issue #111 · akiradeveloper/dm-writeboost · GitHub

ドミトリが指摘しているこの問題については, 未解決となりました. ただし, read-cachingをenableした場合にのみ発現するということなので優先度は高くないです. また, cryptを使わない場合だと問題が出ないということなので, 何か組み合わせに問題があるだけかもしれません. 2.2.1で奇跡的に直ることを祈るしかありません. ドミトリにはスクリプトでリプロデューサを作ることをお願いしており, これが手に入れば直せると思います.

他, いくつかの最適化アイデアも先送りとなりました. 修正メインのリリースでデグレしたら話にならないため.

今回のリリースでは, テストスイートの実装を行ったため, 作業量は多かったです. なので, とても疲れました.

ドミトリはローカルで問題探しをしてくれているようですし, どこかでライトブーストのことを知って, starしてくれたりコメントをくれる人も時々います. Cephなどの分散ファイルシステムで話題になって知ったとか, flashcacheのalternativeとしてたどり着いたというケースが多いようです. 注目してくれる人がいる限りは, 続けていきたいと思います.