def _process_event(self, event): event = Event.from_map(event) current_status = self.__get_member_status(event.node) if not current_status: return if event.event == 'alive': if (current_status.status == 'suspect' and event.incarnation > current_status.incarnation): self.events.append(event) new_status = NodeStatus.from_event(event) self.__set_member_status(event.node, new_status) elif (current_status == 'alive' and event.incarnation > current_status.incarnation): self.events.append(event) new_status = NodeStatus.from_event(event) self.__set_member_status(event.node, new_status) elif event.event == 'suspect': if event.node == self.name: self.__incarnation += 1 self.events.append( Event('alive', self.name, self.__incarnation)) elif (current_status.status == 'suspect' and event.incarnation > current_status.incarnation): self.events.append(event) new_status = NodeStatus.from_event(event) self.__set_member_status(event.node, new_status) elif (current_status.status == 'alive' and event.incarnation >= current_status.incarnation): self.events.append(event) new_status = NodeStatus.from_event(event) self.__set_member_status(event.node, new_status) elif event.event == 'dead': if event.node == self.name: self.__incarnation += 1 self.events.append( Event('alive', self.name, self.__incarnation)) elif event.incarnation >= current_status.incarnation: self.events.append(event) self._handle_node_down(event.node) elif (event.event == 'join' and self.name != event.node and event.node not in self.node_status): self.events.append(event) self._handle_node_join(self, event.node)