[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