[Zope] Re: help debugging a "can't pickle" error deep within a
catalog reindex
Rob Miller
ra at burningman.com
Tue Jun 24 13:54:41 EDT 2008
Rob Miller wrote:
> hi,
>
> i'm trying to perform a ZCatalog.refreshCatalog() on a catalog with over
> 29,000 indexed objects. it churns for a good long time, and eventually
> fails with a long set of tracebacks, of which i've included a sample at
> the end of this message.
>
> i think i understand the gist of the issue... it's trying to write an
> object (probably a CatalogBrain) to the database, but this object's
> __dict__ contains a value that is of type instancemethod, which isn't
> allowed for persistent objects.
>
> the problem is that i can't figure out which specific objects are
> causing the problem. i've used pdb.post_mortem to get a debug prompt
> way down in the traceback, but the code goes in and out of C modules, so
> i'm missing a lot of what's happening. and when i interactively peek at
> the objects that are being indexed when the error happens, there doesn't
> seem to be anything wrong, and i can index the objects w/ no problem.
> i've even tried dropping the subtransaction threshold down to 1, so it
> will try to commit a savepoint after every object, but none of the
> objects being indexed seemed to have any problems.
okay, after leaving this for a few days, i came back to it and managed to work
it out. for posterity's sake, what ended up working was that i added an
explicit transaction.commit() after every object reindex, wrapped in a try:
except, like so:
--- src/Zope/lib/python/Products/ZCatalog/ZCatalog.py 2007-10-29
06:09:30.000000000 -0700
+++ lib/zope/lib/python/Products/ZCatalog/ZCatalog.py 2008-06-24
10:47:49.000000000 -0700
@@ -294,6 +294,11 @@
if obj is not None:
try:
self.catalog_object(obj, p, pghandler=pghandler)
+ try:
+ transaction.commit()
+ except:
+ import sys, pdb
+ pdb.post_mortem(sys.exc_info()[2])
except ConflictError:
raise
except:
this made the reindex take a ridiculously long time, and it leaves the catalog
in an inconsistent state (i.e. it should only be done on a copy of the
database, one that you can throw away), but it did in the end reveal to me
which record was causing the problem.
the problematic record ended up being a ghosted catalog entry that happened to
share the same name as a view. when the catalog tried to look up the object
by its path (via unrestrictedTraverse), the view object was returned.
thanks for the help!
-r
More information about the Zope
mailing list