Beispiel #1
0
 def get_MWOE(self):
     msg = Message()
     msg = msg.get_MWOE()
     for edge in self.mst_edges:
         if edge == self.parent_edge
             continue
         edge.send_message(self.process_id, msg)
     recieved_mwoe_msgs = []
     while len(recieved_mwoe_edges) != len(self.mst_edges) - 1:
         for edge in self.mst_edges:
             status, msg = edge.receive_message(self.process_id)
             if not status:
                 continue
             recieved_mwoe_msgs.append(msg)
         time.sleep(0.5)
     min_edge_id = None
     min_weight = 1000000
     min_process_id = None
     for msg in recieved_mwoe_msgs:
         if msg.msg < min_weight:
             min_weight = msg.msg
             min_edge_id = msg.edge_id
             min_process_id = msg.process_id
     for edge in self.non_mst_edges:
         if edge.get_weight() < min_weight:
             min_weight = edge.get_weight()
             min_edge_id = edge_id
             min_process_id = self.process_id
     ret_msg = Message()
     ret_msg = ret_msg.send_MWOE(min_weight, min_edge_id, self.process_id)
     return ret_msg
Beispiel #2
0
    def run_round(self):
        """Runs the current round before rporting back."""
        self.round_completed = False
        self.merge_mwoe_received = None
        self.clear_ret_messages()
        self.get_non_mst_edges()
        if self.leader:
            logging.info("finding mwoe")
            mwoe_msg = self.find_MWOE()
            logging.info("MWOE details: edge id: %s, weight: %f",
                         mwoe_msg.edge_id, mwoe_msg.msg)
            if mwoe_msg.edge_id is None:
                self.completed = True
                self.round_completed = True
                completed_msg = Message()
                completed_msg = completed_msg.get_completed_msg()
                for edge in self.mst_edges:
                    edge.send_message(completed_msg, self.process_id)
                return

            self.merge_mwoe_received_lock.acquire()
            self.merge_mwoe_received = mwoe_msg
            self.merge_mwoe_received_lock.release()
            # code for leader to send the mwoe request to its child
            merge_mwoe_msg = Message()
            merge_mwoe_msg = merge_mwoe_msg.merge_MWOE(mwoe_msg.edge_id,
                                                       mwoe_msg.process)
            self.log_mst_edges()
            for edge in self.mst_edges:
                edge.send_message(merge_mwoe_msg, self.process_id)

            if mwoe_msg.process == self.process_id:
                self.send_join_request(self.get_edge(mwoe_msg.edge_id))
                self.merge_mwoe(mwoe_msg)
Beispiel #3
0
 def unite_forest(self, msg):
     """This fuunction is called by leader process to update the component
     of all process in the current forest."""
     if msg.component_id > self.component_id:
         logging.info("Process %s is setting as non leader.",
                      str(self.process_id))
         self.update_leader(False)
     else:
         if self.level == msg.level:
             self.level += 1
         elif self.level < msg.level:
             self.level = msg.level
         msg = Message()
         msg = msg.update_component(self.level, self.component_id)
         for edge in self.mst_edges:
             edge.send_message(msg, self.process_id)
         seen_edges = []
         self.log_mst_edges()
         while len(seen_edges) != len(self.mst_edges):
             for edge in [e for e in self.mst_edges if e not in seen_edges]:
                 self.messages_lock.acquire()
                 if "ack_leader" in self.messages[edge.id] and\
                         len(self.messages[edge.id]["ack_leader"]):
                     logging.info("acknowledge received from edge: %s",
                                  edge.id)
                     msg = self.messages[edge.id]["ack_leader"].pop()
                     seen_edges.append(edge)
                 self.messages_lock.release()
         self.round_completed = True
