I'm trying to get rid of the GUI-blocking timeout that occurs on
getaddrinfo() during connecting to XMPP server when network is down.
In such case, getaddrinfo blocks for quite a long time and roster window
doesn't respond. It happens on connect after executing Gajim, and also
when Gajim disconnects due to a network failiure and then tries to
reconnect (and network is still down).
I was talking about that with Asterix and because we didn't find any
AAAA-capable asynchronous python dns library, we came up with following:
Because SRV requests are done asynchronously via nslookup in pipe polled
in IdleQueue (src/common/nslookup.py), it's possible to detect that DNS
server is not available from result of asynchronous SRV request. And -
if we know that DNS SRV request failed, then don't do the getaddrinfo call.
But now I found out that there is a short blocking timeout when closing
pipe with running nslookup - on self.pipe.close(), so this is not a
solution for GUI blocking on connect.
I already tried putting getaddrinfo to separate thread, but it just
didn't work for me - the thread was waiting even after a successful gai
call... As for dns libraries - adns can't do AAAA requests, pydns and
dnspython can't operate asynchronously.
What I'm looking for is either
- some elegant way how to do both A and AAAA requests asynchronously
(like nonblocking getaddrinfo) which would be a nice solution
- nonblocking detect that network is down which would allow to avoid
needless call of getaddrinfo (temporary solution until some
suitable library appears)
Do you have any ideas/suggestions on this?
jabber: tom.to.the.k at jabber.cz
GSoC blog: http://tomk-soc08.blogspot.com/
Gajim-devel mailing list