Project

General

Profile

致命的 #578

ruby-2.0.0p0にてタイムラインが表示されない

Added by ふぇのまー 葱野 about 7 years ago. Updated almost 7 years ago.

Status:
終了
Priority:
通常
Target version:
-
Start date:
2013-03-17
Due date:
% Done:

0%

プラグイン名:

Description

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>'
#1

Updated by toshi_a 初音 about 7 years ago

検証と対応ありがとうございます。
resolv-replaceはDNS正引中にmikutterをブロックしないようにするために用いているだけなので、そのコミットで問題はないと思います。
現在の仕様では、Ruby2.0.0では resolv-replace は使用できないという認識で正しいですか?

#2

Updated by ふぇのまー 葱野 almost 7 years ago

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し直す必要があるかと思います。

#3

Updated by toshi_a 初音 almost 7 years ago

  • Status changed from 新規 to 実装待ち

なるほど。もともと、resolv-replaceを使っている理由は、DNSの名前解決中にRubyの実行が停止するという問題があるとのことで、そこをすべてRubyで実装したresolv-replaceなら回避できるというのが使用した動機でした。ruby2.0でこのあたりの問題にどのような変化があったのかを調べて、Ruby2.0でも体感速度改善に有用であるなら、この件についてもう少し検討しましょう。

#4

Updated by toshi_a 初音 almost 7 years ago

  • Status changed from 実装待ち to 終了

Also available in: Atom PDF