テストステ論

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

(writeboost report) リードキャッシュの欠陥

昨日, デバイスをtmpfs backedにしたらテストが再現するようになったという話をした.

(writeboost report) ベンジャミンはすごいやつだ - テストステ論

試行錯誤をして原因を絞り込んでいくと, endioの中でbioにペイロードが入ってないことが原因とわかった. ここに4KBデータが入ってると思ってステージングしてしまうから, junk dataがキャッシュされるということだった. (これだけでは説明が出来ない現象もあるが, junk dataが乗る件はこれで説明出来る)

以下のようにプリント文をいれてやると, tmpfs backedを使う時はbi_size=0となるが, その他の場合はしっかり4K入ってることがわかる.

-       if (!cell->cancelled)
+       if (!cell->cancelled) {
+               if (bi_size(bio) != (1 << 12))
+                       DMINFO("error: sector=%d, cell_idx=%d, bi_size=%d", cell->sector, pbd->cell_idx, bi_size(bio));
                copy_bio_payload(cell->data, bio);
+       }

この修正をしたブランチをベンジャミンに試してもらうと, 彼の環境でも0バイトになってるケースがあるという.

endioの中では当然bioのペイロードは充填されてると思っていたが, 何かが原因でそうならないケースがあるということが分かった.

本質的にどこに問題があるかはすぐにはわからないので, まずは, bi_sizeが4KBじゃなかったらcancelしてしまうという修正で為してしまうつもりだ. 今のところ, リードキャッシュのコードを全部パージするだけの理由がない.

おそらく, DMの原理自体に依存するか, あるいは実装が甘いが故にこうなっているのか. これについてはのちのちdm-develに投げるつもりだ.

あるいは超絶的な勘だが, 本来bi_size=0となるところが, backing storeにlinear targetを被せるとデータが充填されるという話かも知れない. 例えば, この問題が, clone_endioの時点ではペイロードを保証しないというものであった場合, linear targetを被せることで, linear targetから抜けてくるときにペイロードを保証出来る可能性がある. clone bioは制限付きな軽量なコピーであるから, endioで何からの性質が欠けるということは十分に考えられる.

いずれにしろ, パーフェクトでない時点で欠陥商品だ. 自分の能力に失望した.