Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
 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
Пример #6
0
 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
Пример #7
0
 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
Пример #8
0
 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
Пример #9
0
 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
Пример #10
0
 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)