Beispiel #4
0
    def run_round(self):
        """Runs the current round before rporting back."""
        self.round_completed = False
        self.merge_mwoe_received = None
        self.clear_ret_messages()
        self.get_non_mst_edges()
        if self.leader:
            logging.info("finding mwoe")
            mwoe_msg = self.find_MWOE()
            logging.info("MWOE details: edge id: %s, weight: %f",
                         mwoe_msg.edge_id, mwoe_msg.msg)
            if mwoe_msg.edge_id is None:
                self.completed = True
                self.round_completed = True
                completed_msg = Message()
                completed_msg = completed_msg.get_completed_msg()
                for edge in self.mst_edges:
                    edge.send_message(completed_msg, self.process_id)
                return

            self.merge_mwoe_received_lock.acquire()                
            self.merge_mwoe_received = mwoe_msg
            self.merge_mwoe_received_lock.release()
            # code for leader to send the mwoe request to its child
            merge_mwoe_msg = Message()
            merge_mwoe_msg = merge_mwoe_msg.merge_MWOE(mwoe_msg.edge_id,
                                                       mwoe_msg.process)
            self.log_mst_edges()
            for edge in self.mst_edges:
                edge.send_message(merge_mwoe_msg, self.process_id)

            if mwoe_msg.process == self.process_id:
                self.send_join_request(self.get_edge(mwoe_msg.edge_id))
                self.merge_mwoe(mwoe_msg)
Beispiel #5
0
 def merge_mwoe(self, mwoe_msg):
     while True:
         self.messages_lock.acquire()
         if "merge" in self.messages[mwoe_msg.edge_id] and\
                 len(self.messages[mwoe_msg.edge_id]['merge']):
             logging.info("Merge message received from edge %s",
                          mwoe_msg.edge_id)
             self.mst_edges.add(self.get_edge(mwoe_msg.edge_id))
             merge_msg = self.messages[mwoe_msg.edge_id]['merge'].pop()
             self.messages_lock.release()
             self.merge(merge_msg)
             break
         elif "deny_merge" in self.messages[mwoe_msg.edge_id] and\
                 len(self.messages[mwoe_msg.edge_id]['deny_merge']):
             logging.info(
                 "Deny merge message recieved for this round from edge %s.",
                 mwoe_msg.edge_id)
             deny_msg = self.messages[mwoe_msg.edge_id]['deny_merge'].pop()
             deny_msg = deny_msg.deny_merge_upward()
             self.round_completed = True
             self.messages_lock.release()
             for edge in self.mst_edges:
                 edge.send_message(deny_msg, self.process_id)
             break
         self.messages_lock.release()
         time.sleep(1)
Beispiel #6
0
 def handle_merge_request(self, msg, edge):
     """Handles the merge mwoe message."""
     logging.info("Merge message recieved from %s", edge.id)
     self.merge_mwoe_received_lock.acquire()
     k = False
     while self.merge_mwoe_received is None:
         self.merge_mwoe_received_lock.release()
         k = True
         logging.info(
             "process %s waiting to handle merge request from edge: %s",
             self.process_id, edge.id)
         time.sleep(1)
         self.merge_mwoe_received_lock.acquire()
     self.merge_mwoe_received_lock.release()
     if k:
         logging.info("process %s waiting to handle merge request finished",
                      self.process_id)
     logging.info("merge mwoe received from edgeid = %s",
                  self.merge_mwoe_received.edge_id)
     if self.merge_mwoe_received.edge_id != edge.id:
         logging.info("Deny message sending to edge: %s", edge.id)
         deny_msg = Message()
         deny_msg = deny_msg.deny_merge()
         edge.send_message(deny_msg, self.process_id)
     return
Beispiel #7
0
 def unite_forest(self, msg):
     """This fuunction is called by leader process to update the component
     of all process in the current forest."""
     if msg.component_id > self.component_id:
         logging.info("Process %s is setting as non leader.",
                      str(self.process_id))
         self.update_leader(False)
     else:
         if self.level == msg.level:
             self.level += 1
         elif self.level < msg.level:
             self.level = msg.level
         msg = Message()
         msg = msg.update_component(self.level, self.component_id)
         for edge in self.mst_edges:
             edge.send_message(msg, self.process_id)
         seen_edges = []
         self.log_mst_edges()
         while len(seen_edges) != len(self.mst_edges):
             for edge in [e for e in self.mst_edges if e not in seen_edges]:
                 self.messages_lock.acquire()
                 if "ack_leader" in self.messages[edge.id] and\
                         len(self.messages[edge.id]["ack_leader"]):
                     logging.info("acknowledge received from edge: %s", edge.id)
                     msg = self.messages[edge.id]["ack_leader"].pop()
                     seen_edges.append(edge)
                 self.messages_lock.release()
         self.round_completed = True
