def constructAckMsg(self, ping_msg): msg = membership_pb2.PingAck() msg.sourceId = self.id msg.seqNum = ping_msg.seqNum msg.msgType = membership_pb2.PingAck.ACK self.piggybackEvents(msg) return msg
def constructPingMsg(self): msg = membership_pb2.PingAck() msg.sourceId = self.id msg.seqNum = self.seqNum msg.msgType = membership_pb2.PingAck.PING self.piggybackEvents(msg) return msg
def constructIndirectAckMsg(self, ackreq_msg): msg = membership_pb2.PingAck() msg.targetId = ackreq_msg.targetId msg.sourceId = ackreq_msg.sourceId msg.seqNum = ackreq_msg.seqNum msg.msgType = membership_pb2.PingAck.ACK self.piggybackEvents(msg) return msg
def constructAckReqMsg(self, indirect_ping): msg = membership_pb2.PingAck() msg.targetId = indirect_ping.sourceId msg.sourceId = self.id msg.seqNum = indirect_ping.seqNum msg.msgType = membership_pb2.PingAck.ACKREQ self.piggybackEvents(msg) return msg
def constructIndirectPingMsg(self, pingreq_msg): msg = membership_pb2.PingAck() msg.targetId = pingreq_msg.targetId msg.sourceId = pingreq_msg.sourceId msg.seqNum = pingreq_msg.seqNum msg.msgType = membership_pb2.PingAck.PING self.piggybackEvents(msg) return msg
def constructPingReqMsg(self, targetId): msg = membership_pb2.PingAck() msg.sourceId = self.id msg.targetId = targetId msg.seqNum = -1 * self.seqNum msg.msgType = membership_pb2.PingAck.PINGREQ self.piggybackEvents(msg) return msg
def constructLeavingPingMsg(self): msg = membership_pb2.PingAck() msg.sourceId = self.id msg.seqNum = self.seqNum msg.msgType = membership_pb2.PingAck.PING event = msg.events.add() event.eventType = membership_pb2.Event.LEAVE event.memberId = self.id event.memberIp = self.ip event.memberPort = self.port return msg
def constructIntroducerToReceiverMsg(self): msg = membership_pb2.PingAck() msg.sourceId = self.id msg.seqNum = self.seqNum msg.msgType = membership_pb2.PingAck.PING for member in self.memberList.keys(): event = msg.events.add() event.eventType = membership_pb2.Event.JOIN event.memberId = self.memberList[member].id event.memberIp = self.memberList[member].ip event.memberPort = self.memberList[member].port return msg
def constructJoiningPingMsg(self, introduced=False, introducedinfo=None): if introduced: msg = membership_pb2.PingAck() msg.sourceId = introducedinfo.id msg.seqNum = self.seqNum msg.msgType = membership_pb2.PingAck.PING event = msg.events.add() event.eventType = membership_pb2.Event.JOIN event.memberId = introducedinfo.id event.memberIp = introducedinfo.ip event.memberPort = introducedinfo.port return msg else: msg = membership_pb2.PingAck() msg.sourceId = self.id msg.seqNum = self.seqNum msg.msgType = membership_pb2.PingAck.PING event = msg.events.add() event.eventType = membership_pb2.Event.JOIN event.memberId = self.id event.memberIp = self.ip event.memberPort = self.port return msg
def _runRecv(self): while True: msgRecvd = membership_pb2.PingAck() data, their_addr = self.sock.recvfrom(MAXDATASIZE) msgRecvd.ParseFromString(data) #self.logger.debug("Experiment 1: Ack Received: |" + str(len(data)) + "| bytes at |" + str(time.time())) #logging.info("received %s from %s" %(msgRecvd.msgType, msgRecvd.sourceId)) try: msgRecvd.ParseFromString(data) except: # print(data) # print(msgRecvd) self.logger.debug("Error encountered while parsing message") self.logger.debug("received {} from {}".format( msgRecvd.msgType, msgRecvd.sourceId)) # append the piggybacked events to local eventQueue #To avoid duplicates and events sticking in the eventQueue while being propagated around, we need conditionals #that will not have the event be added if its already been seen or already been removed depending on the event with self.eventQueueLock: for event in msgRecvd.events: if event not in self.eventQueue: # avoid duplicate events, need a expiration mechanism according to period if event.eventType == membership_pb2.Event.JOIN and event.memberId in self.memberList.keys( ): continue elif event.eventType == membership_pb2.Event.LEAVE and not event.memberId in self.memberList.keys( ): continue elif event.eventType == membership_pb2.Event.FAIL and not event.memberId in self.memberList.keys( ): continue else: self.eventQueue.append(event) # handle different types of messages, but it mostly just sends back an ack. Depending on the seqNum, positive is for # regular pings and negative seqNums are for indirect pings. if msgRecvd.msgType == membership_pb2.PingAck.PING: if msgRecvd.seqNum > 0: ''' if (self.id != "Introducer") and (not msgRecvd.sourceId in self.memberList.keys()) and (self.id != msgRecvd.sourceId): #print("We have a new member joining who's ID is: " + str(msgRecvd.sourceId) + " Ip:" + str(their_addr[0]) + " Port:" + str(their_addr[1])) #Marked: Node receives ping and adds msgRecvd sourceId into memberList self.logger.info("received ping from unknown node: {}".format(msgRecvd.sourceId)) newmember = MemberInfo(msgRecvd.sourceId, their_addr[0], their_addr[1]) self.memberList[msgRecvd.sourceId] = newmember ''' ack_msg = self.constructAckMsg(msgRecvd) self.sendto(ack_msg.SerializeToString(), their_addr) elif msgRecvd.seqNum < 0: assert msgRecvd.targetId != None ack_msg = self.constructAckReqMsg(msgRecvd) self.sendto(ack_msg.SerializeToString(), their_addr) elif msgRecvd.msgType == membership_pb2.PingAck.ACK: with self.ackQueueLock: self.ackQueue.append( (msgRecvd.sourceId, abs(msgRecvd.seqNum))) elif msgRecvd.msgType == membership_pb2.PingAck.PINGREQ: assert msgRecvd.targetId != None and msgRecvd.seqNum < 0 if msgRecvd.targetId not in self.memberList: continue indirect_ping = self.constructIndirectPingMsg(msgRecvd) ping_target_addr = self.memberList[ msgRecvd.targetId].ip, self.memberList[ msgRecvd.targetId].port self.sock.sendto(indirect_ping.SerializeToString(), ping_target_addr) elif msgRecvd.msgType == membership_pb2.PingAck.ACKREQ: assert msgRecvd.targetId != None and msgRecvd.seqNum < 0 if msgRecvd.targetId not in self.memberList: continue indirect_ack = self.constructIndirectAckMsg(msgRecvd) ack_target_addr = self.memberList[ msgRecvd.targetId].ip, self.memberList[ msgRecvd.targetId].port self.sendto(indirect_ack.SerializeToString(), ack_target_addr)