On Wed, 5 Mar 2003, Yukihiro Matsumoto wrote:

> The only workaround I can think of is to use "resolv-replace", which
> is pure Ruby resolver.  It is not fast at all, but at least other
> thread can work during resolving.  Try putting
>
>   require "resolv-replace"

i see the same problem as seth.  when i run this :

  ruby -r socket -e 'p (Time.now); p (TCPSocket.new %q(ad.doubleclick.net), 80); p (Time.now)

it takes around 20 seconds to run.  so i tried

  strace !! > strace 2>&1

and here is where it got interesting.  looking at the strace file i saw :

  247 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
  248 connect(3, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("137.75.132.181")}}, 16) = 0
  249 send(3, "\314Q\1\0\0\1\0\0\0\0\0\0\2ad\vdoubleclick\3net\0"..., 36, 0) = 36
  250 time(NULL)                              = 1046809069

  251 poll([{fd=3, events=POLLIN}], 1, 5000)  = 0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	      THIS TIMED OUT!

  252 close(3)                                = 0

so then tried running

  strace dnsquery ad.doubleclick.net > strace 2>&1

and looking at it's strace, which shows :

  36 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
  37 connect(3, {sin_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("137.75.132.181")}}, 16)         = 0
  38 send(3, "s\332\1\0\0\1\0\0\0\0\0\0\2ad\vdoubleclick\3net\0"..., 36, 0) = 36
  39 gettimeofday({1046809802, 554050}, NULL) = 0
  40 rt_sigprocmask(SIG_SETMASK, NULL, [], 8) = 0
  41 select(4, [3], NULL, NULL, {5, 0})      = 1 (in [3], left {4, 950000})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	      THIS DID *NOT* TIMED OUT!
  42 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
  43 recvfrom(3, "s\332\201\200\0\1\0\1\0\4\0\4\2ad\vdoubleclick\3net\0"..., 8192, 0, {sin_family=AF_        INET, sin_port=htons(53), sin_addr=inet_addr("137.75.132.181")}}, [16]) = 206
  44 close(3)                                = 0



so, ruby sends (via syscalls)

  "\314Q\1\0\0\1\0\0\0\0\0\0\2ad\vdoubleclick\3net\0"

and then polls


while dnsquery sends (via syscalls)

  "s\332\1\0\0\1\0\0\0\0\0\0\2ad\vdoubleclick\3net\0"

and then selects


the problems is that the poll from ruby times out?!  i don't know much about
dns, and so don't understand the meaning of the queries, but perhaps one is
incorrect?  if not, then this seems like it could only be a bug in poll?

hope this helps.

-a




--
  ====================================
  | Ara Howard
  | NOAA Forecast Systems Laboratory
  | Information and Technology Services
  | Data Systems Group
  | R/FST 325 Broadway
  | Boulder, CO 80305-3328
  | Email: ahoward / fsl.noaa.gov
  | Phone:  303-497-7238
  | Fax:    303-497-7259
  ====================================