예제 #1
0
    def __add_node(self, node_ip, is_enable):
        """
        Method: __add_node
        Description: 增加节点
        Parameter: 
            node_ip: 节点的ip
            is_enable: 是否启用了
        Return: 错误码
        Others: 
        """

        ret = 0
        
        if node_ip == self.__cluster_cfg_info.my_inner_ip:
            return ret

        for node in self.__other_nodes:
            if node.get_ip() == node_ip:
                break
        else:
            node_info = ClusterNodeInfo(node_ip)                
            if is_enable == 0:                    
                node_info.set_enable(False)

            self.__other_nodes.append(node_info)
            url = self.__get_url(node_ip)
            ret = self.__callacp_client.new_connect(url)
            if ret != 0:
                tracelog.error("new connection to cluster node failed. %s" % url)
                
        return ret
예제 #2
0
    def reload_nodes(self, log_all_nodes = False):
        """
        Method: reload_nodes
        Description: 从数据库中重新记载节点信息
        Parameter: 
            log_all_nodes: 是否将所有的节点信息记录日志
        Return: 错误码,当前的节点信息
        Others: 
        """

        # 从DB中读取所有节点的信息
        # 返回值: 错误码, 当前node
        cur_node = None
        
        with self.__lock:
            if self.__mit is None:
                try:
                    db_file = os.path.join(self.__app_top_path, "data", "sqlite", "cluster.db")
                    self.__mit = ClusterMit(db_file)
                except:
                    tracelog.exception("reload cluster node failed.")
                    return err_code_mgr.ER_CLUSTER_START_FAILED, None

            
            # 加载所有的节点信息
            other_nodes_ips = set([node.get_ip() for node in self.__other_nodes])
            
            nodes = self.__mit.get_all_nodes()
            for node in nodes:
                                                    
                if node.ip == self.__cluster_cfg_info.my_inner_ip:
                    cur_node = ClusterNodeInfo(node.ip)                
                    if node.is_enable == 0:                    
                        cur_node.set_enable(False)
                else:
                    other_nodes_ips.discard(node.ip)
                    ret = self.__add_node(node.ip, node.is_enable)
                    if ret != 0:
                        tracelog.error("add cluster node %s failed." % node.ip)
                        return err_code_mgr.ER_CLUSTER_START_FAILED, None

                if log_all_nodes is True:
                    tracelog.info("load cluster node: %s" % node.ip)

            # 删除已经不存在的节点
            for node_ip in other_nodes_ips:
                self.__rmv_node(node_ip)
                
        return 0, cur_node
예제 #3
0
    def get_all_nodes(self):
        """
        Method: get_all_nodes
        Description: 获取所有的节点信息
        Parameter: 无
        Return: 所有的节点信息
        Others: 
        """

        # 获取所有的nodes的信息
        with self.__lock:
            all_nodes = copy.deepcopy(self.__other_nodes)
            
            myself = ClusterNodeInfo(self.__cluster_cfg_info.my_inner_ip)       
            myself.set_role(self.__role)  
            myself.set_online(True)            
            all_nodes.append(myself)

        return all_nodes