Thanks Martijn,

I'll try to dump the pickle, and see what I can find out.

I'm still puzzled how this/what was pickled in the first place.

On 31.01.2012, at 14:39, Martijn Pieters wrote:

> On Tue, Jan 31, 2012 at 14:20, Kaweh Kazemi <ka...@me.com> wrote:
>> I did the change and here we go:
> 
> Right, that's a ZEO bug report right there then; my change should go
> into ZEO trunk. Jim, did you catch it?
> 
>> I have one assumption - seeing this traceback - but I can't prove if it's 
>> correct: one "old" object (which is candidate to be removed) in the users 
>> storage is referencing an object in a different storage (we are using 
>> multiple databases) which has been packed away previously. Generally that 
>> shouldn't happen, but maybe we have wrongly deleted objects from the second 
>> storage and packed it previously.
> 
> I think the assumption is incorrect; the method referencesf has the
> following docstring:
> 
>    """Return a list of object ids found in a pickle
> 
>    A list may be passed in, in which case, information is
>    appended to it.
> 
>    Only ordinary internal references are included.
>    Weak and multi-database references are not included.
>    """
> 
> Note that weak and multi-database refs are ignored here.
> 
> A unhashable type error generally means you are trying to use a list
> (a mutable, thus unhashable type) as a key in a dictionary. So, in
> this case it is trying to load a pickle record that shouldn't be
> physically possible in Python; one where a list is used as a key in a
> dict.
> 
> I am a little at a loss on how to continue from here. You could rig
> the .unload() calls in referencesf (in ZODB/serialize) with a try:
> except TypeError handler:
> 
>    u.persistent_load = refs
>    try:
>        u.noload()
>        u.noload()
>    except TypeError:
>        pass
> 
> That'll result in a shorter references list, and thus the risk that
> too many records will be garbage collected. If you are lucky, the type
> error is at the end of the pickle and thus not many references will be
> missed, and/or the missed references point to objects that are about
> to be packed away anyway.
> 
> Alternatively, you could dump the pickle in question (variable p) to a
> file instead of passing:
> 
>    except TypeError:
>        open('/tmp/b0rkenpickle', 'wb').write(p)
>        raise
> 
> Then upload that pickle somewhere for people on this list to analyze.
> I cannot promise anyone will, of course, but if someone could and the
> pickle is shown to only contain primitive data types (no references at
> all) then the pass is certainly going to solve your problem.
> 
> -- 
> Martijn Pieters

_______________________________________________
For more information about ZODB, see http://zodb.org/

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

Reply via email to