[Zope-DB] ZPsycopgDA Connections and Refreshed Zope Products

Federico Sevilla III jijo@free.net.ph
Tue, 25 Mar 2003 13:56:01 +0800


--X1bOJ3K7DJ5YkBrT
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi Federico,
(cc Zope-DB)

On Sun, Mar 23, 2003 at 05:59:10PM +0100, Federico Di Gregorio wrote:
> > To verify, I restarted Zope, effectively closing all connections to
> > PostgreSQL. Then I accessed the instance of my product, initating a
> > connection. I did a number of other stuff, and still there was
> > exactly one connection. Then I updated the timestamp of a file in my
> > product's source directory, recompiled the .pyc and .pyo files, and
> > refreshed my product. The next access to an instance of my product
> > created a new connection to the PostgreSQL database.
> 
> this is the very first time someone reports a way to reproduce the
> problem. note that i am not even sure it is really a problem because
> zope's object cache and threads can make the number of connections
> very high. can you send me a cut-down version of your product and a
> checklist to expose the problem. the minimum to start debugging.

I am attaching a bzip2-compressed copy of today's snapshot of
MedPlants.py, the main class of my very rough Zope product. Please
pardon the code, it is my first foray into Zope product development
(feel free to give me tips or comments to improve things, if for some
reason you get the urge to). This has everything except the __init__.py
and the web presentation methods.

Essentially on instantiation MedPlants creates a ZPsycopgDA instance in
the instance (which is folderish), named 'dba'. 'dba' is accessed by the
SQL methods in the code. It is also accessed by the instance of the
eXtensible User Folder.

I was doing work until midnight yesterday, then left everything as is
(with I presume minimal access to the MedPlants instance, if any, as it
is not public). 13 hours have passed and still I have 29 connections to
the database, all by the Zope user (there is exactly one database
adapter in my entire Zope site that accesses the database, connections
to which I have counted, so all 29 connections are by the single 'dba'
instance in a single instance of MedPlants).

Just to test the "problem" reproduction, I touched MedPlants.py, rebuilt
the .pyc and .pyo files, and refreshed the product. Then I logged in to
the MedPlants instance, and counted the number of database connections.
Exactly 30. I logged-out, logged-in again as another user, did some
other database-accessing tasks, and did a connection count. Still
exactly 30.

Then I did something new: I flushed the ZODB cache
(/Control_Panel/Database -> Minimize), then did a connection count. It
went down to 29. I did some more flushes, just to be sure, and still the
connection count remained at 29. I logged in to the MedPlants instance
and the connection count went back up to 30.

This last bit of information seems to indicate that the 29 connections
are orphans of some sort. Stopping or restarting Zope kills them all,
though. This also causes PostgreSQL to spew out the following for each
connection that was still alive (but "orphaned"):

     LOG:  pq_recvbuf: unexpected EOF on client connection

I am using the following Debian package versions of relevant software:

 - Zope                 2.6.1-0.3
 - Python2.1            2.1.3-17
 - Python2.1-Psycopg    1.1.2-1
 - Zope-PsycopgDA       1.1.2-1
 - Zope-exUserFolder    0.10.10-3
 - PostgreSQL           7.3.2r-4

Thank you for all the help.

 --> Jijo

-- 
Federico Sevilla III  : http://jijo.free.net.ph      : When we speak of free
Network Administrator : The Leather Collection, Inc. : software we refer to
GnuPG Key ID          : 0x93B746BE                   : freedom, not price.

--X1bOJ3K7DJ5YkBrT
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="MedPlants.py.bz2"
Content-Transfer-Encoding: base64

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

--X1bOJ3K7DJ5YkBrT--