[various fsrefs.py failures in Zope 2.9.3]

I can reproduce this on the Zope 2.9 branch, but not on the 2.8 branch.

I'll note that it can be reproduced easily with a standalone ZODB 3.6 too:

import ZODB
import ZODB.FileStorage
import transaction
from BTrees.OOBTree import OOBTree

st = ZODB.FileStorage.FileStorage("Data.fs")
db = ZODB.DB(st)
cn = db.open()
rt = cn.root()

rt["tree"] = OOBTree()

Run that, and then:

$ python24\python.exe src\scripts\fsrefs.py Data.fs
oid 0x0L persistent.mapping.PersistentMapping
last updated: 2006-07-27 01:37:35.342000, tid=0x36715E196CAE377L
refers to invalid object:
       oid ('\x00\x00\x00\x00\x00\x00\x00\x01', None) missing: '<unknown>'

My *guess* is that this represents a failure in the fsrefs script, since
the appserver is functioning properly.  Perhaps it has not been updated
to deal with the API changes between ZODB 3.4.x and ZODB 3.6.x?  The
delta between the two is pretty small::

I expect it was actually the /entire/ checkin that made that change to


That moved and changed the crucial get_refs() function used by
fsrefs.py too.  Unfortunately, I don't believe there are any tests for
fsrefs, and I bet it's been broken ever since that checkin.

This code in fsrefs.py doesn't make sense now:

           ref, klass = info
           if klass is None:
               # failed to unpack
               ref = info
               klass = '<unknown>'

The "failed to unpack" comment is left over from before that checkin,
where it did make sense.  The "ref = info" after it appears to be dead
wrong.  Try this patch?:

Index: src/scripts/fsrefs.py
--- src/scripts/fsrefs.py       (revision 69267)
+++ src/scripts/fsrefs.py       (working copy)
@@ -129,11 +129,8 @@
        data, serial = fs.load(oid, "")
        refs = get_refs(data)
        missing = [] # contains 3-tuples of oid, klass-metadata, reason
-        for info in refs:
-            ref, klass = info
+        for ref, klass in refs:
            if klass is None:
-                # failed to unpack
-                ref = info
                klass = '<unknown>'
            if ref not in fs._index:
                missing.append((ref, klass, "missing"))
For more information about ZODB, see the ZODB Wiki:

ZODB-Dev mailing list  -  ZODB-Dev@zope.org

Reply via email to