[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