[Zope] Re: Error unpickling when packing Data.fs (WAS packing with zeo error)

Felix Ulrich-Oltean felix at chaptereight.com
Wed May 26 05:29:24 EDT 2004


Dieter Maurer <dieter at handshake.de> writes:
> Felix Ulrich-Oltean wrote at 2004-5-13 17:23 +0100:
> >$ ./packstorage.py
> >Traceback (most recent call last):
> >  File "./packstorage.py", line 9, in ?
> >    cs.pack(wait=1, days=2.0)
> >  File "/web/zope-2.7.0/lib/python/ZEO/ClientStorage.py", line 815, in pack
> >    return self._server.pack(t, wait)
> >  File "/web/zope-2.7.0/lib/python/ZEO/ServerStub.py", line 79, in pack
> >    self.rpc.call('pack', t, wait)
> >  File "/web/zope-2.7.0/lib/python/ZEO/zrpc/connection.py", line 372, in call
> >    raise inst # error raised by server
> >ValueError: Error unpickling, (( GOBBLEDEEHOOK SPAT OUT HERE ))
> 
> Thus, this exception occured in the ZEO server.
> 
> Copy your "Data.fs" and pack the copy directly (open it
> as a "FileStorage" and call "DB.pack(...)") in an interactive
> interpreter. Use "pdb.pm()" ("postmortem") to analyse the state
> that laid to this error. You will learn at least the class
> and the oid of the broken object.
> 
> Probably, you will also see the parent. This is your handle
> to delete the broken object.
> 

Dieter

Thanks very much for your pointers.  I have copied the Data.fs, and
packed it in an interactive python session, with:

fs = FileStorage('Data.fs.bak-20040512')
db = ZODB.DB(fs)
db.pack(days = 14.0)

The stack trace I get has unreadable stuff towards the end:

>>> db.pack(days = 14.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/local/zope/lib/python/ZODB/DB.py", line 528, in pack
    try: self._storage.pack(t,referencesf)
  File "/usr/local/zope/lib/python/ZODB/FileStorage.py", line 1557, in pack
    opos = p.pack()
  File "/usr/local/zope/lib/python/ZODB/fspack.py", line 698, in pack
    self.gc.findReachable()
  File "/usr/local/zope/lib/python/ZODB/fspack.py", line 454, in findReachable
    self.findReachableAtPacktime([z64])
  File "/usr/local/zope/lib/python/ZODB/fspack.py", line 529, in findReachableAtPacktime
    todo.extend(self.findrefs(pos))
  File "/usr/local/zope/lib/python/ZODB/fspack.py", line 602, in findrefs
    return referencesf(self._file.read(dh.plen))
  File "/usr/local/zope/lib/python/ZODB/referencesf.py", line 38, in referencesf
    raise ValueError, 'Error unpickling, %s' % p
ValueError: Error unpickling, ((UBT%G⎼␊␊⎽%@.IOBT%G⎼␊␊%@
-------------- next part --------------
─IOB┤デ
-------------- next part --------------

-------------- next part --------------
ダ┐デ
-------------- next part --------------

-------------- next part --------------
ダ├─├─N├.((J
-------------- next part --------------
ý
-------------- next part --------------
┴
-------------- next part --------------
ýUOý ýýZýý ýý?ýýZýýý ýýý\ý"ýVý%G⎼%@ýý@ýýý#ý%G⎼%@Zý\ýVýýýAýýýýýBýýCýýý
-------------- next part --------------
▒
-------------- next part --------------

-------------- next part --------------
─J
-------------- next part --------------
ý
-------------- next part --------------
┴
-------------- next part --------------
ýUOý!ýýZýý!ýý?ýýZýýý!ýýý\ý"ýVý%G⎼%@ýý@ýýý#ý%G⎼%@Zý\ýVýýýAýýýBýýCýýý
-------------- next part --------------
▒
-------------- next part --------------

-------------- next part --------------
─J
-------------- next part --------------
ý
-------------- next part --------------
┴
-------------- next part --------------
ýUOý$ýýZýý$ýý?ýýZýýý$ýýý\ý"ýVý%G⎼%@ýý@ýýý#ý%G⎼%@Zý\ýVýýýAýýýýýBýýCýýý
-------------- next part --------------
▒
-------------- next part --------------

-------------- next part --------------
─J
-------------- next part --------------
ý
-------------- next part --------------
┴
-------------- next part --------------
ýU*ýýýýý·ý

I've then run pdb.pm() as you suggested, but I'm not sure how to
proceed from here.  I've got the stack trace again, this time with the
w(here) command in pdb, and I get different nonsense at the end:

(Pdb) w
  <stdin>(1)?()
  /usr/local/zope/lib/python/ZODB/DB.py(531)pack()
-> raise
  /usr/local/zope/lib/python/ZODB/FileStorage.py(1587)pack()
-> self._lock_release()
  /usr/local/zope/lib/python/ZODB/fspack.py(698)pack()
-> self.gc.findReachable()
  /usr/local/zope/lib/python/ZODB/fspack.py(454)findReachable()
-> self.findReachableAtPacktime([z64])
  /usr/local/zope/lib/python/ZODB/fspack.py(529)findReachableAtPacktime()
-> todo.extend(self.findrefs(pos))
  /usr/local/zope/lib/python/ZODB/fspack.py(602)findrefs()
-> return referencesf(self._file.read(dh.plen))
> /usr/local/zope/lib/python/ZODB/referencesf.py(38)referencesf()
-> raise ValueError, 'Error unpickling, %s' % p


I tried printing the value of p and got:

(Pdb) p p
'((U\x0eBTrees.IOBTreeq\x01U\x08IOBucketq\x02tq\x03Nt.((J\xb7v\x15\xecUO\xc1 \xaa\x8eZ\x85\xc1 \xaa\x95?\x85\x8eZ\x85\xaf\xc1 \x84\x85\x8a\\\x95"\x93V\x81r\x89\x95@\x8a\xb7\x81#\x81r\xc4\x8cZ\x8a\\\x93V\x89\xa7\x95A\x82\x8f\x84\x85\x82\xc4\x95B\x82\x95C\x8a\x8b\x83a\x95D\x8a\x93\x94\x8a~\x95E\xd3\x8a\x8d+\xcc\x84\x85q\x04J\xb9v\x15\xecUO\xc1!\xaa\x8eZ\x85\xc1!\xaa\x95?\x85\x8eZ\x85\xaf\xc1!\x84\x85\x8a\\\x95"\x93V\x81r\x89\x95@\x8a\xb7\x81#\x81r\xc4\x8cZ\x8a\\\x93V\x89\xa7\x95A\x82\x8f\x84\x85\x82\xc4\x95B\x82\x95C\x8a\x8b\x83a\x95D\x8a\x93\x94\x8a~\x95E\xd3\x8a\x8d+\xcc\x84\x85q\x05J\xbbv\x15\xecUO\xc1$\xaa\x8eZ\x85\xc1$\xaa\x95?\x85\x8eZ\x85\xaf\xc1$\x84\x85\x8a\\\x95"\x93V\x81r\x89\x95@\x8a\xb7\x81#\x81r\xc4\x8cZ\x8a\\\x93V\x89\xa7\x95A\x82\x8f\x84\x85\x82\xc4\x95B\x82\x95C\x8a\x8b\x83a\x95D\x8a\x93\x94\x8a~\x95E\xd3\x8a\x8d+\xcc\x84\x85q\x06J\xbcv\x15\xecU*\x86\x13\x84\xff\x86\x8a~\x83'

What is this stuff?  How can I get the offending object and parent
from this?

Thanks,

Felix.


More information about the Zope mailing list