[Twisted-web] Xml-Rpc server troubles
teratorn at world-net.net
Tue Nov 16 14:35:50 MST 2004
Andrea Nicolini wrote:
> Hi All,
> I'm trying to debug a XML-RPC server I wrote because sometimes it gets
> stuck and I don't know why.
> I'm not a twisted expertise so I hope someone in this list can help me.
> I use the server to give access to a MySql database via XML-RPC, the
> client are written in python and java.
> The server runs fine for some days and then suddenly it hangs.
> When the server hangs I can connect to the server port but when I call a
> remote method the server doesn't respond.
> The server is not throwing any exception.
> I'm running the server on a RH9 using Python 2.2 and Twisted 1.3.
> Here's a snippet of code:
> def xmlrpc_createjob(self,hash):
> d = self.dbpool.runInteraction(self.createjob,hash)
> return d.addCallback(self.returnData)
Where is your Errback? If this doesn't work then you'll never know until
the Deferred gets GC'ed, if it ever does, and even then only sometimes.
Deferred's have __del__ defined to hopefully, maybe, warn the user if there
were errors that never got handled. This is of course not guarenteed to
Always, always, add Errbacks.
> def createjob(self,cur,hash):
> """Method to create a new job -> returns the new job's
> qparam = ()
> cur.execute('SELECT * FROM jobtable')
> for field in cur.description:
> f = field
> if hash.has_key(f):
> if type(hash[f]) == type(u''):
> qparam += (hash
> qparam += (hash[f],)
> qparam += (None,)
> cur.execute("INSERT INTO jobtable VALUES (%s,%
> cur.execute("SELECT LAST_INSERT_ID() FROM
> curid = cur.fetchone()
> except Exception,err:
> return 0
> return curid
> I don't have any idea of what can cause this behaviour and how to debug
> the server.
> Any idea?
I don't know much about Twisted's RDBMS stuff. I'm assuming createjob
gets run in a thread.
Maybe these threads are getting stuck? *shrug*. Apparently the Deferred's
aren't firing, but you
could have a timeout function to see if they really are getting fired but
lost before the
result gets send back by xml-rpc.
Perhaps something like this (untested):
d = self.dbpool.runInteraction(self.createjob,hash)
reactor.callLater(5, checkIfDeferredFired, d)
if not d.called:
log.msg('Deferred not fired after 5 seconds')
#omit this if it will fill your logs too much
log.msg('Deferred fired OK')
More information about the Twisted-web