Beispiel #8
0
 def handle_merge_mwoe(self, mwoe_msg):
     """Handles the merge mwoe message."""
     for edge in [e for e in self.mst_edges if e != self.parent_edge]:
         edge.send_message(mwoe_msg, self.process_id)
     if mwoe_msg.process != self.process_id:
         logging.info("Returning since MWOE is not self MWOE")
         return
     self.send_join_request(self.get_edge(mwoe_msg.edge_id))
     self.merge_mwoe(mwoe_msg)
Beispiel #9
0
 def handle_merge_mwoe(self, mwoe_msg):
     """Handles the merge mwoe message."""
     for edge in [e for e in self.mst_edges if e != self.parent_edge]:
         edge.send_message(mwoe_msg, self.process_id)
     if mwoe_msg.process != self.process_id:
         logging.info("Returning since MWOE is not self MWOE")
         return
     self.send_join_request(self.get_edge(mwoe_msg.edge_id))
     self.merge_mwoe(mwoe_msg)
Beispiel #10
0
 def get_MWOE(self):
     msg = Message()
     msg = msg.get_MWOE()
     for edge in self.mst_edges:
         if edge == self.parent_edge:
             continue
         edge.send_message(msg, self.process_id)
     recieved_mwoe_msgs = []
     seen_edges = []
     if self.parent_edge:
         seen_edges.append(self.parent_edge)
     while len(seen_edges) != len(self.mst_edges):
         for edge in [e for e in self.mst_edges if e not in seen_edges]:
             self.messages_lock.acquire()
             if "ret_MWOE" in self.messages[edge.id] and\
                     len(self.messages[edge.id]["ret_MWOE"]) != 0:
                 mwoe_msg = self.messages[edge.id]["ret_MWOE"].pop()
                 recieved_mwoe_msgs.append(mwoe_msg)
                 seen_edges.append(edge)
             self.messages_lock.release()
         time.sleep(0.5)
     min_edge_id = None
     min_weight = 1000000
     min_process_id = None
     for msg in recieved_mwoe_msgs:
         if msg.msg < min_weight or (msg.msg == min_weight
                                     and msg.edge_id < min_edge_id):
             min_weight = msg.msg
             min_edge_id = msg.edge_id
             min_process_id = msg.process
     if self.process_id == "G":
         logging.info(
             "Received mwoe details: min_weight=%f, min_edge_id=%s",
             min_weight, min_edge_id)
     current_min_edge = self.get_min_edge()
     if current_min_edge and (current_min_edge.get_weight() < min_weight or
                              (current_min_edge.get_weight() == min_weight
                               and current_min_edge.id < min_edge_id)):
         min_weight = current_min_edge.get_weight()
         min_edge_id = current_min_edge.id
         min_process_id = self.process_id
     ret_msg = Message()
     ret_msg = ret_msg.send_MWOE(min_weight, min_edge_id, min_process_id)
     logging.info("MWOE Details: edge_id %s, edge_weight %f, process: %s",
                  min_edge_id, min_weight, min_process_id)
     return ret_msg
