プロジェクト

全般

プロフィール

バグ #1135

core/lib/reserver.rbのwaiterでundefined method `each'が出る

Akira Ouchi12ヶ月前に追加. 10ヶ月前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
プラグイン名:
ブランチ:
クラッシュする:
いいえ

説明

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'

関連するチケット

関連している 致命的 #1174: Reserverの処理のタイミングによって、稀にクラッシュすることがある終了2018-02-15

関係しているリビジョン

リビジョン 96f46c86 (差分)
toshi_a 初音10ヶ月前に追加

より良いcaseの使い方 refs #1135

リビジョン f6cedd73 (差分)
toshi_a 初音10ヶ月前に追加

Lock-Freeな実装に書き直した refs #1135

履歴

#1 toshi_a 初音12ヶ月前に更新

  • トラッカー機能 から バグ に変更
  • 開始日 を削除 (2017-12-23)

#2 toshi_a 初音12ヶ月前に更新

詳しく調査するモチベーションがなかったので、言われたらやろうと思っているやつでした。
rbtreeを使えばエラーが出なくなるんですが、挿入速度を気にしてSortedSetを使っているのを普通にArrayにしても、とくに速度が変わらなかったということがあったと記憶しています。ベンチマークを取ってrbtreeを使うか判断します。
どちらにしても、しばしばエラー出力をする実装より遅くなることはないでしょう。

#3 toshi_a 初音10ヶ月前に更新

  • ステータス新規 から 実装待ち に変更
  • 担当者toshi_a 初音 にセット

#4 toshi_a 初音10ヶ月前に更新

  • ステータス実装待ち から レビュー待ち に変更
  • 担当者toshi_a 初音 から 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

#5 Akira Ouchi10ヶ月前に更新

  • ステータスレビュー待ち から 解決 に変更

修正を確認できました。

    rescue WakeUp
      # ɛ ʘɞʘ ɜ
    end

これすき

#6 toshi_a 初音10ヶ月前に更新

  • ステータス解決 から 終了 に変更

ɛ ʘɞʘ ɜ

#7 toshi_a 初音10ヶ月前に更新

  • 関連している 致命的 #1174: Reserverの処理のタイミングによって、稀にクラッシュすることがある を追加

他の形式にエクスポート: Atom PDF