[Checkins] SVN: gocept.zeoraid/trunk/src/gocept/zeoraid/ - Removing backends when reloading the config now forgets them instead of degrading them.

Thomas Lotze tl at gocept.com
Thu Jan 8 07:29:55 EST 2009


Log message for revision 94617:
  - Removing backends when reloading the config now forgets them instead of degrading them.
  - Coding style.
  

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 11:57:09 UTC (rev 94616)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py	2009-01-08 12:29:55 UTC (rev 94617)
@@ -603,19 +603,24 @@
 
         options = ZEOOptions()
         options.realize(['-C', self.zeo.options.configfile])
-        new_storages = dict([(o.name,o) for o in options.storages[0].config.storages])
-        storages_to_add = [(name, opener) for name, opener in new_storages.items() if name not in self.openers]
-        storages_to_remove = [(name, opener) for name, opener in self.openers.items() if name not in new_storages]
+        for candidate in options.storages:
+            if candidate.name == self.__name__:
+                storage = candidate
+                break
+        else:
+            raise RuntimeError(
+                'No storage section found for RAID %s.' % self.__name__)
+        new_storages = dict((opt.name, opt)
+                            for opt in storage.config.storages)
+        new_names = set(new_storages)
+        old_names = set(self.openers)
 
-        s = ""
-        for name, opener in storages_to_remove:
-            self.raid_disable(name)
-            s += "removed %s\n" % name
-        for name, opener in storages_to_add:
-            self.openers[name] = opener
+        for name in old_names - new_names:
+            self._close_storage(name)
+
+        for name in new_names - old_names:
+            self.openers[name] = new_storages[name]
             self.storages_degraded.append(name)
-            s += "added %s\n" % name
-        return s
 
     # internal
 
@@ -625,16 +630,18 @@
         assert hasattr(storage, 'supportsUndo') and storage.supportsUndo()
         self.storages[name] = storage
 
-    def _degrade_storage(self, name, fail=True):
+    def _close_storage(self, name):
         if name in self.storages_optimal:
             self.storages_optimal.remove(name)
-        self.storages_degraded.append(name)
-        storage = self.storages[name]
+        storage = self.storages.pop(name)
         t = threading.Thread(target=storage.close)
         self._threads.add(t)
         t.setDaemon(True)
         t.start()
-        del self.storages[name]
+
+    def _degrade_storage(self, name, fail=True):
+        self._close_storage(name)
+        self.storages_degraded.append(name)
         if not self.storages_optimal and fail:
             raise gocept.zeoraid.interfaces.RAIDError("No storages remain.")
 

Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2009-01-08 11:57:09 UTC (rev 94616)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py	2009-01-08 12:29:55 UTC (rev 94617)
@@ -1542,19 +1542,23 @@
         s5.close()
 
     def test_reload_remove(self):
-        self.assertEquals(len(self._storage.storages_degraded), 0)
+        storage = self._storages.pop(3).open()
 
-        del self._storages[3]
-
         # configure the RAID to no longer use the removed backend
         self.update_config()
         self._storage.raid_reload()
-        self.assertEquals(len(self._storage.storages_degraded), 1)
+        self.assertEquals('optimal', self._storage.raid_status())
 
         # ensure that we can still write to the RAID
-        self._dostore()
+        oid = self._storage.new_oid()
+        self._dostore(oid=oid)
 
+        # ensure that the transaction did not arrive at the removed backend
+        self.assertRaises(ZODB.POSException.POSKeyError, storage.load, oid)
 
+        storage.close()
+
+
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(ZEOReplicationStorageTests, "check"))



More information about the Checkins mailing list