Hello all

I'm experiencing frequent deadlocks in my cherrypy/sqlobject multithreaded server application. I'm unable to reproduce the error in a small-scale example yet, but one thing I noticed is, that it might be related to me creating other sqlobjects in an overwritten _create() function.

What I see is that various threads try to acquire a threadSafeMethod decorator's lock, originating from various places:

...
File "/usr/lib/python2.4/site-packages/sqlobject/sresults.py", line 165, in __iter__
return iter(list(self.lazyIter()))
File "/usr/lib/python2.4/site-packages/sqlobject/dbconnection.py", line 804, in next
obj = self.select.sourceClass.get(result[0], selectResults=result[1:], connection=self.dbconn)
File "/usr/lib/python2.4/site-packages/sqlobject/main.py", line 915, in get
val = cls(_SO_fetch_no_create=1)
File "/usr/lib/python2.4/site-packages/sqlobject/declarative.py", line 92, in _wrapper
lock.acquire()
File "threading.py", line 100, in acquire
rc = self.__block.acquire(blocking)

And one thread is pending on the cache's lock:

...
File "/usr/lib/python2.4/site-packages/sqlobject/declarative.py", line 94, in _wrapper
return fn(self, *args, **kwargs)
File "/usr/lib/python2.4/site-packages/sqlobject/main.py", line 1214, in __init__
self._create(id, **kw)
File "/usr/lib/python2.4/site-packages/sqlobject/main.py", line 1245, in _create
self._SO_finishCreate(id)
File "/usr/lib/python2.4/site-packages/sqlobject/main.py", line 1271, in _SO_finishCreate
cache.created(id, self.__class__, self)
File "/usr/lib/python2.4/site-packages/sqlobject/cache.py", line 300, in created
self.caches[cls.__name__].created(id, obj)
File "/usr/lib/python2.4/site-packages/sqlobject/cache.py", line 177, in created
self.cull()
File "/usr/lib/python2.4/site-packages/sqlobject/cache.py", line 190, in cull
self.lock.acquire()

.. originating from a certain _create function (hence my assumption).

My create() is looking quite straight-forward, something like this:

class MyClass(sqlobject):
foo = ForeignKey('OtherClass', default=None)
bar = ForeignKey('OtherClass', default=None)

def _create(self, *args, **kw):
# Create the object
super(MyClass, self)._create(*args, **kw)

# Create other object
self.foo = OtherClass()
self.bar = OtherClass()

So, my question is: is this problematic, and, if yes, what other ways are there to do it?

Thanks a million
Bernhard


... and, sorry for the mess:
___________________________________________________________________

Disclaimer:


Diese Mitteilung ist nur fuer die Empfaengerin / den Empfaenger bestimmt.

Fuer den Fall, dass sie von nichtberechtigten Personen empfangen wird, bitten wir diese hoeflich, die Mitteilung an die ZKB zurueckzusenden und anschliessend die Mitteilung mit allen Anhaengen sowie allfaellige Kopien zu vernichten bzw. zu loeschen. Der Gebrauch der Information ist verboten.


This message is intended only for the named recipient and may contain confidential or privileged information.

If you have received it in error, please advise the sender by return e-mail and delete this message and any attachments. Any unauthorised use or dissemination of this information is strictly prohibited.