[Checkins] SVN: gocept.zeoraid/trunk/src/gocept/zeoraid/ Provide degradation test coverage for undo functions.

Christian Theune ct at gocept.com
Wed Jan 30 07:23:47 EST 2008


Log message for revision 83312:
  Provide degradation test coverage for undo functions.
  

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-30 06:55:51 UTC (rev 83311)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py	2008-01-30 12:23:46 UTC (rev 83312)
@@ -402,9 +402,9 @@
         """
         return True
 
-    # XXX
     @ensure_writable
     def undo(self, transaction_id, transaction):
+        """Undo a transaction identified by id."""
         self._write_lock.acquire()
         try:
             return self._apply_all_storages('undo',
@@ -412,12 +412,12 @@
         finally:
             self._write_lock.release()
 
-    # XXX
     def undoLog(self, first=0, last=-20, filter=None):
+        """Return a sequence of descriptions for undoable transactions."""
         return self._apply_single_storage('undoLog', (first, last, filter))
 
-    # XXX
     def undoInfo(self, first=0, last=-20, specification=None):
+        """Return a sequence of descriptions for undoable transactions."""
         return self._apply_single_storage('undoInfo',
                                           (first, last, specification))
 

Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/failingstorage.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/failingstorage.py	2008-01-30 06:55:51 UTC (rev 83311)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/failingstorage.py	2008-01-30 12:23:46 UTC (rev 83312)
@@ -61,7 +61,8 @@
     # Create a set of stub methods that have to be made to fail but are set as
     # non-data descriptors on the proxy object.
     __stub_methods__ = ['history', 'loadSerial', 'close', 'getSize', 'pack',
-                        'tpc_abort', 'tpc_finish', 'storeBlob', 'loadBlob']
+                        'tpc_abort', 'tpc_finish', 'storeBlob', 'loadBlob',
+                        'undo']
     for name in __stub_methods__:
         method = zope.proxy.non_overridable(failing_method(name))
         locals()[name] = method

Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2008-01-30 06:55:51 UTC (rev 83311)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2008-01-30 12:23:46 UTC (rev 83312)
@@ -829,7 +829,130 @@
     def test_supportsUndo(self):
         self.assertEquals(True, self._storage.supportsUndo())
 
+    def test_undo_degrading1(self):
+        oid = self._storage.new_oid()
+        revid = self._dostoreNP(oid, data='23')
+        revid = self._dostoreNP(oid, revid=revid, data='24')
+        revid = self._dostoreNP(oid, revid=revid, data='25')
 
+        obj = self._storage.load(oid, '')
+        self.assertEquals('25', obj[0])
+
+        # First try: undo with one disabled storage
+        info = self._storage.undoInfo()
+        t = transaction.Transaction()
+        self._storage.tpc_begin(t)
+        self._disable_storage(0)
+        self._storage.undo(info[0]['id'], t)
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
+
+        # Second try: undo with both storages disabled
+        info = self._storage.undoInfo()
+        t = transaction.Transaction()
+        self._storage.tpc_begin(t)
+        self._disable_storage(0)
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.undo,
+                          info[2]['id'], t)
+
+    def test_undo_degrading2(self):
+        oid = self._storage.new_oid()
+        revid = self._dostoreNP(oid, data='23')
+        revid = self._dostoreNP(oid, revid=revid, data='24')
+        revid = self._dostoreNP(oid, revid=revid, data='25')
+
+        obj = self._storage.load(oid, '')
+        self.assertEquals('25', obj[0])
+
+        # First try: undo with one disabled storage
+        info = self._storage.undoInfo()
+        t = transaction.Transaction()
+        self._storage.tpc_begin(t)
+        self._backend(0).fail('undo')
+        self._storage.undo(info[0]['id'], t)
+        self.assertEquals('degraded', self._storage.raid_status())
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
+
+        # Second try: undo with both storages disabled
+        info = self._storage.undoInfo()
+        t = transaction.Transaction()
+        self._storage.tpc_begin(t)
+        self._backend(0).fail('undo')
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.undo,
+                          info[2]['id'], t)
+        self.assertEquals('failed', self._storage.raid_status())
+
+    def test_undoLog_degrading1(self):
+        oid = self._storage.new_oid()
+        revid = self._dostoreNP(oid, data='23')
+        revid = self._dostoreNP(oid, revid=revid, data='24')
+
+        obj = self._storage.load(oid, '')
+        self.assertEquals('24', obj[0])
+
+        self._disable_storage(0)
+        info = self._storage.undoLog()
+        self.assertEquals(2, len(info))
+
+        self._disable_storage(0)
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.undoLog)
+
+    def test_undoLog_degrading2(self):
+        oid = self._storage.new_oid()
+        revid = self._dostoreNP(oid, data='23')
+        revid = self._dostoreNP(oid, revid=revid, data='24')
+
+        obj = self._storage.load(oid, '')
+        self.assertEquals('24', obj[0])
+
+        self._backend(0).fail('undoLog')
+        info = self._storage.undoLog()
+        self.assertEquals('degraded', self._storage.raid_status())
+        self.assertEquals(2, len(info))
+
+        self._backend(0).fail('undoLog')
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.undoLog)
+        self.assertEquals('failed', self._storage.raid_status())
+
+    def test_undoInfo_degrading1(self):
+        oid = self._storage.new_oid()
+        revid = self._dostoreNP(oid, data='23')
+        revid = self._dostoreNP(oid, revid=revid, data='24')
+
+        obj = self._storage.load(oid, '')
+        self.assertEquals('24', obj[0])
+
+        self._disable_storage(0)
+        info = self._storage.undoInfo()
+        self.assertEquals(2, len(info))
+
+        self._disable_storage(0)
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.undoInfo)
+
+    def test_undoInfo_degrading2(self):
+        oid = self._storage.new_oid()
+        revid = self._dostoreNP(oid, data='23')
+        revid = self._dostoreNP(oid, revid=revid, data='24')
+
+        obj = self._storage.load(oid, '')
+        self.assertEquals('24', obj[0])
+
+        self._backend(0).fail('undoInfo')
+        info = self._storage.undoInfo()
+        self.assertEquals('degraded', self._storage.raid_status())
+        self.assertEquals(2, len(info))
+
+        self._backend(0).fail('undoInfo')
+        self.assertRaises(gocept.zeoraid.interfaces.RAIDError,
+                          self._storage.undoInfo)
+        self.assertEquals('failed', self._storage.raid_status())
+
 class ZEOReplicationStorageTests(ZEOStorageBackendTests,
                                  ReplicationStorageTests,
                                  ThreadTests.ThreadTests):



More information about the Checkins mailing list