[Zope] help debugging a "can't pickle" error deep within a catalog reindex

Rob Miller ra at burningman.com
Tue Jun 17 18:47:53 EDT 2008


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.

i CAN verify that the instancemethod that is causing the problem renders like 
this:

<bound method SessionDataManager.getSessionData of <SessionDataManager at 
/session_data_manager>>

even that hasn't proven enough for me to concretely identify the source of the 
problem, though.

i've been working on this for a full day already, and am not sure how to 
proceed.  does anyone have any debugging tips that might help me figure out 
what, exactly, is causing the reindex attempts to blow up?

thanks!

-r




Traceback (most recent call last):
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/Products/ZCatalog/ZCatalog.py", 
line 296, in refreshCatalog
     self.catalog_object(obj, p, pghandler=pghandler)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/zope/Products/CMFPlone/CatalogTool.py", 
line 367, in catalog_object
     self._increment_counter()
   File 
"/home/rob/topp/14000/builds/20080611/opencore/zope/Products/CMFPlone/CatalogTool.py", 
line 395, in _increment_counter
     self._counter.change(1)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/BTrees/Length.py", 
line 55, in change
     self.value += delta
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZODB/Connection.py", 
line 890, in register
     self._register(obj)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZODB/Connection.py", 
line 900, in _register
     self.transaction_manager.get().join(self)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/transaction/_transaction.py", 
line 273, in join
     self._prior_operation_failed() # doesn't return
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/transaction/_transaction.py", 
line 267, in _prior_operation_failed
     raise TransactionFailedError("An operation previously failed, "
TransactionFailedError: An operation previously failed, with traceback:

   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZServer/PubCore/ZServerPublisher.py", 
line 25, in __init__
     response=b)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZPublisher/Publish.py", 
line 401, in publish_module
     environ, debug, request, response)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZPublisher/Publish.py", 
line 202, in publish_module_standard
     response = publish(request, module_name, after_list, debug=debug)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZPublisher/Publish.py", 
line 119, in publish
     request, bind=1)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZPublisher/mapply.py", 
line 88, in mapply
     if debug is not None: return debug(object,args,context)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZPublisher/Publish.py", 
line 42, in call_object
     result=apply(object,args) # Type s<cr> to step into published object.
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/Products/ZCatalog/ZCatalog.py", 
line 260, in manage_catalogReindex
     self.refreshCatalog(clear=1, pghandler=handler)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/Products/ZCatalog/ZCatalog.py", 
line 296, in refreshCatalog
     self.catalog_object(obj, p, pghandler=pghandler)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/zope/Products/CMFPlone/CatalogTool.py", 
line 385, in catalog_object
     update_metadata, pghandler=pghandler)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/zope/Products/CacheSetup/patch.py", 
line 96, in catalog_object
     uid, idxs, update_metadata, pghandler)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/zope/Products/CacheSetup/patch_utils.py", 
line 6, in call
     return getattr(self, PATTERN % __name__)(*args, **kw)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/Products/ZCatalog/ZCatalog.py", 
line 560, in catalog_object
     transaction.savepoint(optimistic=True)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/transaction/_manager.py", 
line 110, in savepoint
     return self.get().savepoint(optimistic)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/transaction/_transaction.py", 
line 312, in savepoint
     self._saveAndRaiseCommitishError() # reraises!
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/transaction/_transaction.py", 
line 422, in _saveAndRaiseCommitishError
     t, v, tb = self._saveAndGetCommitishError()
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/transaction/_transaction.py", 
line 309, in savepoint
     savepoint = Savepoint(self, optimistic, *self._resources)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/transaction/_transaction.py", 
line 737, in __init__
     savepoint = savepoint()
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZODB/Connection.py", 
line 1046, in savepoint
     self._commit(None)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZODB/Connection.py", 
line 555, in _commit
     self._store_objects(ObjectWriter(obj), transaction)
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZODB/Connection.py", 
line 582, in _store_objects
     p = writer.serialize(obj)  # This calls __getstate__ of obj
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZODB/serialize.py", 
line 407, in serialize
     return self._dump(meta, obj.__getstate__())
   File 
"/home/rob/topp/14000/builds/20080611/opencore/lib/zope/lib/python/ZODB/serialize.py", 
line 416, in _dump
     self._p.dump(state)
   File "copy_reg.py", line 69, in _reduce_ex
     raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle instancemethod objects



More information about the Zope mailing list