Beispiel #11
0
 def get_MWOE(self):
     msg = Message()
     msg = msg.get_MWOE()
     for edge in self.mst_edges:
         if edge == self.parent_edge:
             continue
         edge.send_message(msg, self.process_id)
     recieved_mwoe_msgs = []
     seen_edges = []
     if self.parent_edge:
         seen_edges.append(self.parent_edge)
     while len(seen_edges) != len(self.mst_edges):
         for edge in [e for e in self.mst_edges if e not in seen_edges]:
             self.messages_lock.acquire()
             if "ret_MWOE" in self.messages[edge.id] and\
                     len(self.messages[edge.id]["ret_MWOE"]) != 0:
                 mwoe_msg = self.messages[edge.id]["ret_MWOE"].pop()
                 recieved_mwoe_msgs.append(mwoe_msg)
                 seen_edges.append(edge)
             self.messages_lock.release()
         time.sleep(0.5)
     min_edge_id = None
     min_weight = 1000000
     min_process_id = None
     for msg in recieved_mwoe_msgs:
         if msg.msg < min_weight or (msg.msg == min_weight and msg.edge_id < min_edge_id):
             min_weight = msg.msg
             min_edge_id = msg.edge_id
             min_process_id = msg.process
     if self.process_id == "G":
         logging.info("Received mwoe details: min_weight=%f, min_edge_id=%s",min_weight,min_edge_id)
     current_min_edge = self.get_min_edge()
     if current_min_edge and (current_min_edge.get_weight() < min_weight or 
             (current_min_edge.get_weight() == min_weight and current_min_edge.id < min_edge_id)):
         min_weight = current_min_edge.get_weight()
         min_edge_id = current_min_edge.id
         min_process_id = self.process_id
     ret_msg = Message()
     ret_msg = ret_msg.send_MWOE(min_weight, min_edge_id, min_process_id)
     logging.info("MWOE Details: edge_id %s, edge_weight %f, process: %s",
                  min_edge_id, min_weight, min_process_id)
     return ret_msg
Beispiel #12
0
 def handle_merge_request(self, msg, edge):
     """Handles the merge mwoe message."""
     logging.info("Merge message recieved from %s", edge.id)
     self.merge_mwoe_received_lock.acquire()
     k = False
     while self.merge_mwoe_received is None:
         self.merge_mwoe_received_lock.release()
         k = True
         logging.info("process %s waiting to handle merge request from edge: %s", self.process_id, edge.id)
         time.sleep(1)
         self.merge_mwoe_received_lock.acquire()
     self.merge_mwoe_received_lock.release()
     if k:
         logging.info("process %s waiting to handle merge request finished", self.process_id)
     logging.info("merge mwoe received from edgeid = %s", self.merge_mwoe_received.edge_id)
     if self.merge_mwoe_received.edge_id != edge.id:
         logging.info("Deny message sending to edge: %s", edge.id)
         deny_msg = Message()
         deny_msg = deny_msg.deny_merge()
         edge.send_message(deny_msg, self.process_id)
     return
Beispiel #13
0
 def merge_mwoe(self, mwoe_msg):
     while True:
         self.messages_lock.acquire()
         if "merge" in self.messages[mwoe_msg.edge_id] and\
                 len(self.messages[mwoe_msg.edge_id]['merge']):
             logging.info("Merge message received from edge %s", mwoe_msg.edge_id)
             self.mst_edges.add(self.get_edge(mwoe_msg.edge_id))
             merge_msg = self.messages[mwoe_msg.edge_id]['merge'].pop()
             self.messages_lock.release()
             self.merge(merge_msg)
             break
         elif "deny_merge" in self.messages[mwoe_msg.edge_id] and\
                 len(self.messages[mwoe_msg.edge_id]['deny_merge']):
             logging.info("Deny merge message recieved for this round from edge %s.", mwoe_msg.edge_id)
             deny_msg = self.messages[mwoe_msg.edge_id]['deny_merge'].pop()
             deny_msg = deny_msg.deny_merge_upward()
             self.round_completed = True
             self.messages_lock.release()
             for edge in self.mst_edges:
                 edge.send_message(deny_msg, self.process_id)
             break        
         self.messages_lock.release()
         time.sleep(1)
