> On Wed, Jan 07, 2009 at 01:28:24PM -0000, kevin gill wrote: >> I am having a problem on my live site. The problem is todo with a >> DataBase >> connector object which ends up in an incorrect state: >> >> This is the important part of the traceback. >> >> File >> "/home/kevin/src/castingzone.tables/castingzone/tables/person/extraaccount_db.py", >> line 460, in IsValidUser >> result = self.execute('extraaccount.IsValidUser', >> self.IsValidUser.__doc__, **params) >> File >> "/home/kevin/src/castingzone.utility/castingzone/utility/db/db.py", >> line 125, in execute >> return queryForResults(connection, query) >> File >> "/home/kevin/src/castingzone.utility/castingzone/utility/db/db.py", >> line 28, in queryForResults >> cursor.execute(query) >> File >> "/srv/zope/hosting/castingzone/instance/hacks/psycopgda-1.0-py2.4.egg/psycopgda/adapter.py", >> line 417, in execute >> return ZopeCursor.execute(self, operation, parameters) >> File >> "/srv/zope/hosting/castingzone/eggs/zope.rdb-3.4.0-py2.4.egg/zope/rdb/__init__.py", >> line 261, in execute >> operation, parameters = self._prepareOperation(operation, >> parameters) >> File >> "/srv/zope/hosting/castingzone/eggs/zope.rdb-3.4.0-py2.4.egg/zope/rdb/__init__.py", >> line 278, in _prepareOperation >> encoding = self.connection.getTypeInfo().getEncoding() >> File >> "/srv/zope/hosting/castingzone/eggs/ZODB3-3.9.0_dev_r77011-py2.4-linux-i686.egg/ZODB/Connection.py", >> line 798, in setstate >> raise ConnectionStateError(msg) >> ConnectionStateError: Shouldn't load state for 0x1d54 when the >> connection >> is closed > > If I'm not mistaken, this error typically occurs when you try to hold a > reference to a Persistent object across transaction boundaries (e.g. by > storing it in a global). Don't do that. > > Sometimes this happens in unexpected places (e.g. having a schema with > an Object field that has a default value, and an edit form -- the > default value is never explicitly copied, so you may end up with > multiple references to it). I'm not saying this could be your problem; > I'm just trying to remind you that some globals may be difficult to > notice if you haven't been burned by them before. >
First thanks for the response. >> Once the server gets into this state, it seems to repeat often. >> >> The object in question is a database connection object. > > Are you talking about the persistent object with oid 0x1d54? The object class is known to me. It is a the postgres database adapter. I found this issue, which may cause the problem... I used to use a database adapter configured as a local utility. However, I changed to configuring it as a global utility because I need to access the database in some event subscribers and the event subscribers. I deleted the database adapter from my ++etc++site, but when I looked at the @@registrations.html view it was still there. I have removed the adapter using the @@registrations.html view and restarted. Unfortunately the problem takes some time to recur and I cannot replicate it in my test server, so I cannot be sure that this is a resolution. > >> I have just >> retrieved it via an adapter lookup. It is not stored. >> >> connection= zope.component.getUtility(IZopeDatabaseAdapter, >> CONNECTION_NAME, self.context)() >> >> The database connection is provided by a global utility. The important >> code is as follows: >> >> def connection_directive(_context, name=CONNECTION_NAME, >> connection_string='', encoding='latin-1'): >> """Process a db:Connection zcml directive""" >> >> # Don't delay to the end of the configuration process - >> gAdapter = PsycopgAdapter(connection_string) >> gAdapter.setEncoding(encoding) >> gAdapter.connect() >> provideUtility(gAdapter, IZopeDatabaseAdapter, name) > > This looks okay-ish to me (latin-1, yuck, is this the 20th century > still?). > I am in a parallel run. I can migrate to utf-8 only after I switch off the old system but I will - I need those euro symbols. >> Any help in narrowing down this problem would be greatly appreciated. It >> is making my live system unworkable. > > Start a debug console (zopectl debug or bin/debugzope), then take a look > at oid 0x1d54: > > >>> from ZODB.utils import p64 > >>> app.root()._p_jar.get(p64(0x1d54)) > > The interesting bit of information is the class name of that object. > Then look through the sources trying to determine the lifetime of that > object: where are references to it created? > That is just what I needed. Although I had removed a registration for the deleted object, your snippet showed me that the object was still in my ZODB. I eventually tracked down the object as a 'subscriber' to utilities in a local registry.... I deleted the object using... lsm = root['mysite'].getSiteManager() from zope.rdb.interfaces import IZopeDatabaseAdapter # Display the adapter (direct and indirect) print lsm.utilities._subscribers[0][IZopeDatabaseAdapter] print lsm.utilities.subscriptions((), IZopeDatabaseAdapter) import transaction transaction.begin() # this may not be necessary # Delete the adapter lsm.utilities.unsubscribe((), IZopeDatabaseAdapter) transaction.get().commit() # Verify that it is deleted lsm.utilities._subscribers[0][IZopeDatabaseAdapter] And now it is finally gone from ZODB. > Marius Gedminas > -- > I doubt, therefore I might be. > _______________________________________________ > Zope3-users mailing list > Zope3-users@zope.org > http://mail.zope.org/mailman/listinfo/zope3-users > _______________________________________________ Zope3-users mailing list Zope3-users@zope.org http://mail.zope.org/mailman/listinfo/zope3-users