[Checkins] SVN: gocept.zeoraid/trunk/src/gocept/zeoraid/ degrade
storages which yield higher new oids than others
Thomas Lotze
tl at gocept.com
Thu Feb 21 05:15:23 EST 2008
Log message for revision 84100:
degrade storages which yield higher new oids than others
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 2008-02-21 01:32:25 UTC (rev 84099)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/storage.py 2008-02-21 10:15:21 UTC (rev 84100)
@@ -207,7 +207,20 @@
"""Allocate a new object id."""
self._write_lock.acquire()
try:
- return self._apply_all_storages('new_oid')
+ oids = []
+ for storage in self.storages_optimal[:]:
+ reliable, oid = self.__apply_storage(storage, 'new_oid')
+ if reliable:
+ oids.append((oid, storage))
+ if not oids:
+ raise gocept.zeoraid.interfaces.RAIDError(
+ "RAID storage is failed.")
+
+ min_oid = sorted(oids)[0][0]
+ for oid, storage in oids:
+ if oid > min_oid:
+ self._degrade_storage(storage)
+ return min_oid
finally:
self._write_lock.release()
@@ -490,7 +503,7 @@
if not self.storages_optimal and fail:
raise gocept.zeoraid.interfaces.RAIDError("No storages remain.")
- def __apply_storage(self, name, method_name, args, kw,
+ def __apply_storage(self, name, method_name, args=(), kw={},
expect_connected=True):
# XXX storage might be degraded by now, need to check.
storage = self.storages[name]
Modified: gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py
===================================================================
--- gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py 2008-02-21 01:32:25 UTC (rev 84099)
+++ gocept.zeoraid/trunk/src/gocept/zeoraid/tests/test_basics.py 2008-02-21 10:15:21 UTC (rev 84100)
@@ -512,6 +512,14 @@
self._storage.new_oid)
self.assertEquals('failed', self._storage.raid_status())
+ def test_new_oid_unsynchronised_degrading(self):
+ name = self._backend(1).getName()
+ self._backend(0).new_oid()
+ oid = self._storage.new_oid()
+ self.assertEquals('\x00\x00\x00\x00\x00\x00\x00\x01', oid)
+ self.assertEquals('degraded', self._storage.raid_status())
+ self.assertEquals(name, self._backend(0).getName())
+
def test_pack_degrading1(self):
# We store differently sized data for each revision so that packing
# definitely yields different file sizes.
@@ -521,9 +529,9 @@
revid = self._dostore(oid=oid, revid=None, data=1)
revid2 = self._dostore(oid=oid, revid=revid, data=2)
- self.assertEquals(256, self._backend(0).getSize())
- self.assertEquals(256, self._backend(1).getSize())
- self.assertEquals(256, self._storage.getSize())
+ self.assertEquals(264, self._backend(0).getSize())
+ self.assertEquals(264, self._backend(1).getSize())
+ self.assertEquals(264, self._storage.getSize())
self._storage.pack(time.time(), ZODB.serialize.referencesf)
self.assertEquals(130, self._backend(0).getSize())
More information about the Checkins
mailing list