[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