-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jean-Paul Calderone wrote:
You want to tie your application logic to a Service subclass. To start with, I'd try something like this, in dns3.py:
The very same error :-(. My code for "dns3.tac": ===== from twisted.application import service application = service.Application("DNS test") import sys sys.path=["."]+sys.path from dns3 import DomainResolver DomainResolver().setServiceParent(application) ===== My code for "dns3.py": ===== class resolucion(object) : def __init__(self,dominio) : global myResolver d = myResolver.lookupMailExchange(dominio,timeout=(1,)) d.addCallbacks(self._cbMailExchange, self._ebMailExchange) self.dominio=dominio def _cbMailExchange(self,results): # Callback for MX query global aun_pendientes aun_pendientes-=1 if not aun_pendientes : import time print "OK",time.time()-t #return from twisted.internet import reactor reactor.stop() return if not len(pendientes) : return resolucion(pendientes.pop()) from twisted.names import dns for i in results[0] : n=i.payload.name tipo=i.payload.TYPE if tipo==dns.MX : return p=i.payload.preference print n,p, for j in results[2] : if n==j.name : print j.payload.dottedQuad(),"(%d)" %j.ttl break else : print "???" elif tipo==dns.CNAME : redirigidos.append((self.dominio,i.payload.name)) def _ebMailExchange(self,failure): # Error callback for MX query global aun_pendientes aun_pendientes-=1 if not aun_pendientes : import time print "ERROR",time.time()-t #return from twisted.internet import reactor reactor.stop() return if not len(pendientes) : return resolucion(pendientes.pop()) print "XXX",self.dominio print 'Lookup failed:' failure.printTraceback() from twisted.application import service class DomainResolver(service.Service): def startService(self) : global pendientes,redirigidos,aun_pendientes,t,myResolver from twisted.names import client myResolver=client.Resolver(servers=[('127.0.0.1', 53)]) import time t=time.time() pendientes=[] redirigidos=[] f=open("z1") for i in f : pendientes.append(i.split()[0]) f.close() aun_pendientes=len(pendientes) concurrencia=1 for i in pendientes[:concurrencia] : resolucion(i) pendientes=pendientes[concurrencia:] =====
This will delay the execution of your startup code until twistd is totally ready and the reactor is fully initialized.
Done, but not working :-( [... DNS timeouts ...]
Okay, it sounds like you know what you're doing here :)
I like to think so };-)
I think the current caching resolver was a step in the wrong direction. A cache should probably *wrap* another resolver, not whatever weird thing it is doing now.
I agree. Perhaps a subclass of the network DNS resolver could be fine. So we could have a "client" class and a "cachingClient" one. In any case, current code simply doesn't cache anything, but eats CPU cycles.
If you write such a thing, it'd be great if you could submit it for inclusion :)
I'm not familiar enough with Twisted internal, yet, to try. Nevertheless, I would suggest an optional parameter in the caching resolver constructor, pointing to a callable object to resolve misses. Sort of. Code changes would be minimal... [... about differenciatiing DNS misses from RR misses...]
I think flags like this are ugly hacks as well. I completely agree that subclass/override is not a great way to get this functionality, but I'd like to think of a cleaner way to offer the new feature while still maintaining backwards compatibility.
Keep me informed :-p
Try the service class I used above. If you still see the exception, it may indicate a bug in Twisted's UDP support. If this case, could you attach the new version of the whole program? I'll take a closer look and see if I can nail down the exact cause.
Not working. Same exception. Code posted. Thanks a lot for your help, Jean Paul. Greatly appreciated. - -- Jesus Cea Avion _/_/ _/_/_/ _/_/_/ jcea@argo.es http://www.argo.es/~jcea/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/_/_/_/ PGP Key Available at KeyServ _/_/ _/_/ _/_/ _/_/ _/_/ "Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ "My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/ "El amor es poner tu felicidad en la felicidad de otro" - Leibniz -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iQCVAwUBQ6V9Nplgi5GaxT1NAQKAOwP9H251Jjvd/kNPJf7R+S9faHN9YFcSBluL YgBleuECDUG5WvJV2O+ZJwkHr05+qQ4qGzD13ydWnxdNCG1UMgWmIJ+TNfu2hOKN L+rQmNKIUKuPFTOHA+tACYqJaE9rkkcJumR7FON81kNJdEShs52aNUlnc1Q6A9IB iFyfaa9jcVI= =V82G -----END PGP SIGNATURE-----