Hi all,

In a system using Zope 2.11 and ZODB 3.7.0b3 I'm having a problem with
old transaction records containing pickle data that fails on
cPickle.Unpickler.noload as employed by ZODB.serialize.referencesf, I
get an AttributeError from inside the cPickle module:

def referencesf(p, oids=None):
    """Return a list of object ids found in a pickle

    A list may be passed in, in which case, information is
    appended to it.

    Weak references are not included.
    """

    refs = []
    u = cPickle.Unpickler(cStringIO.StringIO(p))
    u.persistent_load = refs
    u.noload()
    u.noload()

    # Now we have a list of referencs.  Need to convert to list of
    # oids:
<snip>

The noload failure means I cannot pack the database right now. Since
only historical transactions contain the problematic attribute and I
don't care about those anymore I have introduced a simple change locally
that ignores the failure:

def referencesf(p, oids=None):
    """Return a list of object ids found in a pickle

    A list may be passed in, in which case, information is
    appended to it.

    Weak references are not included.
    """

    refs = []
    u = cPickle.Unpickler(cStringIO.StringIO(p))
    u.persistent_load = refs
    try:
        u.noload()
        u.noload()
    except AttributeError:
        pass

    # Now we have a list of referencs.  Need to convert to list of
    # oids:
<snip>

With this change I can pack the database and a few simple check
(fsrefs.py etc) indicate the database is consistent after the pack.

My question: Is there any risk associated with ignoring the failure
during packing? The latest object versions for the persistent objects in
question do not have the problematic attribute anymore, so the latest
records are "safe" and will not cause the AttributeError, anyway.

jens

_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zodb-dev

Reply via email to