プロジェクト

全般

プロフィール

致命的 #1174

Reserverの処理のタイミングによって、稀にクラッシュすることがある

toshi_a 初音4ヶ月前に追加. 4ヶ月前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
開始日:
2018-02-15
期日:
進捗率:

0%

プラグイン名:

説明

3.6.3は酒( #1135 )の影響でクラッシュする。同じバグ報告あるかなと思って見に行ったらめっちゃあってびびった。


バックトレース

NameError uninitialized constant FrozenError {MIKUTTER_DIR}/core/lib/reserver.rb:80:in `rescue in complete'


再現手順

Ruby 2.4以下でmikutterを起動する


関連するチケット

関連している バグ #1135: core/lib/reserver.rbのwaiterでundefined method `each'が出る終了

関係しているリビジョン

リビジョン 2f7a5f97 (差分)
toshi_a 初音4ヶ月前に追加

Reserver: Ruby 2.4以下でFrozenErrorを使わない refs #1174

FrozenErrorが定義されていればそちらを使い、なければRuntimeErrorを使う。

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

Reserver: Ruby 2.4以下でFrozenErrorを使わない refs #1174

FrozenErrorが定義されていればそちらを使い、なければRuntimeErrorを使う。

履歴

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

  • 関連している バグ #1135: core/lib/reserver.rbのwaiterでundefined method `each'が出る を追加

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

  • ステータス新規 から 実装待ち に変更
  • 担当者toshi_a 初音 にセット
  • 再現手順 を更新 (diff)

これが発生するのは、 Ruby 2.4以下のRubyを使っている場合。Ruby 2.5では発生しない。

Reserverはデータレースが発生しうるいくつかの場所で Object#freeze を呼び、値を更新する時にFrozenErrorが発生するかどうかをチェックするが、freezeされたオブジェクトを更新しようとした時にFrozenErrorが発生するのはRuby 2.5からで、Ruby 2.4ではFrozenErrorが実装されていなかった。

2.4まではRuntimeErrorが発生している。これは一般的すぎるエラーなのでちょっとどうかと思うので、Ruby 2.4以前と2.5以降でトラップする例外クラスを適切に切り替えることで対応するのが良さそう。

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

Ruby 2.4なら、以下のコードを数回実行すればNameErrorを再現できる。

r = Reserver.new(0){ p "pass" }
r.cancel

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

  • ステータス実装待ち から 終了 に変更

Ruby2.5と2.3で、再現用のコードを実行してもクラッシュしないことを確認したのでmasterにmergeした

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