[Checkins] SVN: gocept.zeoraid/trunk/src/gocept/zeoraid/ added
recovery tests
Thomas Lotze
tl at gocept.com
Tue Feb 19 09:12:57 EST 2008
Log message for revision 84056:
added recovery tests
Changed:
U gocept.zeoraid/trunk/src/gocept/zeoraid/recovery.py
U gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_recovery.py
-=-
Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/recovery.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/recovery.py 2008-02-19 13:28:04 UTC (rev 84055)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/recovery.py 2008-02-19 14:12:56 UTC (rev 84056)
@@ -31,8 +31,16 @@
class Recovery(object):
- """Online storage recovery."""
+ """Online storage recovery.
+ Environmental requirements:
+
+ - The source storage must not be packed during recovery.
+
+ - The target storage must not be committed to.
+
+ """
+
def __init__(self, source, target, finalize):
self.source = source
self.target = target
@@ -99,6 +107,6 @@
self.target.tpc_vote(txn_info)
self.target.tpc_finish(txn_info)
- yield ('restore', txn_info.tid)
+ yield ('recover', txn_info.tid)
yield ('recovered',)
Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_recovery.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_recovery.py 2008-02-19 13:28:04 UTC (rev 84055)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_recovery.py 2008-02-19 14:12:56 UTC (rev 84056)
@@ -15,6 +15,8 @@
import unittest
import tempfile
+import threading
+import time
import transaction
import ZODB.FileStorage
@@ -56,6 +58,12 @@
raise
return tid
+ def compare(self, source, target):
+ recovery = gocept.zeoraid.recovery.Recovery(
+ source, target, lambda target: None)
+ protocol = list(recovery())
+ self.assertEquals([('verified',), ('recovered',)], protocol[-2:])
+
def setUp(self):
self.source = ZODB.FileStorage.FileStorage(tempfile.mktemp())
self.target = ZODB.FileStorage.FileStorage(tempfile.mktemp())
@@ -127,7 +135,82 @@
recovery = self.recovery()
self.assertRaises(ValueError, recovery.next)
+ def test_recover_already_uptodate(self):
+ self.store([self.source, self.target])
+ recovery = self.recovery()
+ self.assertEquals('verify', recovery.next()[0])
+ self.assertEquals('verified', recovery.next()[0])
+ self.assertEquals('recovered', recovery.next()[0])
+ def test_recover_simple(self):
+ self.store([self.source, self.target])
+ self.store([self.source])
+ recovery = self.recovery()
+ self.assertEquals('verify', recovery.next()[0])
+ self.assertEquals('verified', recovery.next()[0])
+ self.assertEquals('recover', recovery.next()[0])
+ self.assertEquals('recovered', recovery.next()[0])
+ self.compare(self.source, self.target)
+
+ def test_recover_growing(self):
+ self.store([self.source, self.target])
+ self.store([self.source])
+ recovery = self.recovery()
+ self.store([self.source])
+ self.assertEquals('verify', recovery.next()[0])
+ self.store([self.source])
+ self.assertEquals('verified', recovery.next()[0])
+ for i in xrange(10):
+ self.store([self.source])
+ self.assertEquals('recover', recovery.next()[0])
+ self.assertEquals('recover', recovery.next()[0])
+ self.assertEquals('recover', recovery.next()[0])
+ self.assertEquals('recover', recovery.next()[0])
+ self.assertEquals('recovered', recovery.next()[0])
+ self.compare(self.source, self.target)
+
+ def test_recover_finalize_already_uptodate(self):
+ self.store([self.source, self.target])
+ self.finalized = False
+
+ def finalize(target):
+ self.finalized = True
+
+ recovery = gocept.zeoraid.recovery.Recovery(
+ self.source, self.target, finalize)()
+ self.assertEquals('verify', recovery.next()[0])
+ self.assertEquals('verified', recovery.next()[0])
+ self.assertEquals('recovered', recovery.next()[0])
+ self.assertEquals(True, self.finalized)
+
+ def test_recover_no_commit_during_finalize(self):
+ self.store([self.source, self.target])
+ self.store([self.source])
+ self.got_commit_lock = None
+
+ def try_commit():
+ t = transaction.Transaction()
+ self.got_commit_lock = False
+ self.source.tpc_begin(t)
+ self.got_commit_lock = True
+ self.source.tpc_abort(t)
+
+ def finalize_check_no_commit(target):
+ self.thread = threading.Thread(target=try_commit)
+ self.thread.start()
+ time.sleep(1)
+ self.assertEquals(False, self.got_commit_lock)
+
+ recovery = gocept.zeoraid.recovery.Recovery(
+ self.source, self.target, finalize_check_no_commit)()
+ self.assertEquals('verify', recovery.next()[0])
+ self.assertEquals('verified', recovery.next()[0])
+ self.assertEquals('recover', recovery.next()[0])
+ self.assertEquals('recovered', recovery.next()[0])
+ self.thread.join()
+ self.assertEquals(True, self.got_commit_lock)
+
+
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(OnlineRecovery))
More information about the Checkins
mailing list