On Thu, Dec 13, 2007 at 04:05:19AM +0900, André wrote:
The auto-update function runs in a different thread, so the user won’t
even notice that the application is checking for a new version.
It all works fine, EXCEPT when there’s no network connection. In this
case, the WHOLE application simply hangs for one or two minutes, with
no regard for the fact that this code is running in a thread, or that
the timeout property is set.
I think your problem may be caused by a blocking name lookup, and
there seems to be a fix in the standard library (see below)
Explanation:
From what I understand, the builtin DNS resolver just hands off to a
blocking system call – which given the Ruby thread model means that
for the duration of that call no other threads will be scheduled (at
least, in 1.8).
The timeouts you specify won’t apply to the system call, and I don’t
think there’s any way to specify ones that will given the standard
implementation, so it’ll wait for the system default timeout (that 2m
delay sounds awfully familiar) before returning an error.
Possible solution:
I think the way to fix this is to replace the default resolver with an
alternative version that plays nicely with ruby threads - i.e. by
wrapping a native async DNS library, or a implementing one in pure
ruby.
While I haven’t tried this, I think you might be able to magically
solve this simply through the wonders of the standard library:
require ‘resolv-replace’
Which seems to provide a pure-ruby resolver which should play nice
with threads. I’m not sure if there are any consequences of doing
this though.
If that doesn’t work, there seem to be several DNS related gems, maybe
someone else can provide more detail.
And this error only happens on linux. Has anybody ever experienced
anything like it?
Why it happens only on linux, I’m not really sure - if this is
something like ethernet with an unplugged network cable, I have this
vague idea that most linuxes don’t actually take the interface down
when its unplugged, whereas maybe windows does - so on linux it tries
to send packets and wait for timeouts anyway, but maybe windows
disables/takes down the interface so it returns an immediate error?
Pure speculation on my part
Hope that helps (and please excuse the long-windedness :),
Stephen L.