テストステ論

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

(writeboost report) ファイル分割完了

writeboostはもともと, 3.2k LOCの巨大な1ファイルに書かれていた. こうしたのには理由がある.

  1. linenoを表示して位置を確認するデバッグが出来る (マイクからは, プロダクションコードでは消せと言われている).
  2. 文字列検索でジャンプしてファイル内を検索出来る.
  3. 1枚のファイルをdrivers/md以下に入れるのは, すっきりしている.

しかし, マイクからは以下のような注文がついている.

all the code in one file is too cumbersome; would like to see it split into multiple files.. not clear on what that split would look like yet

would like to seeというのは, 日本人にとってはいまいち分からんニュアンスだが, 「〜というのが見たい」といいつつも「〜してくれ」と言ってるに近いのだろうと考える.

保守性のこともあると思うが, コードを読みにくいということもあっただろうと思う. 複数ファイルに分割して, カプセル化すれば, コードを読む負荷はかなり下がる. あと, 変更の余地やバグの可能性がほぼないファイルについては, コードが新しくなった時にいちいち読み直さなくていいからというのもあるだろう. とにかく, 1枚のファイルにどかっと書いたままではマージされることは100%ないので, マージを目的とするならば, 複数ファイルに分割する必要がある.

というわけで, 昨晩, おおざっぱな切り分けを紙上で行って, 今日一日かけてどかっと修正した. 結果として, writeboostは以下20個くらいのファイルに分割された. 論理的に分離出来るデーモンや, デバイスからのin-coreメタデータ復活処理などは, 複雑にも関わらず明確なファサードが用意出来る形なので, 分離した. データ構造が難しかったが, どうやってもトレードオフになると思ったので, 軽快に妥協して簡明さを優先した.

---------- Summary ----------
33 Makefile
438 writeboost.h
92 bigarray.c
190 cache-alloc.c
27 cache-sync.c
30 defer-barrier.c
81 dm-writeboost.mod.c
79 flush-daemon.c
214 format-cache.c
531 handle-io.c
102 hashtable.c
346 migrate-daemon.c
35 migrate-modulator.c
163 queue-flush-job.c
46 rambuf.c
302 recover.c
112 segment.c
55 superblock-recorder.c
392 target.c
121 util.c

作業中, 関数の依存関係を手作業で調べるのはバカバカしいので自動化した. cscope -L0を使うと, シンボルについて検索結果を標準出力で受け取ることが出来る. すっきり書くことが出来た. どこに置いたら良いか判断が微妙な関数については, 工学的なアプローチで確定していくのが妥当と思ったので, この出力をみながら適当な配置場所を検討した.

IN=search-list.txt
OUT=dependency-list.txt
echo > $OUT
for l in `cat $IN`
do
    echo ---------- $l ----------- >> $OUT
    cscope -L0 $l >> $OUT
    echo >> $OUT
done

次は, preresumeだとかの実装について検討して実装するのが良いだろう.

(追記)
その後, こうなった. たぶんこうした方が標準的で, マイクに受け入れられやすいと思う. persistentなんちゃらとか, bcacheがこうなってる. この感じだと, bcacheのようなビルド形態をとることになると思う. 全然問題ない. 設計については, 提案して合意をとっていこうと思う.

---------- Summary ----------
33 Makefile
10 bigarray.h
19 cache-alloc.h
10 defer-barrier.h
8 dirty-sync.h
8 flush-daemon.h
8 format-cache.h
24 handle-io.h
15 hashtable.h
18 migrate-daemon.h
7 migrate-modulator.h
12 queue-flush-job.h
8 rambuf.h
13 recover.h
18 segment.h
8 superblock-recorder.h
9 target.h
30 util.h
384 writeboost.h
99 bigarray.c
192 cache-alloc.c
36 defer-barrier.c
33 dirty-sync.c
81 dm-writeboost.mod.c
85 flush-daemon.c
234 format-cache.c
553 handle-io.c
109 hashtable.c
345 migrate-daemon.c
41 migrate-modulator.c
169 queue-flush-job.c
52 rambuf.c
308 recover.c
118 segment.c
61 superblock-recorder.c
376 target.c
126 util.c