テストステ論

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

(writeboost report) キャッシュ共有の排除を完了した

昨日の午後と今日の午前で, マイクからの課題であったキャッシュ共有の排除を実行した.

https://github.com/akiradeveloper/dm-writeboost

思考の上では簡単なことであるが, やってみると結構辛かった.

また, 同時に, ディスク上のメタデータをLittle Endianに強制することにした. dm-log.cや, dm-cacheでも, メタデータらしきものは以下のように実装してある. 同様に, superblockヘッダと定義するキャッシュデバイスの始め1セクタには, 4バイトのマジックナンバーを置くことにした. superblockのディスクレイアウトは, 頭1MBの中, さらに頭1セクタに固定データ(superblockヘッダと呼ぶ), しっぽ1セクタに更新するデータ(superblockレコードと呼ぶ)を置くことにした. 前者はフォーマットの要否を決定するものであり, 後者はどこまでマイグレートしたかと言った情報を任意に更新する. これは, 再起動時のメタデータ復元を早める効果があるが, 死ぬほど必要というわけではない. なくても問題ないにどちらかというと近い.

struct log_header_disk {
        __le32 magic;

        /*
         * Simple, incrementing version. no backward
         * compatibility.
         */
        __le32 version;
        __le64 nr_regions;
} __packed;

結果として,

  • コードはわかりやすくなり, コードは700行ほど削れた. しかしこれからいくらか増えるので, 最終的には400行減程度に収まるであろう.
  • Pythonのスクリプトは全廃した.
  • 初期化用のクイックスタートスクリプトは極めてシンプルになった.

現在の初期化スクリプトはこんな感じであり, 独自ユーザランドツールへの依存はない. dmsetup createの中ですべての初期化が閉じており, これもマイクの注文どおりである. 文句はないはずだ.

akira@Kamille:~/src/dm-writeboost$ cat prepare
#!/bin/sh

. ./config

# Discard the whole cache device before formatting
# blkdiscard command is included in upstream util-linux.
# But don't worry, without discarding, dm-lc works correctly.
# This is only a performance-relevant issue.
blkdiscard --offset 0 --length `blockdev --getsize64 ${CACHE}` ${CACHE}

# Zeroing the first sector in the cache device
# triggers formatting the cache device
echo destory cache ...
dd if=/dev/zero of=${CACHE} bs=512 count=1 oflag=direct

echo create perflv ...
sz=`blockdev --getsize ${BACKING}`
dmsetup create perflv --table "0 ${sz} writeboost ${BACKING} ${CACHE}"

echo configure things for tests ...
#dmsetup message perflv 0 commit_record_interval 2
#dmsetup message perflv 0 flush_current_buffer_interval 3

今後の課題は,

である. そこまで難しいことではない.