Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

非埋込PUTのジャーナルレコードにデータのchecksumを書くべきかどうか #30

Open
yuezato opened this issue Apr 12, 2019 · 1 comment

Comments

@yuezato
Copy link
Member

yuezato commented Apr 12, 2019

issue #28 のような問題があるので、
(データ領域ではなく)PUTレコード側にデータのchecksumも書くべきかどうか、
ということを議論したい。

データそのものの整合性というより、ジャーナルレコードとそこに紐づくデータの整合性に注目している。

すぐに考えられる実装としては以下の二つがある:

  1. PUTレコードを変更し(従ってストレージフォーマットが変更になる)、データのchecksumのためのフィールドを追加する。
  2. 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に含めてしまう。

すぐに考えられるデメリット:

  1. checksumの計算に追加の時間がかかる
    • 書き込み時と読み込み時で2回の新しい計算が必要
    • データサイズに応じてどの程度かかるものか計測する必要がある
@sile
Copy link
Member

sile commented Apr 13, 2019

メリット・デメリットがあるので、PUT_CHECKSUM的なレコードを新設して、ユーザ側で利用するかどうかを選択するようにしても良いのではないかと思いました。
後は、(入れるとしても)チェックサムの計算処理によってI/O処理用のスレッドの実行をブロックしたくはないので、その外側でチェックサムを実行するようにすると良さそうです(一時期、それに近いことをやっていたことがありました)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants