[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