致命的 #578
完了ruby-2.0.0p0にてタイムラインが表示されない
0%
説明
ruby-2.0.0p0 + ruby-gtk2 1.2.3の環境にてタイムラインが一切表示されない。
net/httpライブラリの以下のような仕様変更により、2.0からは
TCPSocket.openの第3,4引数にローカルホストのホスト名とポート番号を渡す
ことが可能になった。
- 1.9: TCPSocket.open(conn_address(), conn_port())
- 2.0: sock = TCPSocket.open(conn_address, conn_port, @local_host, @local_port)
@local_hostと@local_portは通常デフォルトでnilが設定されている。
ここでresolv-replaceライブラリを使用すると、TCPSocketライブラリ
のリゾルバにrubyのResolvクラスを使用するようになるが、
Resolv::DNS::Name.createでは引数がnilの場合例外として処理される。
irb(main):003:0> Resolv::DNS::Name.create("hachune.net") => #<Resolv::DNS::Name: hachune.net> irb(main):004:0> Resolv::DNS::Name.create(nil) ArgumentError: cannot interpret as DNS name: nil from /usr/lib/ruby/1.9.1/resolv.rb:1144:in `create' from (irb):4 from /usr/bin/irb:12:in `<main>'
よって、resolv-replaceライブラリをrequireした時点で@local_hostが未指定
(nilのまま)だと例外が発生し、core/lib/mikutwitter/connect.rbの
MikuTwitter::APIShortcuts.connectが異常終了する。
miku@hachune% ruby20 -r socket -e 'p TCPSocket.open("mikutter.hachune.net", 80, nil, nil)' #<TCPSocket:fd 5> miku@hachune% ruby20 -r socket -r resolv-replace -e 'p TCPSocket.open("mikutter.hachune.net", 80, nil, nil)' /usr/ruby20/lib/ruby/2.0.0/resolv.rb:1176:in `create': cannot interpret as DNS name: nil (ArgumentError) from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:1022:in `generate_candidates' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:1047:in `resolv' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:513:in `each_resource' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:406:in `each_address' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:115:in `block in each_address' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:114:in `each' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:114:in `each_address' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:92:in `getaddress' from /usr/ruby20/lib/ruby/2.0.0/resolv.rb:43:in `getaddress' from /usr/ruby20/lib/ruby/2.0.0/resolv-replace.rb:10:in `getaddress' from /usr/ruby20/lib/ruby/2.0.0/resolv-replace.rb:22:in `initialize' from -e:1:in `open' from -e:1:in `<main>'
toshi_a 初音 さんが約11年前に更新
検証と対応ありがとうございます。
resolv-replaceはDNS正引中にmikutterをブロックしないようにするために用いているだけなので、そのコミットで問題はないと思います。
現在の仕様では、Ruby2.0.0では resolv-replace は使用できないという認識で正しいですか?
ふぇのまー 葱野 さんが約11年前に更新
rubyのtrunkでは既にlib/resolv-replace.rbに修正が入っています。
commit b1f2effda85efd03bd4ad5c06e0aae5e14f3f864
Author: akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon Mar 11 13:47:04 2013 +0000
- lib/resolv-replace.rb (TCPSocket#initialize): resolve the 3rd
argument only if non-nil value is given.
[ruby-dev:47150] [ruby-trunk - Bug #8054] reported and analyzed by
mrkn.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39725 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
ruby_2_0_0のブランチにはまだ入っていないようなので、もしresolv-replaceが必要であれば
2.0.0のみTCPSocketをoverrideし直す必要があるかと思います。
toshi_a 初音 さんが約11年前に更新
- ステータス を 新規 から 実装待ち に変更
なるほど。もともと、resolv-replaceを使っている理由は、DNSの名前解決中にRubyの実行が停止するという問題があるとのことで、そこをすべてRubyで実装したresolv-replaceなら回避できるというのが使用した動機でした。ruby2.0でこのあたりの問題にどのような変化があったのかを調べて、Ruby2.0でも体感速度改善に有用であるなら、この件についてもう少し検討しましょう。