[Zope] How to access ZODB from python code
Dieter Maurer
dieter@handshake.de
Sat, 29 Mar 2003 01:04:17 +0100
Gabriel Genellina wrote at 2003-3-26 22:27 -0300:
> ....
> Yes, we do close the connection. This is the full fragment:
>
> app = Zope.app()
> obj = app.restrictedTraverse(path)
> get_transaction().commit()
> app._p_jar.close()
> del app
> return obj
>
> The server freezes inside the restrictedTraverse call (never returns).
I suspect there is some hidden and rarely exposed locking bug in Zope
causing Zope to stop responding to requests due to a deadlock.
I dearly would like to locate and fix it. But, I am unable to
reproduce the situation reliably.
Maybe, your setup provides a way for reproduction.
Are you accustomed using a debugger (on C level?).
If so, we may be able to sort this out:
You need to connect the debugger to your Python process.
You need to select the thread responsible for your
hanging operation.
You look at the stack trace.
This will tell you where your thread is waiting.
This may be waiting for a lock or waiting for
some external connection.
In the second case, you are almost done.
In the first case (waiting for a lock) we must
find out, which lock and where. This means
going up (to older) some stack frames looking
for "code" objects. When a code object is
dereferenced, it reveals the filename ("co_filename") it was defined
in and the function name ("co_name") it is code for.
Both are pointers to "PyStringObject"s and may need to be cast
correspondingly. The string content is found starting
at "ob_sval".
Unfortunately, you cannot use the Python functions normally
used to access and display Python objects as they will block.
You must use elementary debugger commands.
As you see, the debugging may not be easy but we might
find a deeply hidden problem...
Dieter