/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

SinatraでThread.exclusive is deprecated, use Mutex発生

ここ最近、Sinatraを使い出しています。

sinatraとは、Rubyで作られたWEBアプリのフレームワークです。Rubyスクリプト以上、Rails未満といった感じで初級者の自分にとってはとっつきやすいフレームワークです。

Sinatra: README (Japanese)

こんなエラーが。

Thread.exclusive is deprecated, use Mutex
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-contrib-1.4.6/lib/sinatra/reloader.rb:222:in `block in registered'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `block in compile!'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:in `block in process_route'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `catch'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `process_route'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:966:in `block in filter!'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:966:in `each'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:966:in `filter!'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1084:in `block in dispatch!'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:in `dispatch!'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `block in call!'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `call!'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-1.6.4/lib/rack/logger.rb:15:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:212:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/show_exceptions.rb:25:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `block in call'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:in `synchronize'
/usr/local/rvm/gems/ruby-2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `call'
/usr/local/rvm/gems/ruby-2.3.0/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'

ちゃんと実行はされているものの、アクセスする度にこのログが出てきています。なんなんだろう?とちょっと調べてみました。

実行環境

ちなみに自分の環境はこんな感じです。

$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
$ gem -v
2.5.1
$ gem list sinatra

*** LOCAL GEMS ***

sinatra (1.4.7)
sinatra-contrib (1.4.6)

エラー(というか警告?)の原因は?

エラーログを見る限りだと、該当箇所はsinatra-contribのgemの中で発生している様子。

で、何が起こっているかというと・・・・・

すみません。全然読み解く力ありません。とりあえず、「Thread.exclusiveはやめて、Mutex使え!」ということしかわかりません。

なぜにThread.exclusiveがダメなのかとかは下のサイトさんで説明されています。

Thread.exclusive is deprecated, use Mutex - FIVETEESIXONE

解決方法は?

上のサイトさんにあったように、Mutexに書き換えればいいらしい、初心者の自分にはどこをどう書き換えるべきなのかさっぱり。

で、公式を見てみたところissueとして上がっていました。

Ruby 2.3: Thread.exclusive is deprecated, use Mutex · Issue #183 · sinatra/sinatra-contrib · GitHub

この記事作成時の21時間前にOwnerがasapでやるとコメントしているので、近々修正されるのかな。

まとめ

とりあえず・・・・・待ちです。定期的にgem updateを実行するぐらいですね。

これって、Ruby2.3を使っていると発生する現象なんですかね。2.2とかだと起こらないものなのかな。ここを直せばOKみたいな感じで指摘できるレベルまで早くたどり着きたいものです。