操作
致命的 #1174
完了Reserverの処理のタイミングによって、稀にクラッシュすることがある
開始日:
2018-02-15
期日:
進捗率:
0%
プラグイン名:
バックトレース
NameError uninitialized constant FrozenError {MIKUTTER_DIR}/core/lib/reserver.rb:80:in `rescue in complete'
再現手順
Ruby 2.4以下でmikutterを起動する
関連するチケット
toshi_a 初音 さんがほぼ7年前に更新
- 関連している バグ #1135: core/lib/reserver.rbのwaiterでundefined method `each'が出る を追加
toshi_a 初音 さんがほぼ7年前に更新
- ステータス を 新規 から 実装待ち に変更
- 担当者 を toshi_a 初音 にセット
- 再現手順 を更新 (差分)
これが発生するのは、 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以降でトラップする例外クラスを適切に切り替えることで対応するのが良さそう。
toshi_a 初音 さんがほぼ7年前に更新
Ruby 2.4なら、以下のコードを数回実行すればNameErrorを再現できる。
r = Reserver.new(0){ p "pass" }
r.cancel
toshi_a 初音 さんがほぼ7年前に更新
- ステータス を 実装待ち から 終了 に変更
Ruby2.5と2.3で、再現用のコードを実行してもクラッシュしないことを確認したのでmasterにmergeした
操作