Subject: Re: re-reading /etc/resolv.conf and threads...
To: J.T. Conklin <jtc@acorntoolworks.com>
From: Manuel Bouyer <bouyer@antioche.eu.org>
List: tech-userlevel
Date: 04/27/2006 21:33:55
On Thu, Apr 27, 2006 at 11:14:19AM -0700, J.T. Conklin wrote:
> We've encountered an interesting problem with long lived server on our
> NetBSD 2.99-ish based appliance and changes to DNS configuration.
>
> It is my understanding that the best practice is for long running
> processes to call res_init() to reinitialize the resolver library
> when/if /etc/resolv.conf is changed, because on many systems (and it
> appears that NetBSD as among that set) it is not automatically done.
>
> This works with single-threaded programs, but with multiple threads
> __res_get_state() gets the resolver context from a free list, only
> allocating and initializing a new one if the list is empty. So the
> call to res_init() only reinitializes the global resolver context,
> which is not used. With multiple threads, multiple resolve.conf
> updates, and a very slow nameserver, it's possible for each context
> on the free list to be different. So depending on what thread gets
> what context, you can have completely different lookups. This seems
> ... undesirable.
>
> Other than running a local caching nameserver and never touching
> /etc/resolv.conf, what's the best practice for reseting the resolver
> context(s) for long lived processes?
There was a long thread about this on dec, 2003 and I may event have posted
a patch to have libc reread resolv.conf when needed (I don't remember).
I think the libc's resolver should take care of this; it's annoying to
have to restart firefox on a laptop because the network changed.
--
Manuel Bouyer <bouyer@antioche.eu.org>
NetBSD: 26 ans d'experience feront toujours la difference
--