Feature #4788

resolv.rb refactoring

Added by Makoto Kishimoto about 5 years ago. Updated about 2 years ago.



#3835 ( )の結果、動かなくなっていたのでパッチを検討していたわけですが、

diff --git a/lib/resolv.rb b/lib/resolv.rb
index 1e18893..e9c2432 100644
--- a/lib/resolv.rb
+++ b/lib/resolv.rb
@@ -491,6 +491,12 @@ class Resolv
# #getresource for argument details.

 def each_resource(name, typeclass, &proc)
  • each_resource_(name, typeclass) {|reply, reply_name|
  • extract_resources(reply, reply_name, typeclass, &proc)
  • }
  • end +
  • def each_resource_(name, typeclass) lazy_initialize requester = make_udp_requester senders = {} @@ -517,7 +523,7 @@ class Resolv # response will not fit in an untruncated UDP packet. redo else
  • extract_resources(reply, reply_name, typeclass, &proc)
  • yield(reply, reply_name) end return when RCode::NXDomain

resolv_rb_patch.txt Magnifier (823 Bytes) Makoto Kishimoto, 05/27/2011 05:01 PM

resolv_rb_patch.txt Magnifier - method name updated (823 Bytes) Makoto Kishimoto, 07/14/2011 03:46 PM

Associated revisions

Revision 40159
Added by Akira Tanaka about 3 years ago

  • lib/resolv.rb (Resolv::DNS.fetch_resource): New method to obtain full result. [Feature #4788] proposed by Makoto Kishimoto.

Revision 40159
Added by Akira Tanaka about 3 years ago

  • lib/resolv.rb (Resolv::DNS.fetch_resource): New method to obtain full result. [Feature #4788] proposed by Makoto Kishimoto.

Revision 40159
Added by Akira Tanaka about 3 years ago

  • lib/resolv.rb (Resolv::DNS.fetch_resource): New method to obtain full result. [Feature #4788] proposed by Makoto Kishimoto.


#1 [ruby-dev:43596] Updated by Makoto Kishimoto about 5 years ago

とりあえず思いつかなかったのでパッチでは each_resource_ という名前にしてしまいましたが、fetch_resource という名前でどうでしょうか。

#2 [ruby-dev:43971] Updated by Hiroshi Nakamura almost 5 years ago

  • Assignee set to Akira Tanaka

#3 [ruby-dev:44070] Updated by Samuel Williams almost 5 years ago

I have a vested interest in this patch since I am the developer of RubyDNS. This update will allow RubyDNS to hook into resolve.rb more efficiently. Right now, I have to duplicate code in resolve.rb to get the right behaviour.

Also, I originally suggested then name fetch_resource and thus I support Makoto Kishimoto's proposal about this change.

Lets work to get this updated so that I can add good support for RubyDNS and Ruby 1.9.


#4 Updated by Yui NARUSE almost 5 years ago

  • Target version changed from 1.9.3 to 2.0.0

#6 [ruby-dev:44325] Updated by Akira Tanaka almost 5 years ago

2011/5/27 Makoto Kishimoto

#3835 ( )の結果、動かなくなっていたのでパッチを検討していたわけですが、



[田中 哲][たなか あきら][Tanaka Akira]

#7 [ruby-dev:44338] Updated by Makoto Kishimoto almost 5 years ago

元の問題は、lib/resolv.rb が、TCP へのフォールバックに対応して、その際に
make_requester --> make_udp_requester という名前の変更があったために、

しかし、make_requester のような内部の非常に低いレイヤにあるメソッドに
rubydns ライブラリのコードが依存していた理由は、DNS#each_resource
いるため、DNS プロキシのようなものを作る場合、each_resource メソッド中の
リソース取得部分のコードの duplicate が、このようなライブラリの実装において

ある extract_resources を、現状のハードコーディング状態から抽象化する
リファクタリングによって、ライブラリ側でのコード duplicate が必要なくなります。

パッチで追加される fetch_resource メソッドのユースケースとして、

--- resolv.rb.orig 2011-05-27 18:15:59.000000000 +0900
+++ resolv.rb 2011-08-03 10:38:43.000000000 +0900
@@ -24,6 +24,13 @@
# This allows such responses to be passed upstream with little or no
# modification/reinterpretation.
def query(name, typeclass)
+ if respond_to?(:fetch_resource) then
+ fetch_resource(name, typeclass) do |reply, reply_name|
+ return reply, reply_name
+ end
+ return
+ end
requester = make_requester
senders = {}

#8 [ruby-dev:44655] Updated by Samuel Williams over 4 years ago

It would be nice to get some movement on this - I'm getting bug reports from people trying to use 1.9.x and RubyDNS.

Kind regards,

#9 Updated by Shyouhei Urabe about 4 years ago

  • Status changed from Open to Assigned

#10 [ruby-dev:45450] Updated by Samuel Williams about 4 years ago

Hi, still having users with problems and no consistent way to solve it. Merging this patch would be a great addition. Let me know if you require any further support or have any questions.

#11 [ruby-dev:45454] Updated by Samuel Williams about 4 years ago

Here is a translation into English for the most recent message from Makoto:

The original problem is that 'lib/resolv.rb' had a fallback to TCP which was broken. There was a patch (#3835) which renamed ‘make_requester' to 'make_udp_requester’. This is not a public interface so the code which depended on it stopped working.

However, the reason why RubyDNS depended on such a method is because the high level interface performs breaks the response up into individual records but we are actually interested in the response in its entirety. This is specifically a problem when creating a DNS proxy where you want to forward requests with minimal changes. Duplicating the code for each_resource was unavoidable in the implementation of RubyDNS.

As in the patch provided by Makoto, code duplication can be reduced by removing the direct connection between each_resource and fetch_resource, and providing a block to be executed per successful response.

A second patch shows how RubyDNS can be simplified once the proposed change is applied.

#12 [ruby-dev:45719] Updated by Samuel Williams almost 4 years ago

Hi, still waiting for some progress on this issue. Lots of people are bugging me about it.

#14 [ruby-dev:45963] Updated by Shyouhei Urabe almost 4 years ago

@ioquatix isn't the only one who's interested in it (read: me too).

#15 [ruby-dev:46307] Updated by Akira Tanaka over 3 years ago

  • Target version changed from 2.0.0 to next minor

#16 Updated by Akira Tanaka about 3 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r40159.
Makoto, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

  • lib/resolv.rb (Resolv::DNS.fetch_resource): New method to obtain full result. [Feature #4788] proposed by Makoto Kishimoto.

#17 [ruby-dev:48212] Updated by Samuel Williams about 2 years ago

I'm happy to se this has been completed. I just thought I'd mention that I reimplemented the DNS resolver in RubyDNS using EventMachine as I couldn't wait for this bug fix. The new EventMachine resolver is asynchronous which makes it useful in the event driven server, such as the one in RubyDNS. Thanks for everyone's effort getting this bug resolved.

Also available in: Atom PDF