[Neo-report] r1826 gregory - in /trunk/neo: ./ admin/ client/ master/ master/handlers/ sto...

nobody at svn.erp5.org nobody at svn.erp5.org
Mon Feb 22 19:08:59 CET 2010


Author: gregory
Date: Mon Feb 22 19:08:59 2010
New Revision: 1826

Log:
Revert r1812 & r1814 (node manager as a singleton).

Singeltons can not be used in NEO because client side process may deals with
multiple NEO cluster. Add a callback on connection when linked with a node to
update node's connection property at connection closure.

Modified:
    trunk/neo/admin/app.py
    trunk/neo/client/app.py
    trunk/neo/connection.py
    trunk/neo/master/app.py
    trunk/neo/master/handlers/storage.py
    trunk/neo/master/recovery.py
    trunk/neo/master/verification.py
    trunk/neo/node.py
    trunk/neo/storage/app.py
    trunk/neo/tests/testNodes.py

Modified: trunk/neo/admin/app.py
==============================================================================
--- trunk/neo/admin/app.py [iso-8859-1] (original)
+++ trunk/neo/admin/app.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -52,13 +52,12 @@
 
     def __init__(self, config):
 
-        NodeManager.init()
         # always use default connector for now
         self.connector_handler = getConnectorHandler()
 
         # Internal attributes.
         self.em = EventManager()
-        self.nm = NodeManager
+        self.nm = NodeManager()
 
         self.name = config.getCluster()
         self.server = config.getBind()

Modified: trunk/neo/client/app.py
==============================================================================
--- trunk/neo/client/app.py [iso-8859-1] (original)
+++ trunk/neo/client/app.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -100,8 +100,6 @@
     """The client node application."""
 
     def __init__(self, master_nodes, name, connector=None, **kw):
-
-        NodeManager.init()
         # Start polling thread
         self.em = EventManager()
         self.poll_thread = ThreadedPoll(self.em)
@@ -110,7 +108,7 @@
         self.name = name
         self.connector_handler = getConnectorHandler(connector)
         self.dispatcher = Dispatcher()
-        self.nm = NodeManager
+        self.nm = NodeManager()
         self.cp = ConnectionPool(self)
         self.pt = None
         self.master_conn = None

Modified: trunk/neo/connection.py
==============================================================================
--- trunk/neo/connection.py [iso-8859-1] (original)
+++ trunk/neo/connection.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -202,6 +202,7 @@
         self._queue = []
         self._expected = deque()
         self._next_handler = None
+        self._on_close = None
         BaseConnection.__init__(self, event_manager, handler,
                                 connector = connector, addr = addr,
                                 connector_handler = connector_handler)
@@ -219,6 +220,10 @@
         else:
             self.handler = handler
 
+    def setOnClose(self, callback):
+        assert self._on_close is None
+        self._on_close = callback
+
     def isAborted(self):
         return self.aborted
 
@@ -245,10 +250,9 @@
         BaseConnection.close(self)
         for event in self.event_dict.itervalues():
             self.em.removeIdleEvent(event)
-        from neo.node import NodeManager
-        node = NodeManager.getByUUID(self.getUUID())
-        if node is not None:
-            node.setConnection(None)
+        if self._on_close is not None:
+            self._on_close()
+            self._on_close = None
         self.event_dict.clear()
         self.write_buf = ""
         self.read_buf = ""

Modified: trunk/neo/master/app.py
==============================================================================
--- trunk/neo/master/app.py [iso-8859-1] (original)
+++ trunk/neo/master/app.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -42,13 +42,12 @@
 
     def __init__(self, config):
 
-        NodeManager.init()
         # always use default connector for now
         self.connector_handler = getConnectorHandler()
 
         # Internal attributes.
         self.em = EventManager()
-        self.nm = NodeManager
+        self.nm = NodeManager()
         self.tm = TransactionManager()
 
         self.name = config.getCluster()

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] Mon Feb 22 19:08:59 2010
@@ -36,7 +36,6 @@
     def nodeLost(self, conn, node):
         logging.info('storage node lost')
         assert not node.isRunning(), node.getState()
-        node.setConnection(None)
 
         if not self.app.pt.operational():
             raise OperationFailure, 'cannot continue operation'

Modified: trunk/neo/master/recovery.py
==============================================================================
--- trunk/neo/master/recovery.py [iso-8859-1] (original)
+++ trunk/neo/master/recovery.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -106,7 +106,6 @@
         assert node is not None
         if node.getState() == new_state:
             return
-        node.setConnection(None)
         node.setState(new_state)
 
     def connectionCompleted(self, conn):

Modified: trunk/neo/master/verification.py
==============================================================================
--- trunk/neo/master/verification.py [iso-8859-1] (original)
+++ trunk/neo/master/verification.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -249,7 +249,6 @@
         pass
 
     def nodeLost(self, conn, node):
-        node.setConnection(None)
         if not self.app.pt.operational():
             raise VerificationFailure, 'cannot continue verification'
 

Modified: trunk/neo/node.py
==============================================================================
--- trunk/neo/node.py [iso-8859-1] (original)
+++ trunk/neo/node.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -77,9 +77,15 @@
     def getUUID(self):
         return self._uuid
 
+    def onConnectionClosed(self):
+        assert self._connection is not None
+        self._connection = None
+
     def setConnection(self, connection):
-        assert self._connection is None or connection is None
+        assert connection is not None
+        assert self._connection is None
         self._connection = connection
+        connection.setOnClose(self.onConnectionClosed)
 
     def getConnection(self):
         assert self._connection is not None
@@ -429,5 +435,3 @@
             logging.debug(' * %32s | %8s | %22s | %s' % (
                 uuid, node.getType(), address, node.getState()))
 
-# pseudo singleton
-NodeManager = NodeManager()

Modified: trunk/neo/storage/app.py
==============================================================================
--- trunk/neo/storage/app.py [iso-8859-1] (original)
+++ trunk/neo/storage/app.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -38,8 +38,6 @@
     """The storage node application."""
 
     def __init__(self, config):
-
-        NodeManager.init()
         # always use default connector for now
         self.connector_handler = getConnectorHandler()
 
@@ -48,7 +46,7 @@
 
         # Internal attributes.
         self.em = EventManager()
-        self.nm = NodeManager
+        self.nm = NodeManager()
         self.tm = TransactionManager(self)
         self.dm = buildDatabaseManager(config.getAdapter(), config.getDatabase())
 

Modified: trunk/neo/tests/testNodes.py
==============================================================================
--- trunk/neo/tests/testNodes.py [iso-8859-1] (original)
+++ trunk/neo/tests/testNodes.py [iso-8859-1] Mon Feb 22 19:08:59 2010
@@ -125,7 +125,7 @@
 class NodeManagerTests(NeoTestBase):
 
     def setUp(self):
-        self.manager = nm = NodeManager.__class__()
+        self.manager = nm = NodeManager()
         self.storage = StorageNode(nm, ('127.0.0.1', 1000), self.getNewUUID())
         self.master = MasterNode(nm, ('127.0.0.1', 2000), self.getNewUUID())
         self.client = ClientNode(nm, None, self.getNewUUID())





More information about the Neo-report mailing list