[Checkins] SVN: gocept.zeoraid/trunk/src/gocept/zeoraid/ - Moved all actual recovery functionality into the "implementation" method

Thomas Lotze tl at gocept.com
Thu Jan 8 05:12:47 EST 2009


Log message for revision 94615:
  - Moved all actual recovery functionality into the "implementation" method
    so that it may be used synchronously.
  
  - Extended tests for dynamic adding of storages.
  

Changed:
  U   gocept.zeoraid/trunk/src/gocept/zeoraid/storage.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	2009-01-08 09:27:40 UTC (rev 94614)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py	2009-01-08 10:12:47 UTC (rev 94615)
@@ -588,8 +588,6 @@
     def raid_recover(self, name):
         if name not in self.storages_degraded:
             return
-        self.storages_degraded.remove(name)
-        self.storage_recovering = name
         t = threading.Thread(target=self._recover_impl, args=(name,))
         self._threads.add(t)
         t.setDaemon(True)
@@ -777,6 +775,8 @@
         raise gocept.zeoraid.interfaces.RAIDError("RAID storage is failed.")
 
     def _recover_impl(self, name):
+        self.storages_degraded.remove(name)
+        self.storage_recovering = name
         storage = self.openers[name].open()
         self.storages[name] = storage
         recovery = gocept.zeoraid.recovery.Recovery(

Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2009-01-08 09:27:40 UTC (rev 94614)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2009-01-08 10:12:47 UTC (rev 94615)
@@ -68,7 +68,7 @@
         self.addr = addr
         self.kwargs = kwargs or {}
 
-    def open(self, **kwargs):
+    def open(self):
         return ClientStorage(self.addr, **self.kwargs)
 
 
@@ -1223,9 +1223,7 @@
         self._disable_storage(0)
         self._dostore()
         self._dostore()
-        self._storage.raid_recover(self._storage.storages_degraded[0])
-        while self._storage.storage_recovering:
-            time.sleep(0.02)
+        self._storage._recover_impl(self._storage.storages_degraded[0])
         self.assertEquals('optimal', self._storage.raid_status())
         gocept.zeoraid.tests.test_recovery.compare(
             self, self._backend(0), self._backend(1))
@@ -1474,7 +1472,8 @@
                     server %s:%s
                     storage 1
                 </zeoclient>
-            """ % (count, self._servers[count][0], (self._servers[count][1]-1))
+            """ % (storage.name, self._servers[count][0],
+                   (self._servers[count][1] - 1))
 
         file_contents += """\
             </raidstorage>
@@ -1489,28 +1488,39 @@
         return filename
 
     def test_reload_add(self):
-        # create and start a new ZEO server
         port = get_port()
         zconf = forker.ZEOConfig(('', port))
         zport, adminaddr, pid, path = forker.start_zeo_server(self.getConfig(),
                                                               zconf, port)
         self._pids.append(pid)
         self._servers.append(adminaddr)
-        self._storages.append(ZEOOpener('6', zport, storage='1',
+        self._storages.append(ZEOOpener('5', zport, storage='1',
                                         min_disconnect_poll=0.5, wait=1,
                                         wait_timeout=60))
 
         filename = self.saveConfig(self._storages)
 
-        # test if the new ZEO server is added as a storage
         self.assertEquals(len(self._storage.openers), 5)
+        self.assertEquals([], self._storage.storages_degraded)
         self._storage.raid_reload(filename)
         self.assertEquals(len(self._storage.openers), 6)
+        self.assertEquals(['5'], self._storage.storages_degraded)
 
-        # do a simple store to see if anything breaks
         oid = self._storage.new_oid()
-        self._dostore(oid=oid)
+        self._dostore(oid=oid, data='0', already_pickled=True)
+        self._storage._recover_impl('5')
+        self.assertEquals([], self._storage.storages_degraded)
 
+        oid2 = self._storage.new_oid()
+        self._dostore(oid=oid2, data='1', already_pickled=True)
+        self.assertEquals([], self._storage.storages_degraded)
+
+        self.assertEquals('5', self._storages[-1].name)
+        s5 = self._storages[-1].open()
+        self.assertEquals('0', s5.load(oid)[0])
+        self.assertEquals('1', s5.load(oid2)[0])
+        s5.close()
+
     def test_reload_remove(self):
         # Remove the 4th storage
         storages = [s for c,s in enumerate(self._storages) if c != 3]
@@ -1522,8 +1532,7 @@
         self.assertEquals(len(self._storage.storages_degraded), 1)
 
         # do a simple store to see if anything breaks
-        oid = self._storage.new_oid()
-        self._dostore(oid=oid)
+        self._dostore()
 
 
 def test_suite():



More information about the Checkins mailing list