読者です 読者をやめる 読者になる 読者になる

テストステ論

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

(writeboost report) 同じアドレスへのwriteに続いてreadをほぼ同時に発行したらどうなるのか

ライトブーストのバグを撲滅するために思考実験をしてみる. もし, 同じアドレスに対してwriteを発行し, すぐさまreadを発行したらどうなるか.

2つの懸念がある.

  1. バッファへの書き込みが中途半端な状態でreadしてしまう. memcpyがatomicでないことに起因する.
  2. バッファに書いたがまだACKを返していない時点でreadがバッファのデータを読むことがあり得る. この場合, 「まだACKもらってないけど古いデータが読めなくなった」という問題が起こる. 常識的にいえば, ACKを返していないのだから古いデータが読めるべきである.

前者については, バッファからのread前にnr_inflight_iosがゼロになるのを待つコードを入れておけばよい. ハッシュテーブルへの検索はmutexをとっているから, writeについてはmutexの中でin_flight_iosがインクリされる. 従って, ACKが返されるまでreadが行われることはあり得ない. いや, 嘘かも知れない. 仮に, 同じタイミングで両方ともmemcpyに入ってしまっていたら・・・. 最悪ケースは, バッファへのライトをspinlockで保護すれば完璧であるが, 正常なパスで余計に一つspinlockをとることが癪すぎる.

後者については, 無視する. そもそもこれは結果が予測出来ない. 言い換えると, before/after-writeのデータを読むのか予測出来ない. 従って, 発行者はいずれも期待しているはずである. 従って, どちらに転ぼうがライトブーストとしては何も裏切りはしない.

そもそも, この思考実験は現実的にはほぼ100%起こり得ないことを行っているため, 現実的には無駄である. しかし, コードを正しくしようとすること自体には意味があるので検討メモを残した.