Beispiel #14
0
 def process_update_component_msg(self, msg, in_edge):
     """Process the update component msg from the leader."""
     self.level = msg.level
     self.component_id = msg.component_id
     self.parent_edge = in_edge
     for edge in [e for e in self.mst_edges if e != in_edge]:
         edge.send_message(msg, self.process_id)
     seen_edges = [in_edge]
     for edge in self.mst_edges:
         logging.info("MST EDGE %s", str(edge))
     while len(seen_edges) != len(self.mst_edges):
         for edge in [e for e in self.mst_edges if e not in seen_edges]:
             self.messages_lock.acquire()
             if "ack_leader" in self.messages[edge.id] and\
                     len(self.messages[edge.id]["ack_leader"]):
                 ack_msg = self.messages[edge.id]["ack_leader"].pop()
                 seen_edges.append(edge)
             self.messages_lock.release()
         time.sleep(0.5)
     ack_msg = Message()
     ack_msg = ack_msg.acknowledge_leader()
     in_edge.send_message(ack_msg, self.process_id)
     logging.info("Acknowledge send through edge %s", in_edge.id)
     self.round_completed = True
Beispiel #15
0
 def process_update_component_msg(self, msg, in_edge):
     """Process the update component msg from the leader."""
     self.level = msg.level
     self.component_id = msg.component_id
     self.parent_edge = in_edge
     for edge in [e for e in self.mst_edges if e != in_edge]:
         edge.send_message(msg, self.process_id)
     seen_edges = [in_edge]
     for edge in self.mst_edges:
         logging.info("MST EDGE %s", str(edge))
     while len(seen_edges) != len(self.mst_edges):
         for edge in [e for e in self.mst_edges if e not in seen_edges]:
             self.messages_lock.acquire()
             if "ack_leader" in self.messages[edge.id] and\
                     len(self.messages[edge.id]["ack_leader"]):
                 ack_msg = self.messages[edge.id]["ack_leader"].pop()
                 seen_edges.append(edge)
             self.messages_lock.release()
         time.sleep(0.5)
     ack_msg = Message()
     ack_msg = ack_msg.acknowledge_leader()
     in_edge.send_message(ack_msg, self.process_id)
     logging.info("Acknowledge send through edge %s", in_edge.id)
     self.round_completed = True
