From 831a20d8cee4928f3806b8406318106b915a8aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Calonne?= <aurel@nexedi.com> Date: Thu, 1 Feb 2007 09:09:33 +0000 Subject: [PATCH] defined a master node list in zope.conf instead of just one master node git-svn-id: https://svn.erp5.org/repos/neo/branches/prototype3@105 71dcc9de-d417-0410-9af5-da40c76e7ee4 --- neo/client/NEOStorage.py | 4 ++-- neo/client/app.py | 26 +++++++++++++------------- neo/client/config.py | 2 +- neo/component.xml | 10 ++-------- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/neo/client/NEOStorage.py b/neo/client/NEOStorage.py index 50f21b41..db78b132 100644 --- a/neo/client/NEOStorage.py +++ b/neo/client/NEOStorage.py @@ -21,7 +21,7 @@ class NEOStorage(BaseStorage.BaseStorage, __name__ = 'NEOStorage' - def __init__(self, master_addr, master_port, name, read_only=False, **kw): + def __init__(self, master_nodes, name, read_only=False, **kw): self._is_read_only = read_only # Transaction must be under protection of lock l = Lock() @@ -42,7 +42,7 @@ class NEOStorage(BaseStorage.BaseStorage, dispatcher.start() # Import here to prevent recursive import from neo.client.app import Application - self.app = Application(master_addr, master_port, name, em, dispatcher, + self.app = Application(master_nodes, name, em, dispatcher, message_queue, request_queue) def load(self, oid, version=None): diff --git a/neo/client/app.py b/neo/client/app.py index 5eab1425..f01aade2 100644 --- a/neo/client/app.py +++ b/neo/client/app.py @@ -109,11 +109,10 @@ class ConnectionManager(object): class Application(ThreadingMixIn, object): """The client node application.""" - def __init__(self, master_addr, master_port, name, em, dispatcher, message_queue, + def __init__(self, master_nodes, name, em, dispatcher, message_queue, request_queue, **kw): logging.basicConfig(level = logging.DEBUG) - logging.debug('master node address is %s, port is %d' %(master_addr, - master_port)) + logging.debug('master node address are %s' %(master_nodes,)) # Internal Attributes common to all thread self.name = name self.em = em @@ -163,11 +162,11 @@ class Application(ThreadingMixIn, object): break self.uuid = uuid # Connect to primary master node - defined_master_addr = (master_addr, master_port) + self.master_node_list = master_nodes.split(' ') while 1: self.node_not_ready = 0 logging.debug("trying to connect to primary master...") - self.connectToPrimaryMasterNode(defined_master_addr) + self.connectToPrimaryMasterNode() if not self.node_not_ready and self.pt.filled(): # got a connection and partition table break @@ -203,21 +202,22 @@ class Application(ThreadingMixIn, object): global_message[0].handler.dispatch(global_message[0], global_message[1]) - def connectToPrimaryMasterNode(self, defined_master_addr): + def connectToPrimaryMasterNode(self): """Connect to the primary master node.""" + addr, port = self.master_node_list[0].split(':') + port = int(port) handler = ClientEventHandler(self, self.dispatcher) - n = MasterNode(server = defined_master_addr) + n = MasterNode(server = (addr, port)) self.nm.add(n) - # Connect to defined master node and get primary master node + # Connect to first master node defined and get primary master node self.local_var.tmp_q = Queue(1) if self.primary_master_node is None: - conn = ClientConnection(self.em, handler, defined_master_addr) + conn = ClientConnection(self.em, handler, (addr, port)) msg_id = conn.getNextId() p = Packet() p.requestNodeIdentification(msg_id, CLIENT_NODE_TYPE, self.uuid, - defined_master_addr[0], - defined_master_addr[1], self.name) + addr, port, self.name) # send message to dispatcher self.queue.put((self.local_var.tmp_q, msg_id, conn, p), True) self.primary_master_node = None @@ -226,7 +226,7 @@ class Application(ThreadingMixIn, object): while 1: self._waitMessage(block=0) if self.primary_master_node == -1: - raise NEOStorageError("Unable to initialize connection to master node %s" %(defined_master_addr,)) + raise NEOStorageError("Unable to initialize connection to master node %s:%d" %(addr, port)) if self.primary_master_node is not None: break if self.node_not_ready: @@ -234,7 +234,7 @@ class Application(ThreadingMixIn, object): return logging.info('primary master node is %s' %(self.primary_master_node.server,)) # Close connection if not already connected to primary master node - if self.primary_master_node.getServer() != defined_master_addr: + if self.primary_master_node.getServer() != (addr, port): for conn in self.em.getConnectionList(): conn.close() diff --git a/neo/client/config.py b/neo/client/config.py index 8133f536..ed17dcb3 100644 --- a/neo/client/config.py +++ b/neo/client/config.py @@ -4,6 +4,6 @@ class NEOStorage(BaseConfig): def open(self): from NEOStorage import NEOStorage - return NEOStorage(master_addr = self.config.master_addr, master_port = int(self.config.master_port), name = self.config.name) + return NEOStorage(master_nodes = self.config.master_nodes, name = self.config.name) diff --git a/neo/component.xml b/neo/component.xml index bc31f295..100de17b 100644 --- a/neo/component.xml +++ b/neo/component.xml @@ -4,16 +4,10 @@ <description> A scalable storage for Zope </description> - <key name="master_addr" required="yes"> + <key name="master_nodes" required="yes"> <description> - Give the ip of the master node + Give the list of the master node like ip:port ip:port... </description> - </key> - <key name="master_port" required="yes"> - <description> - Give the port of the master node - </description> - </key> <key name="name" required="yes"> <description> Give the name of the cluster -- 2.30.9