issue #28 のような問題があるので、
(データ領域ではなく)PUTレコード側にデータのchecksumも書くべきかどうか、
ということを議論したい。
データそのものの整合性というより、ジャーナルレコードとそこに紐づくデータの整合性に注目している。
すぐに考えられる実装としては以下の二つがある:
- PUTレコードを変更し(従ってストレージフォーマットが変更になる)、データのchecksumのためのフィールドを追加する。
- PUTレコードを変更せずに(ストレージフォーマットの変更は不要だがマイグレーションが必要)、
|
JournalRecord::Put(ref lump_id, portion) => { |
|
adler32.update(TAG_PUT); |
|
adler32.update_buffer(&lump_id_to_u128(lump_id)[..]); |
|
let mut buf = [0; 7]; |
|
BigEndian::write_u16(&mut buf, portion.len); |
|
BigEndian::write_uint(&mut buf[2..], portion.start.as_u64(), PORTION_SIZE); |
|
adler32.update_buffer(&buf); |
|
} |
の計算においてportionもchecksumに含めてしまう。
すぐに考えられるデメリット:
- checksumの計算に追加の時間がかかる
- 書き込み時と読み込み時で2回の新しい計算が必要
- データサイズに応じてどの程度かかるものか計測する必要がある
issue #28 のような問題があるので、
(データ領域ではなく)PUTレコード側にデータのchecksumも書くべきかどうか、
ということを議論したい。
データそのものの整合性というより、ジャーナルレコードとそこに紐づくデータの整合性に注目している。
すぐに考えられる実装としては以下の二つがある:
cannyls/src/storage/journal/record.rs
Lines 110 to 117 in 8759940
portionもchecksumに含めてしまう。すぐに考えられるデメリット: