[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