バグ #1135
core/lib/reserver.rbのwaiterでundefined method `each'が出る
Description
core/lib/reserver.rbのwaiterで以下の通りundefined method `each'が出ています。
どのタイミングかはわからないですが、比較的高頻度で出力されています。
warning: {MIKUTTER_DIR}/core/lib/reserver.rb:72:in `rescue in block (2 levels) in waiter': undefined method `each' for nil:NilClass from /Users/akkie/.rbenv/versions/2.3.1/lib/ruby/2.3.0/set.rb:674:in `each' from {MIKUTTER_DIR}/core/lib/reserver.rb:62:in `first' from {MIKUTTER_DIR}/core/lib/reserver.rb:62:in `block (2 levels) in waiter'
Related issues
Updated by toshi_a 初音 about 3 years ago
- Tracker changed from 機能 to バグ
- Start date deleted (
2017-12-23)
Updated by toshi_a 初音 about 3 years ago
詳しく調査するモチベーションがなかったので、言われたらやろうと思っているやつでした。
rbtreeを使えばエラーが出なくなるんですが、挿入速度を気にしてSortedSetを使っているのを普通にArrayにしても、とくに速度が変わらなかったということがあったと記憶しています。ベンチマークを取ってrbtreeを使うか判断します。
どちらにしても、しばしばエラー出力をする実装より遅くなることはないでしょう。
Updated by toshi_a 初音 almost 3 years ago
- Status changed from 新規 to 実装待ち
- Assignee set to toshi_a 初音
Updated by toshi_a 初音 almost 3 years ago
- Status changed from 実装待ち to レビュー待ち
- Assignee changed from toshi_a 初音 to Akira Ouchi
ブランチ topic/1135-fix-reserver-data-structure に修正したものがあるので、確認お願いします。
以下、本件の報告とは関係ないですが酒を飲みながら余計なことをしたので覚書です。
排他制御を使わない¶
Reserverを作ったThreadがReserverのスケジューラに登録を行うので、スケジューラを実行する別のThreadとデータレースが起こる可能性があったためMutexを使って排他制御を行っていたが、Thread::Queueを使って、スケジューラの配列に単一のThreadからアクセスされないようにすることでロックが不要になった。
SortedSetの使用中止とデータ構造の変更¶
SortedSetをやめてArrayにしたうえで、Reserverが作られるたびに Array#sort_by! を呼び出すようにしたところ、このチケットの警告が出力されないこともあって、同時刻に実行されるReserverを1万件登録する実験では、ジョブが実行されるタイムラグが40%削減された。
$cnt = 0
t = Time.now
Reserver.new(0){ ; }
10000.times do
Reserver.new(1, thread: SerialThread){
$cnt += 1
p "#{Time.now - t}" if $cnt == 10000
}
end
Updated by Akira Ouchi almost 3 years ago
- Status changed from レビュー待ち to 解決
修正を確認できました。
rescue WakeUp
# ɛ ʘɞʘ ɜ
end
これすき
Updated by toshi_a 初音 almost 3 years ago
- Related to 致命的 #1174: Reserverの処理のタイミングによって、稀にクラッシュすることがある added