project-tsurugi/yakushima

ランダム書き込み実行時のデッドロック

Closed this issue · 1 comments

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スレッドでランダム書き込みを実行しても通るようになりました.ただ,コード全体を見たわけではないため,別途確認をお願いします.

ありがとうございます。

75ece1c にて対応いたしました。
別途, 個別メッセージをお送りします。