[Twisted-Python] Still fighting "twisted.names.client"
Jean-Paul Calderone
exarkun at divmod.com
Tue Jan 24 12:34:59 EST 2006
On Tue, 24 Jan 2006 17:50:55 +0100, Jesus Cea <jcea at argo.es> wrote:
>-----BEGIN PGP SIGNED MESSAGE-----
>Hash: SHA1
>
>I started a thread a month ago, with no luck yet.
><http://twistedmatrix.com/pipermail/twisted-python/2005-December/012162.html>
>
>I have a reduced test case, for ease diagnosis. I hope Jean-Paul
>Calderone can have a look at the issue.
Thanks for following up on this. I couldn't reproduce the problem before, but with your new example I can.
>===== File "dns4.py" =====
>
>class resolution(object) :
> def __init__(self,domain) :
> global myResolver
> d = myResolver.lookupMailExchange(domain,timeout=(5,))
Here, you're specifying that the lookup should use no retransmits, and should fail if no response is received after 5 seconds. This isn't generally a good way to do DNS lookups, but IIRC you had a particular reason for wanting this. In any case, the first bug you hit was one that caused the first message received in response to the first query made on a resolver object to be spuriously dropped. Since most applications do re-transmits, this usually didn't cause anything more problematic than one extra DNS request/response. I've fixed this in current trunk.
> d.addCallbacks(self._cbMailExchange, None)
>
> def _cbMailExchange(self,results):
> # Callback for MX query
> print "XX",repr(results)
> from twisted.internet import reactor
> reactor.stop()
> return
It turns out there is a bug in Twisted's UDP support. Calling reactor.stop() from beneath datagramReceived() triggers an infinite exception loop. I've created a ticket in the tracker (1448) for this. Until it's resolved, or if you want this to work on a previous release of Twisted, you can use "reactor.callLater(0, reactor.stop)" to avoid the problem.
>
>from twisted.application import service
>
>class DomainResolver(service.Service):
> def startService(self) :
> global myResolver
>
> from twisted.names import client
> myResolver=client.Resolver(servers=[('127.0.0.1', 53)])
>
> resolution("argo.es")
> #resolution("argo.es")
>
> [snip]
>
>Thanks in advance for your time.
Thanks for the minimal example :)
Jean-Paul
More information about the Twisted-Python
mailing list