[Checkins] SVN: Products.BTreeFolder2/trunk/ Added case for clean-up routine where the meta type index contains keys that are not in the tree.

Malthe Borch mborch at gmail.com
Mon Feb 20 21:43:52 UTC 2012


Log message for revision 124440:
  Added case for clean-up routine where the meta type index contains keys that are not in the tree.

Changed:
  U   Products.BTreeFolder2/trunk/CHANGES.txt
  U   Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/BTreeFolder2.py
  U   Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/tests/testBTreeFolder2.py

-=-
Modified: Products.BTreeFolder2/trunk/CHANGES.txt
===================================================================
--- Products.BTreeFolder2/trunk/CHANGES.txt	2012-02-20 14:50:33 UTC (rev 124439)
+++ Products.BTreeFolder2/trunk/CHANGES.txt	2012-02-20 21:43:51 UTC (rev 124440)
@@ -4,6 +4,8 @@
 2.13.5 (unreleased)
 -------------------
 
+- Added case for clean-up routine where the meta type index contains
+  keys that are not in the tree.
 
 2.13.4 (2011-12-12)
 -------------------

Modified: Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/BTreeFolder2.py
===================================================================
--- Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/BTreeFolder2.py	2012-02-20 14:50:33 UTC (rev 124439)
+++ Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/BTreeFolder2.py	2012-02-20 21:43:51 UTC (rev 124440)
@@ -175,6 +175,7 @@
                     raise AssertionError(
                         "Missing value for key: %s" % repr(key))
             check(self._mt_index)
+            keys = set(self._tree.keys())
             for key, value in self._mt_index.items():
                 if (key not in self._mt_index
                     or self._mt_index[key] is not value):
@@ -183,7 +184,7 @@
                         % repr(key))
                 check(value)
                 for k in value.keys():
-                    if k not in value:
+                    if k not in value or k not in keys:
                         raise AssertionError(
                             "Missing values for meta_type index: %s"
                             % repr(key))
@@ -193,10 +194,17 @@
                      exc_info=sys.exc_info())
             try:
                 self._tree = OOBTree(self._tree)
+                keys = set(self._tree.keys())
                 mt_index = OOBTree()
                 for key, value in self._mt_index.items():
+                    for name in tuple(value.keys()):
+                        if name not in keys:
+                            del value[name]
                     mt_index[key] = OIBTree(value)
                 self._mt_index = mt_index
+                new = len(keys)
+                if self._count() != new:
+                    self._count.set(new)
             except:
                 LOG.error('Failed to fix %s.' % path,
                     exc_info=sys.exc_info())

Modified: Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/tests/testBTreeFolder2.py
===================================================================
--- Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/tests/testBTreeFolder2.py	2012-02-20 14:50:33 UTC (rev 124439)
+++ Products.BTreeFolder2/trunk/src/Products/BTreeFolder2/tests/testBTreeFolder2.py	2012-02-20 21:43:51 UTC (rev 124440)
@@ -254,6 +254,12 @@
         self.assert_(not self.f._cleanup())
         # Now it's fixed.
         self.assert_(self.f._cleanup())
+
+        from BTrees.OIBTree import OIBTree
+        tree = self.f._mt_index['d'] = OIBTree()
+        tree['e'] = 1
+        self.assert_(not self.f._cleanup())
+
         # Verify the management interface also works,
         # but don't test return values.
         self.f.manage_cleanup()



More information about the checkins mailing list