[Neo-report] r2366 vincent - in /trunk/neo: ./ master/ master/handlers/ storage/ tests/ te...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Oct 29 19:07:39 CEST 2010


Author: vincent
Date: Fri Oct 29 19:07:38 2010
New Revision: 2366

Log:
Wait for storage to tell us it is ready before asking it to lock objects.

Modified:
    trunk/neo/handler.py
    trunk/neo/master/app.py
    trunk/neo/master/handlers/client.py
    trunk/neo/master/handlers/storage.py
    trunk/neo/protocol.py
    trunk/neo/storage/app.py
    trunk/neo/tests/master/testClientHandler.py
    trunk/neo/tests/master/testMasterApp.py
    trunk/neo/tests/master/testStorageHandler.py
    trunk/neo/tests/testProtocol.py

Modified: trunk/neo/handler.py
==============================================================================
--- trunk/neo/handler.py [iso-8859-1] (original)
+++ trunk/neo/handler.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -369,6 +369,9 @@ class EventHandler(object):
             oid_checksum, max_oid, serial_checksum, max_serial):
         raise UnexpectedPacketError
 
+    def notifyReady(self, conn):
+        raise UnexpectedPacketError
+
     # Error packet handlers.
 
     def error(self, conn, code, message):
@@ -488,6 +491,7 @@ class EventHandler(object):
         d[Packets.AnswerCheckTIDRange] = self.answerCheckTIDRange
         d[Packets.AskCheckSerialRange] = self.askCheckSerialRange
         d[Packets.AnswerCheckSerialRange] = self.answerCheckSerialRange
+        d[Packets.NotifyReady] = self.notifyReady
 
         return d
 

Modified: trunk/neo/master/app.py
==============================================================================
--- trunk/neo/master/app.py [iso-8859-1] (original)
+++ trunk/neo/master/app.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -55,6 +55,8 @@ class Application(object):
         self.name = config.getCluster()
         self.server = config.getBind()
 
+        self.storage_readiness = set()
+
         for address in config.getMasters():
             self.nm.createMaster(address=address)
 
@@ -553,3 +555,12 @@ class Application(object):
             logging.info('Accept a storage %s (%s)' % (dump(uuid), state))
         return (uuid, node, state, handler, node_ctor)
 
+    def setStorageNotReady(self, uuid):
+        self.storage_readiness.discard(uuid)
+
+    def setStorageReady(self, uuid):
+        self.storage_readiness.add(uuid)
+
+    def isStorageReady(self, uuid):
+        return uuid in self.storage_readiness
+

