ランダム書き込み実行時のデッドロック
Closed this issue · 1 comments
baycedar commented
Bug
空の木に対して並列でランダム書き込みを実行するとデッドロックが発生します.あるスレッドがノードのロックを専有したままになり,yakushima::node_version64::get_stable_version
内のこのループから抜けられなくなるようです.
Execution Environment
- Branch or Commit:
main
(a3eeab) - OS: Ubuntu 20.04
- Compiler: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1)
To Reproduce
スレッド数2以上で,各スレッド100万レコードをランダムなキーに対して書き込むと発生します(予め各スレッドで書き込むキーをパーティションで分けておくと発生しないようです).たまに通りますが,8スレッド程度使えばだいたい止まるようになります.
なお,index-benchmarkのtmp-yakuhsimaブランチに状況を再現するためのコードを用意しました.デフォルトで8スレッドが100万レコードずつ書き込む設定になっており,ビルド後にindex_bench
を実行していただければおそらく状況を再現できます.-DCMAKE_BUILD_TYPE=Debug
でビルドしても発生するため,デバッガで確認することも可能です.
Expected Behavior
ざっと関係しそうなコードを見ただけなので不確実ですが,おそらくinterface_put.hの160行目で獲得したロックの解放し忘れです.164行目および168行目でgoto
する前に獲得したロックの解放が必要だと思います.試しに各goto
の前でロックを解放してみたところ112スレッドでランダム書き込みを実行しても通るようになりました.ただ,コード全体を見たわけではないため,別途確認をお願いします.