While doing a 'pack' on a Zope instance that is using multiple
databases, a KeyError 'n' happened. Upon investigation, we found out
that the 'oid_loaders' dictionary used by 'referencesf' (in
ZODB.serialize), which is in turn used by pack (presumably to find the
oids referenced by an object), doesn't have a loader registered for
'n'.

A reference_type of 'n' means:

   'n'
       Multi-database simple object reference.  The arguments consist
       of a databaase name, and an object id.

The ObjectReader class defined a few lines above 'referencesf' *does*
know how to load a multi-database simple object reference.

Now my question is, should 'referencesf' load those multi-database
references, or should they be treated just like the 'weak references',
by returning None, or should something else happen? Or maybe that
reference shouldn't be there in the first place?

This problem is preventing us from packing a database. It just falls
dead with the KeyError 'n' when packing.

You can find the traceback below.

2007-03-29T19:41:38 ERROR ZEO.zrpc (2822) Error raised in delayed method
Traceback (most recent call last):
 File "/usr/local/zope/fabricio/zserver296/lib/python/ZEO/StorageServer.py",
line 1009, in run
   result = self._method(*self._args)
 File "/usr/local/zope/fabricio/zserver296/lib/python/ZEO/StorageServer.py",
line 345, in _pack_impl
   self.storage.pack(time, referencesf)
 File 
"/usr/local/zope/fabricio/zserver296/lib/python/ZODB/FileStorage/FileStorage.py",
line 1348, in pack
   opos = p.pack()
 File 
"/usr/local/zope/fabricio/zserver296/lib/python/ZODB/FileStorage/fspack.py",
line 482, in pack
   self.gc.findReachable()
 File 
"/usr/local/zope/fabricio/zserver296/lib/python/ZODB/FileStorage/fspack.py",
line 228, in findReachable
   self.findReachableAtPacktime([z64])
 File 
"/usr/local/zope/fabricio/zserver296/lib/python/ZODB/FileStorage/fspack.py",
line 304, in findReachableAtPacktime
   todo.extend(self.findrefs(pos))
 File 
"/usr/local/zope/fabricio/zserver296/lib/python/ZODB/FileStorage/fspack.py",
line 377, in findrefs
   return referencesf(self._file.read(dh.plen))
 File "/usr/local/zope/fabricio/zserver296/lib/python/ZODB/serialize.py",
line 647, in referencesf
   oid = oid_loaders[reference_type](*args)


--
Sidnei da Silva
Enfold Systems                http://enfoldsystems.com
Fax +1 832 201 8856     Office +1 713 942 2377 Ext 214
_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

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

Reply via email to