9/1に僕がさくらサーバを使って運営しているTooxが動かなくなってました。会社から帰ってきて調査してみたところ、どうやらRuby::DBIが使えなくなってるもよう。
- test.rb
#!/usr/local/bin/ruby require "dbi"
- test.rb実行結果
/usr/local/lib/ruby/site_ruby/1.8/dbi/utils/date.rb:57: undefined method `deprecate' for DBI::Date:Class (NoMethodError) from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from /usr/local/lib/ruby/site_ruby/1.8/dbi/utils.rb:56 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:50 from ./test.rb:3:in `require' from ./test.rb:3
おいおい。。。これ完全にさくらサーバの問題ですよね。というわけで、怒りを抑えつつもも調査続行。
dbi/utils/date.rbでdeprecateメソッドを使っているけど、それがないみたい。で、deprecateメソッドはdbi/columninfo.rbで[require "deprecated"]していました。
/usr/local/lib/ruby/gems/1.8/gems/deprecated-3.0.0/lib/deprecated.rbのUsageを見てみると、、、
# Usage is simple: # # class Foo # include Deprecated # # def moo # "cow" # end # # deprecated :moo # # def sheep # "baaa" # end # # deprecated :sheep, "Sounds#baa" # # protected # # def bar # true # end # # deprecated :bar # end
おい![include Deprecated]で使うってかいてあるじゃないかYO!これはおかしいと思って手元のUbuntuのdeprecated.rbを見てみることに。
- さくらサーバ : deprecated-3.0.0
- Ubuntu10.04 : deprecated-2.0.1
メジャーバージョンアップしてる。\(^o^)/オワタ。
(さくらサーバのdeprecated.rbの日付をみると8/30に更新されてる)
泣きそうになりながらGoogle先生に聞いてみたり、DBI::Dateをいじってみたりとしてみましたが、だめぽ。。。
そんな時、ピコーンと閃きました。
自分でDBI入れ直そうと。ということでgemを使ってホーム以下に入れました。
#dbiを入れるとdeprecatedも一緒に入る gem install dbi --install-dir /home/hoge/gems/
[require "dbi"]したときに自分が入れたdbiとdeprecatedをロードするようにロードパスを変更しておく必要があります。
#!/usr/local/bin/ruby $:.insert(0 , "/home/hoge/gems/gems/deprecated-2.0.1/lib" , "/home/hoge/gems/gems/dbi-0.4.5/lib") require "dbi"
これで何とか復旧しました。
他にも誰か困っていないのかなーと思ったらこんなツイートを見つけました。
さくらのサーバーに入ってるRubyのライブラリがアップデートで壊された模様。requireしただけで吹っ飛んでます。
deprecated.rbを使ってるところ全体に影響でてるんだろうな。。。
さくらさん、せめて障害情報に載せてくれよ。