Modified: trunk/neo/master/handlers/client.py
==============================================================================
--- trunk/neo/master/handlers/client.py [iso-8859-1] (original)
+++ trunk/neo/master/handlers/client.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -68,9 +68,12 @@ class ClientServiceHandler(MasterHandler
 
         # Collect the UUIDs of nodes related to this transaction.
         uuid_set = set()
+        isStorageReady = app.isStorageReady
         for part in partition_set:
-            uuid_set.update((cell.getUUID() for cell in app.pt.getCellList(part)
-                             if cell.getNodeState() != NodeStates.HIDDEN))
+            uuid_set.update((uuid for uuid in (
+                    cell.getUUID() for cell in app.pt.getCellList(part)
+                    if cell.getNodeState() != NodeStates.HIDDEN)
+                if isStorageReady(uuid)))
 
         # check if greater and foreign OID was stored
         if self.app.tm.updateLastOID(oid_list):

Modified: trunk/neo/master/handlers/storage.py
==============================================================================
--- trunk/neo/master/handlers/storage.py [iso-8859-1] (original)
+++ trunk/neo/master/handlers/storage.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -30,8 +30,12 @@ class StorageServiceHandler(BaseServiceH
 
     def connectionCompleted(self, conn):
         # TODO: unit test
-        node = self.app.nm.getByUUID(conn.getUUID())
+        app = self.app
+        uuid = conn.getUUID()
+        node = app.nm.getByUUID(uuid)
+        # XXX: what other values could happen ?
         if node.isRunning():
+            app.setStorageNotReady(uuid)
             conn.notify(Packets.StartOperation())
 
     def nodeLost(self, conn, node):
@@ -141,3 +145,6 @@ class StorageServiceHandler(BaseServiceH
                 except ConnectorConnectionClosedException:
                     pass
 
+    def notifyReady(self, conn):
+        self.app.setStorageReady(conn.getUUID())
+

Modified: trunk/neo/protocol.py
==============================================================================
--- trunk/neo/protocol.py [iso-8859-1] (original)
+++ trunk/neo/protocol.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -1729,6 +1729,13 @@ class AnswerCheckSerialRange(Packet):
         # serial_checksum, max_serial
         return unpack(self._header_format, body)
 
+class NotifyReady(Packet):
+    """
+    Notify that node is ready to serve requests.
+    S -> M
+    """
+    pass
+
 class Error(Packet):
     """
     Error is a special type of message, because this can be sent against
@@ -1978,6 +1985,7 @@ class PacketRegistry(dict):
             AskCheckSerialRange,
             AnswerCheckSerialRange,
             )
+    NotifyReady = register(0x003B, NotifyReady)
 
 # build a "singleton"
 Packets = PacketRegistry()

Modified: trunk/neo/storage/app.py
==============================================================================
--- trunk/neo/storage/app.py [iso-8859-1] (original)
+++ trunk/neo/storage/app.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -272,6 +272,7 @@ class Application(object):
                 or not self.has_last_ids:
             self.em.poll(1)
         self.ready = True
+        self.master_conn.notify(Packets.NotifyReady())
 
     def doOperation(self):
         """Handle everything, including replications and transactions."""

Modified: trunk/neo/tests/master/testClientHandler.py
==============================================================================
--- trunk/neo/tests/master/testClientHandler.py [iso-8859-1] (original)
+++ trunk/neo/tests/master/testClientHandler.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -109,6 +109,13 @@ class MasterClientHandlerTests(NeoTestBa
         tid = self.app.tm.getLastTID()
         conn = self.getFakeConnection(client_uuid, self.client_address)
         self.app.nm.getByUUID(storage_uuid).setConnection(storage_conn)
+        # No packet sent if storage node is not ready
+        self.assertFalse(self.app.isStorageReady(storage_uuid))
+        service.askFinishTransaction(conn, tid, oid_list)
+        self.checkNoPacketSent(storage_conn)
+        # ...but AskLockInformation is sent if it is ready
+        self.app.setStorageReady(storage_uuid)
+        self.assertTrue(self.app.isStorageReady(storage_uuid))
         service.askFinishTransaction(conn, tid, oid_list)
         self.checkAskLockInformation(storage_conn)
         self.assertEquals(len(self.app.tm.getPendingList()), 1)

Modified: trunk/neo/tests/master/testMasterApp.py
==============================================================================
--- trunk/neo/tests/master/testMasterApp.py [iso-8859-1] (original)
+++ trunk/neo/tests/master/testMasterApp.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -93,6 +93,24 @@ class MasterAppTests(NeoTestBase):
         self.checkNoPacketSent(master_conn)
         self.checkNotifyNodeInformation(storage_conn)
 
+    def test_storageReadinessAPI(self):
+        uuid_1 = self.getNewUUID()
+        uuid_2 = self.getNewUUID()
+        self.assertFalse(self.app.isStorageReady(uuid_1))
+        self.assertFalse(self.app.isStorageReady(uuid_2))
+        # Must not raise, nor change readiness
+        self.app.setStorageNotReady(uuid_1)
+        self.assertFalse(self.app.isStorageReady(uuid_1))
+        self.assertFalse(self.app.isStorageReady(uuid_2))
+        # Mark as ready, only one must change
+        self.app.setStorageReady(uuid_1)
+        self.assertTrue(self.app.isStorageReady(uuid_1))
+        self.assertFalse(self.app.isStorageReady(uuid_2))
+        self.app.setStorageReady(uuid_2)
+        # Mark not ready, only one must change
+        self.app.setStorageNotReady(uuid_1)
+        self.assertFalse(self.app.isStorageReady(uuid_1))
+        self.assertTrue(self.app.isStorageReady(uuid_2))
 
 if __name__ == '__main__':
     unittest.main()

Modified: trunk/neo/tests/master/testStorageHandler.py
==============================================================================
--- trunk/neo/tests/master/testStorageHandler.py [iso-8859-1] (original)
+++ trunk/neo/tests/master/testStorageHandler.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -272,6 +272,13 @@ class MasterStorageHandlerTests(NeoTestB
         self.assertTrue(status)
         self.assertEqual(self.app.packing, None)
 
+    def test_notifyReady(self):
+        node, conn = self._getStorage()
+        uuid = node.getUUID()
+        self.assertFalse(self.app.isStorageReady(uuid))
+        self.service.notifyReady(conn)
+        self.assertTrue(self.app.isStorageReady(uuid))
+
 if __name__ == '__main__':
     unittest.main()
 

Modified: trunk/neo/tests/testProtocol.py
==============================================================================
--- trunk/neo/tests/testProtocol.py [iso-8859-1] (original)
+++ trunk/neo/tests/testProtocol.py [iso-8859-1] Fri Oct 29 19:07:38 2010
@@ -702,6 +702,10 @@ class ProtocolTests(NeoTestBase):
         pstatus = p.decode()[0]
         self.assertEqual(pstatus, status)
 
+    def test_notifyReady(self):
+        p = Packets.NotifyReady()
+        self.assertEqual(tuple(), p.decode())
+
 if __name__ == '__main__':
     unittest.main()
 





More information about the Neo-report mailing list