예제 #1
0
    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)
예제 #2
0
 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()
예제 #3
0
	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)
예제 #4
0
 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)
예제 #5
0
 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)
예제 #6
0
	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)
예제 #7
0
    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()
예제 #8
0
 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)
예제 #9
0
 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()
예제 #10
0
 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)
예제 #11
0
	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)
예제 #12
0
 def recvmsg(self):
     for i in range(1):
         self.receiver.recv()
     buf = message.Meta()
     buf.ParseFromString(self.receiver.recv())
     return buf