[Twisted-Python] Re: twisted-names: Cryptic error with no traceback?
pmarks at purdue.edu
Tue Feb 27 15:18:26 EST 2007
On 2/27/07, Paul Marks <pmarks at purdue.edu> wrote:
> Some users of a program that I'm writing have been reporting this
> error that I so far have been unable to track down. It seems that it
> originates from Twisted, but that it skips around my errback handler,
> and provides no traceback information:
> Traceback (most recent call last):
> Failure: twisted.names.error.DNSQueryTimeoutError:
> My query is made from line 121 here:
> Does anyone have any insight as to where this error could be coming
> from, and why it isn't getting trapped by my errback function? I
> don't know yet whether this is a problem in Twisted, or if I'm doing
> something incorrect in my err_cb.
Yay, I finally found the bug! Turns out it's a problem in Twisted.
Inside DNSDatagramProtocol.writeMessage, it writes to the UDP socket,
and never checks for socket.error.
If a socket.error does occur, then the query() function blows up
instead of returning its deferred. So, cancelCall gets forgotten. A
few seconds later, it chucks a DNSQueryTimeoutError, and the deferred
gets garbage collected without anything handling it.
The solution, I think, is this:
- in query(), move the "self.writeMessage(m, address)" call up a few
lines, to before the Deferred and callLater are created.
- Trap socket.error when making this writeMessage call. If it catches
one, return a defer.fail() immediately.
Basically, if the UDP packet fails to be sent, then the timeout should
never be created.
More information about the Twisted-Python