[Checkins] SVN: gocept.zeoraid/trunk/src/gocept/zeoraid/ - turned FailingStorage into a FileStorage

Thomas Lotze tl at gocept.com
Tue Jan 15 07:23:12 EST 2008


Log message for revision 82893:
  - turned FailingStorage into a FileStorage
  - fixed all changes following this
  - test loadBefore
  

Changed:
  U   gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py
  U   gocept.zeoraid/trunk/src/gocept/zeoraid/tests/failingstorage.py
  U   gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py

-=-
Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py	2008-01-15 11:49:12 UTC (rev 82892)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py	2008-01-15 12:23:12 UTC (rev 82893)
@@ -169,7 +169,9 @@
     def history(self, oid, version='', size=1):
         """Return a sequence of history information dictionaries."""
         assert version is ''
-        return self._apply_single_storage('history', (oid, size))
+        return self._apply_single_storage(
+            'history', (oid, size),
+            allowed_exceptions=ZODB.POSException.POSKeyError)
 
     def isReadOnly(self):
         """Test whether a storage allows committing new transactions."""
@@ -188,12 +190,14 @@
     def load(self, oid, version=''):
         """Load data for an object id and version."""
         assert version is ''
-        return self._apply_single_storage('load', (oid,),
-                                          allowed_exceptions=KeyError)
+        return self._apply_single_storage(
+            'load', (oid,), allowed_exceptions=ZODB.POSException.POSKeyError)
 
     def loadBefore(self, oid, tid):
         """Load the object data written before a transaction id."""
-        return self._apply_single_storage('loadBefore', (oid, tid))
+        return self._apply_single_storage(
+            'loadBefore', (oid, tid),
+            allowed_exceptions=ZODB.POSException.POSKeyError)
 
     def loadSerial(self, oid, serial):
         """Load the object record for the give transaction id."""

Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/failingstorage.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/failingstorage.py	2008-01-15 11:49:12 UTC (rev 82892)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/failingstorage.py	2008-01-15 12:23:12 UTC (rev 82893)
@@ -4,9 +4,11 @@
 # $Id$
 """Unit test support."""
 
+import tempfile
+
 import ZODB.utils
 import ZODB.config
-import ZODB.MappingStorage
+import ZODB.FileStorage
 
 
 class Opener(ZODB.config.BaseConfig):
@@ -15,17 +17,26 @@
         return FailingStorage(self.name)
 
 
-class FailingStorage(ZODB.MappingStorage.MappingStorage):
+class FailingStorage(ZODB.FileStorage.FileStorage):
 
     _fail = None
 
+    def __init__(self, name):
+        self.name = name
+        file_handle, file_name = tempfile.mkstemp()
+        ZODB.FileStorage.FileStorage.__init__(self, file_name)
+
+    def close(self):
+        ZODB.FileStorage.FileStorage.close(self)
+        self.cleanup()
+
     def getExtensionMethods(self):
         return dict(fail=None)
 
     def history(self, *args, **kw):
         if 'history' == self._fail:
             raise Exception()
-        return ZODB.MappingStorage.MappingStorage.history(self, *args, **kw)
+        return ZODB.FileStorage.FileStorage.history(self, *args, **kw)
 
     def fail(self, method):
         if method in ['history']:

Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2008-01-15 11:49:12 UTC (rev 82892)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2008-01-15 12:23:12 UTC (rev 82893)
@@ -181,9 +181,9 @@
         self.assertEquals(True, self._storage.closed)
 
     def test_getsize(self):
-        self.assertEquals(32, self._backend(0).getSize())
-        self.assertEquals(32, self._backend(1).getSize())
-        self.assertEquals(32, self._storage.getSize())
+        self.assertEquals(4, self._backend(0).getSize())
+        self.assertEquals(4, self._backend(1).getSize())
+        self.assertEquals(4, self._storage.getSize())
         self._storage.close()
         self.assertRaises(gocept.zeoraid.interfaces.RAIDClosedError,
                           self._storage.getSize)
@@ -193,25 +193,51 @@
         # This doesn't get noticed because ClientStorage already knows
         # the answer and caches it. Therefore calling getSize can never
         # degrade or fail a RAID.
-        self.assertEquals(32, self._storage.getSize())
+        self.assertEquals(4, self._storage.getSize())
         self.assertEquals('optimal', self._storage.raid_status())
 
         self._backend(1).fail('getSize')
-        self.assertEquals(32, self._storage.getSize())
+        self.assertEquals(4, self._storage.getSize())
         self.assertEquals('optimal', self._storage.raid_status())
 
     def test_history(self):
-        self.assertEquals((), self._backend(0).history(ZODB.utils.z64, ''))
-        self.assertEquals((), self._backend(1).history(ZODB.utils.z64, ''))
-        self.assertEquals((), self._storage.history(ZODB.utils.z64, ''))
+        oid = self._storage.new_oid()
+        self.assertRaises(ZODB.POSException.POSKeyError,
+                          self._backend(0).history, oid, '')
+        self.assertRaises(ZODB.POSException.POSKeyError,
+                          self._backend(1).history, oid, '')
+        self.assertRaises(ZODB.POSException.POSKeyError,
+                          self._storage.history, oid, '')
+        self.assertEquals('optimal', self._storage.raid_status())
 