Beispiel #16
0
 def message_listener(self):
     """Listens for the message from other process and stores the messages
     as required."""
     logging.info("listener Started.")
     sub_threads = []
     while True:
         logging.debug(self.messages)
         if not self.run_listener:
             break
         for edge in self.edges:
             status, msg = edge.receive_message(self.process_id)
             if msg is None:
                 continue
             if not status:
                 logging.warning("Unable to receive message")
                 continue
             logging.info("Message type: %s", msg.type)
             if msg.type == "test":
                 ret_msg = Message()
                 edge.send_message(
                     ret_msg.ret_test_message(self.component_id),
                     self.process_id)
                 logging.debug("Test message returned to process: %s",
                               str(self.get_edge_processid(edge)))
                 continue
             elif msg.type == "update_component":
                 sub_t = Thread(name=self.process_id + ".l.upd_comp",
                                target=self.process_update_component_msg,
                                args=(
                                    msg,
                                    edge,
                                ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "get_MWOE":
                 sub_t = Thread(name=self.process_id + ".l.mwoe",
                                target=self.handle_get_MWOE,
                                args=(edge, ))
                 sub_t.start()
                 sub_threads.append(sub_t)
             elif msg.type == "merge_MWOE":
                 self.merge_mwoe_received_lock.acquire()
                 self.merge_mwoe_received = msg
                 self.merge_mwoe_received_lock.release()
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_mwoe,
                                args=(msg, ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "merge":
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_request,
                                args=(
                                    msg,
                                    edge,
                                ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 # this msg should also be in messages dict, hence no
                 # continue statement here.
             elif msg.type == "merge_to_leader":
                 sub_t = Thread(name=self.process_id + ".l.merge_leader",
                                target=self.work_on_merge_to_leader_msg,
                                args=(msg, ))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "deny_merge_upward":
                 self.round_completed = True
                 for ed in [e for e in self.mst_edges if e != edge]:
                     ed.send_message(msg, self.process_id)
                 continue
             elif msg.type == "completed":
                 self.completed = True
                 self.round_completed = True
                 for ed in [e for e in self.mst_edges if e != edge]:
                     ed.send_message(msg, self.process_id)
                 continue
             self.messages_lock.acquire()
             if msg.type in self.messages[edge.id]:
                 self.messages[edge.id][msg.type].append(msg)
             else:
                 self.messages[edge.id][msg.type] = [msg]
             self.messages_lock.release()
         time.sleep(1)
     for t in sub_threads:
         t.join()
Beispiel #17
0
 def handle_get_MWOE(self, edge):
     """Handle the get MWOE request."""
     edge.send_message(self.find_MWOE(), self.process_id)
Beispiel #18
0
 def broadcast_messages(self, message):
     """Broadcasts the given message among all edges."""
     for edge in self.edges:
         edge.send_message(self.process_id, message)
Beispiel #19
0
 def broadcast_messages(self, message):
     """Broadcasts the given message among all edges."""
     for edge in self.edges:
         edge.send_message(message, self.process_id)
Beispiel #20
0
 def message_listener(self):
     """Listens for the message from other process and stores the messages
     as required."""
     logging.info("listener Started.")
     sub_threads = []
     while True:
         logging.debug(self.messages)
         if not self.run_listener:
             break
         for edge in self.edges:
             status, msg = edge.receive_message(self.process_id)
             if msg is None:
                 continue
             if not status:
                 logging.warning("Unable to receive message")
                 continue
             logging.info("Message type: %s", msg.type)
             if msg.type == "test":
                 ret_msg = Message()
                 edge.send_message(ret_msg.ret_test_message(self.component_id),
                                   self.process_id)
                 logging.debug("Test message returned to process: %s",
                              str(self.get_edge_processid(edge)))
                 continue
             elif msg.type == "update_component":
                 sub_t = Thread(name=self.process_id + ".l.upd_comp",
                                   target=self.process_update_component_msg,
                                   args=(msg, edge,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "get_MWOE":
                 sub_t = Thread(name=self.process_id + ".l.mwoe",
                                target=self.handle_get_MWOE,
                                args=(edge,))
                 sub_t.start()
                 sub_threads.append(sub_t)
             elif msg.type == "merge_MWOE":
                 self.merge_mwoe_received_lock.acquire()
                 self.merge_mwoe_received = msg
                 self.merge_mwoe_received_lock.release()
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_mwoe,
                                args=(msg,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "merge":
                 sub_t = Thread(name=self.process_id + ".l.merge",
                                target=self.handle_merge_request,
                                args=(msg, edge,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 # this msg should also be in messages dict, hence no
                 # continue statement here.
             elif msg.type == "merge_to_leader":
                 sub_t = Thread(name=self.process_id + ".l.merge_leader",
                                target=self.work_on_merge_to_leader_msg,
                                args=(msg,))
                 sub_t.start()
                 sub_threads.append(sub_t)
                 continue
             elif msg.type == "deny_merge_upward":
                 self.round_completed = True
                 for ed in [ e for e in self.mst_edges if e != edge ]:
                     ed.send_message(msg, self.process_id)
                 continue
             elif msg.type == "completed":
                 self.completed = True
                 self.round_completed = True
                 for ed in [e for e in self.mst_edges if e != edge]:
                     ed.send_message(msg, self.process_id)
                 continue
             self.messages_lock.acquire()
             if msg.type in self.messages[edge.id]:
                 self.messages[edge.id][msg.type].append(msg)
             else:
                 self.messages[edge.id][msg.type] = [msg]
             self.messages_lock.release()
         time.sleep(1)
     for t in sub_threads:
         t.join()
Beispiel #21
0
 def handle_get_MWOE(self, edge):
     """Handle the get MWOE request."""
     edge.send_message(self.find_MWOE(), self.process_id)