def update_connection(self, ip, conn): rem = '' re = int(self.resource_mains[ip]['remain_connection']) rem = self._get_connection_level(conn) pre_rem = self._get_connection_level(re) self.resource_mains[ip]['remain_connection'] = conn if rem != pre_rem: self.remain_connections[pre_rem].remove(ip) util.opush(self.remain_connections[rem], ip)
async def resp_set_main_node(self, data, reader, writer): util.opush(self.scores, data['ip']) if self.con_ip == data['ip']: self.ismainnode = True self.childs = [] if self.ismainnode and self.con_ip != data['ip']: await self.notify({ 'op': 'set_main_node', 'ip': data['ip'] }, self.childs)
async def connect_2_network(self, url): """ A node first connect to the network Args: url: The first connect node's url and port. Returns: """ try: js = await self.requests({'op': 'get_main_node'}, url) pass except Exception as e: print("connect to network exception!") print(e) return self.scores = js['scores'] if len(self.scores) < 100 and len(self.scores) >= 1: rs = await self.req_resource_file(random.choice(self.scores)) self.node['father'] = self.con_ip self.resource_mains = rs['resource_mains'] self.locations = rs['locations'] self.server_types = rs['server_types'] self.remain_connections = rs['remain_connections'] self.scores = rs['scores'] self.ismainnode = True # indicate the server will be main node server. util.opush(self.scores, self.con_ip) await self.notify({ 'op': 'new_main_node', 'node': self.node }, self.scores) return elif len(self.scores) == 0: self.node['father'] = self.con_ip self.ismainnode = True # indicate the server will be main node server. util.opush(self.scores, self.con_ip) else: mainnode = self.choose_best_mainnode() self.node['father'] = mainnode self.mainnode = mainnode rs = await self.req_resource_file(mainnode) self.resource_mains = rs.resource_mains self.locations = rs.locations self.server_types = rs.server_types self.remain_connections = rs.remain_connections self.scores = rs.scores await self.notify({'op': 'new_node', 'node': self.node}, mainnode)
def increase_connection(self, ip=Node): if not ip: ip = self.con_ip if self.resource_mains.get(ip): self.resource_mains[ip]['remain_connection'] -= 1 else: return False rem = '' re = int(self.resource_mains[ip]['remain_connection']) rem = self._get_connection_level(re) pre_rem = self._get_connection_level(re + 1) if rem == pre_rem: return True else: self.remain_connections[pre_rem].remove(ip) util.opush(self.remain_connections[rem], ip) return True
async def resp_add_node(self, data, reader, writer): if not self.server_types.get(data['server_type']): self.server_types[data['server_type']] = [] util.opush(self.server_types[data['server_type']], data.ip) if not self.locations.get(data['location']): self.locations[data['location']] = [] util.opush(self.locations[data['location']], data.ip) rem = '' re = int(data['remain_connection']) if re >= 0 and re < 100: rem = '10' elif re >= 100 and re < 1000: rem = '100' elif re >= 1000 and re < 10000: rem = '1000' elif re >= 10000 and re < 100000: rem = '10000' elif re > 100000: rem = 'unlimit' else: rem = 'unremain' if rem.startswith('1'): rem = 'remain' + rem util.opush(self.remain_connections[rem], data.ip) self.resource_mains[data.ip] = data if self.ismainnode: await self.notify({'op': 'add_node', 'node': data}, self.childs)
def set_node(self, data): if not self.server_types.get(data['server_type']): self.server_types[data['server_type']] = [] util.opush(self.server_types[data['server_type']], data.ip) if not self.locations.get(data['location']): self.locations[data['location']] = [] util.opush(self.locations[data['location']], data.ip) rem = '' re = int(data['remain_connection']) if re >= 0 and re < 100: rem = '10' elif re >= 100 and re < 1000: rem = '100' elif re >= 1000 and re < 10000: rem = '1000' elif re >= 10000 and re < 100000: rem = '10000' elif re > 100000: rem = 'unlimit' else: rem = 'unremain' if rem.startswith('1'): rem = 'remain' + rem util.opush(self.remain_connections[rem], data.ip) self.resource_mains[data.ip] = data pass
async def resp_new_node(self, data, reader, writer): self.set_node(data) util.opush(self.childs, data.ip) await self.notify({'op': 'add_node', 'node': data}, self.scores)