[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