+        self._dostore(oid=oid)
+        self.assertEquals(1, len(self._backend(0).history(oid, '')))
+        self.assertEquals(1, len(self._backend(1).history(oid, '')))
+        self.assertEquals(1, len(self._storage.history(oid, '')))
+
+        self._storage.raid_disable(self._storage.storages_optimal[0])
+        self.assertEquals(1, len(self._backend(0).history(oid, '')))
+        self.assertEquals(1, len(self._storage.history(oid, '')))
+
+        self._storage.raid_disable(self._storage.storages_optimal[0])
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.history, oid, '')
+
     def test_history_degrading(self):
+        oid = self._storage.new_oid()
+        self._dostore(oid=oid)
+        self.assertEquals(1, len(self._backend(0).history(oid, '')))
+        self.assertEquals(1, len(self._backend(1).history(oid, '')))
+        self.assertEquals(1, len(self._storage.history(oid, '')))
+
         self._backend(0).fail('history')
-        self.assertEquals((), self._storage.history(ZODB.utils.z64, ''))
+        self.assertEquals(1, len(self._storage.history(oid, '')))
+        self.assertEquals(1, len(self._backend(0).history(oid, '')))
         self.assertEquals('degraded', self._storage.raid_status())
+
         self._backend(0).fail('history')
         self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
-                          self._storage.history, ZODB.utils.z64, '')
+                          self._storage.history, oid, '')
         self.assertEquals('failed', self._storage.raid_status())
 
     def test_lastTransaction(self):
@@ -258,12 +284,11 @@
 
     def test_load_degrading1(self):
         oid = self._storage.new_oid()
-        # These KeyErrors should be POSKeyErrors by IStorage.
-        self.assertRaises(KeyError,
+        self.assertRaises(ZODB.POSException.POSKeyError,
                           self._storage.load, oid)
-        self.assertRaises(KeyError,
+        self.assertRaises(ZODB.POSException.POSKeyError,
                           self._backend(0).load, oid)
-        self.assertRaises(KeyError,
+        self.assertRaises(ZODB.POSException.POSKeyError,
                           self._backend(1).load, oid)
 
         self._dostore(oid=oid, revid='\x00\x00\x00\x00\x00\x00\x00\x01')
@@ -305,6 +330,64 @@
         self.assertEquals('failed', self._storage.raid_status())
 
 
+    def test_loadBefore_degrading1(self):
+        oid = self._storage.new_oid()
+        self.assertRaises(
+            ZODB.POSException.POSKeyError,
+            self._storage.loadBefore, oid, '\x00\x00\x00\x00\x00\x00\x00\x01')
+        self.assertRaises(
+            ZODB.POSException.POSKeyError,
+            self._backend(0).loadBefore,
+            oid, '\x00\x00\x00\x00\x00\x00\x00\x01')
+        self.assertRaises(
+            ZODB.POSException.POSKeyError,
+            self._backend(1).loadBefore,
+            oid, '\x00\x00\x00\x00\x00\x00\x00\x01')
+        self.assertEquals('optimal', self._storage.raid_status())
+
+        revid = self._dostoreNP(oid=oid, revid=None, data='foo')
+        revid2 = self._dostoreNP(oid=oid, revid=revid, data='bar')
+        data_record, serial, end_tid = self._storage.loadBefore(oid, revid2)
+        self.assertEquals('foo', data_record)
+        self.assertEquals((data_record, serial, end_tid),
+                          self._backend(0).loadBefore(oid, revid2))
+        self.assertEquals((data_record, serial, end_tid),
+                          self._backend(1).loadBefore(oid, revid2))
+
+        self._storage.raid_disable(self._storage.storages_optimal[0])
+        self.assertEquals((data_record, serial, end_tid),
+                          self._storage.loadBefore(oid, revid2))
+        self.assertEquals((data_record, serial, end_tid),
+                          self._backend(0).loadBefore(oid, revid2))
+
+        self._storage.raid_disable(self._storage.storages_optimal[0])
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.loadBefore, oid, revid2)
+
+    def test_loadBefore_degrading2(self):
+        oid = self._storage.new_oid()
+        revid = self._dostoreNP(oid=oid, revid=None, data='foo')
+        revid2 = self._dostoreNP(oid=oid, revid=revid, data='bar')
+        data_record, serial, end_tid = self._storage.loadBefore(oid, revid2)
+        self.assertEquals('foo', data_record)
+        self.assertEquals((data_record, serial, end_tid),
+                          self._backend(0).loadBefore(oid, revid2))
+        self.assertEquals((data_record, serial, end_tid),
+                          self._backend(1).loadBefore(oid, revid2))
+
+        self._backend(0).fail('loadBefore')
+        self.assertEquals((data_record, serial, end_tid),
+                          self._storage.loadBefore(oid, revid2))
+        self.assertEquals((data_record, serial, end_tid),
+                          self._backend(0).loadBefore(oid, revid2))
+        self.assertEquals('degraded', self._storage.raid_status())
+
+        self._backend(0).fail('loadBefore')
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.loadBefore, oid, revid2)
+        self.assertEquals('failed', self._storage.raid_status())
+
+
 class ZEOReplicationStorageTests(ZEOStorageBackendTests,
                                  ReplicationStorageTests,
                                  ThreadTests.ThreadTests):



More information about the Checkins mailing list