def add_registernode(self, reg_node): cmap = {reg_node.ip: reg_node.port} if reg_node.role == 'worker': reg_node.id = config.workranktoID(self.num_workers) self.num_workers += 1 elif reg_node.role == 'server': reg_node.id = config.serverranktoID(self.num_servers) self.num_servers += 1 cregnode = self.nodes_list.nodel.add() self.copynode(cregnode, reg_node) conflict_flag = False for key in self.connect_ids.keys(): if self.connect_ids[key] == cmap: conflict_flag = True break if conflict_flag: self.share_node[reg_node.id] = cmap self.connect_ids[reg_node.id] = cmap self.zmqs.connect(reg_node, self.schedule_node) # 更新节点的活跃时间 self.update_heart(reg_node.id, datetime.datetime.now()) if (self.num_servers + self.num_workers) == self.workcount: msg = message.Meta() # 把tabel_node广播给连入的所有节点 msg.control.command = 'tell node' msg.body = self.nodes_list.SerializePartialToString() self.sendtoall(msg)
def stop(self): lmeta = message.Meta() lmeta.control.command = 'exit' lmeta.recv_id = self.schedule_node.id lmeta.sender_id = self.schedule_node.id self.zmqs.sendmsg(lmeta) self.recieve_thread.join()
def request_msg(self,request_msg,kvlist): lmeta = message.Meta() lmeta.sender_id = request_msg.recv_id lmeta.recv_id = request_msg.sender_id lmeta.timestamp = request_msg.timestamp lmeta.push = request_msg.push lmeta.body = json.dumps(kvlist).encode() lmeta.request = False self.send(lmeta)
def process_clock(self, stale, workid, ts): # print('process') msg = message.Meta() msg.sender_id = self.schedule_node.id msg.recv_id = workid msg.body = str(self.getre_clock(stale, workid)).encode() msg.control.command = 'ssp' msg.timestamp = ts self.zmqs.sendmsg(msg)
def heartbeat(self, interval): #每隔一段时间向schedule发送消息表示自己还活着 while (interval > 0 and self.ready): time.sleep(interval) msg = message.Meta() msg.control.command = 'heart' msg.recv_id = 1 self.copynode(msg.control.reg_node, self.node) msg.timestamp = self.sendtime self.sendtime += 1 self.send(msg)
def process(self,msg): #本地复制下信息 lmeta=message.Meta() lmeta.body=msg.body lmeta.timestamp=msg.timestamp lmeta.sender_id=msg.sender_id lmeta.recv_id=msg.recv_id lmeta.request=msg.request lmeta.push=msg.push self.requesthandle(lmeta,json.loads(lmeta.body.decode()),self)
def stop(self): lmeta = message.Meta() lmeta.control.command = 'exit' lmeta.recv_id = self.node.id lmeta.sender_id = self.node.id # sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # sock.connect((self.node.ip, self.node.port)) # self.send(lmeta.SerializePartialToString()) self.send(lmeta) # sock.close() self.recieve_thread.join() self.heart_thread.join()
def sendclock(self, clock, ts): msg = message.Meta() schedule_node = message.Node() schedule_node.id = 1 schedule_node.ip = '127.0.0.1' schedule_node.port = 8002 msg.control.command = 'ssp' msg.control.reg_node.ip = self.node.ip msg.control.reg_node.port = self.node.port msg.control.reg_node.role = self.node.role msg.timestamp = ts msg.sender_id = self.node.id msg.recv_id = schedule_node.id msg.body = str(clock).encode() self.zmqs.sendmsg(msg)
def register(self): self.zmqs.bind(self.node) print('role:%s register' % self.node.role) msg = message.Meta() schedule_node = message.Node() schedule_node.id = 1 schedule_node.ip = '127.0.0.1' schedule_node.port = 8002 self.zmqs.connect(schedule_node, self.node) msg.control.command = 'add node' msg.control.reg_node.ip = self.node.ip msg.control.reg_node.port = self.node.port msg.control.reg_node.role = self.node.role msg.timestamp = self.sendtime self.sendtime += 1 msg.recv_id = schedule_node.id self.zmqs.sendmsg(msg) self.recieve_thread = threading.Thread(target=self.receiving) self.recieve_thread.start()
def updatenodeinfo(self, deadnodes, node): recovernode = message.Node() recovernode.id = -1 if node in deadnodes.keys(): #这个node是不知道自己id的,从原来注册的信息表里获取自己的id,rank for key in self.connect_ids.keys(): cmap = list[self.connect_ids[key].keys()] if node.ip == cmap[0] and node.port == cmap[1]: node.id = key node.rank = config.IDtorank(node.id) recovernode = node break if recovernode.id == -1: logging.error('no recover node') msg = message.Meta() msg.sender_id = self.schedule_node.id msg.recv_id = recovernode.id msg.body = self.nodes_list.SerializePartialToString() msg.control.command = 'tell node' self.zmqs.sendmsg(msg)
def sendkv(self,ts,push,kv_list): slicer=allocate.getslicer(kv_list,allocate.get_serverkeyranges(self.servernum)) #根据serverrange查询每个server负责的key skipnum=0 print('len slice is:%d'% len(slicer)) for i in range(len(slicer)): if slicer[i][0]=='False': skipnum=skipnum+1 print('skipnum',skipnum) self.tracker[ts][1]+=skipnum if skipnum==len(slicer): self.run_callback(ts) for i in range(len(slicer)): if slicer[i][0]=='False': continue msg=message.Meta() msg.sender_id=self.node.id msg.recv_id=config.serverranktoID(i) msg.body=json.dumps(slicer[i][1]).encode() msg.push=push msg.timestamp=ts msg.request=True self.send(msg)
def recvmsg(self): for i in range(1): self.receiver.recv() buf = message.Meta() buf.ParseFromString(self.receiver.recv()) return buf