コード例 #1
0
 def test_auto_max_case(self):
     view_est_mod = ViewEstablishmentModule(0, self.resolver, 2, 0)
     pred_module = PredicatesAndAction(view_est_mod, 0, self.resolver, 2, 0)
     # Should return the max case for each of the phases
     self.assertEqual(pred_module.auto_max_case(0), 3)
     self.assertEqual(pred_module.auto_max_case(1), 3)
コード例 #2
0
class ViewEstablishmentModule(AlgorithmModule):
    """Models the View Establishment module."""
    def __init__(self, id, resolver, n, f):
        """Initializes the module."""
        self.resolver = resolver
        self.lock = resolver.view_est_lock
        self.phs = [0 for i in range(n)]
        self.witnesses = [False for i in range(n)]
        self.pred_and_action = PredicatesAndAction(self, id, self.resolver, n,
                                                   f)
        self.echo = [{
            VIEWS: {},
            PHASE: 0,
            WITNESSES: {},
            VCHANGE: None
        } for i in range(n)]

        self.number_of_nodes = n
        self.id = id
        self.number_of_byzantine = f
        self.witnesses_set = set()

        # Injection of starting state for integration tests
        if os.getenv("INTEGRATION_TEST") or os.getenv("INJECT_START_STATE"):
            start_state = conf.get_start_state()
            if (start_state is not {} and str(self.id) in start_state and
                    "VIEW_ESTABLISHMENT_MODULE" in start_state[str(self.id)]):
                data = start_state[str(self.id)]["VIEW_ESTABLISHMENT_MODULE"]
                if data is not None:
                    logger.warning("Injecting start state")
                    if "phs" in data:
                        self.phs = deepcopy(data["phs"])
                    if "views" in data:
                        self.pred_and_action.views = deepcopy(data["views"])
                    if "witnesses" in data:
                        self.witnesses = deepcopy(data["witnesses"])
                    if "echo" in data:
                        self.echo = deepcopy(data["echo"])
                    if "vChange" in data:
                        self.pred_and_action.vChange = deepcopy(
                            data["vChange"])

    def run(self, testing=False):
        """Called whenever the module is launched in a separate thread."""
        sec = os.getenv("INTEGRATION_TEST_SLEEP")
        time.sleep(int(sec) if sec is not None else 0)

        # block until system is ready
        while not testing and not self.resolver.system_running():
            time.sleep(0.1)

        while True:
            self.lock.acquire()
            # Metric time
            start_time = time.time()
            if (self.pred_and_action.need_reset()):
                self.pred_and_action.reset_all()
            self.witnesses[self.id] = self.noticed_recent_value()
            self.witnesses_set = self.witnesses_set.union(self.get_witnesses())
            if (self.witnes_seen()):
                case = 0
                # Find the current case by testing the predicates and
                # moving to next case if not fulfilled
                while (self.pred_and_action.auto_max_case(self.phs[self.id]) >=
                       case and not (self.pred_and_action.automation(
                           ViewEstablishmentEnums.PREDICATE, self.phs[self.id],
                           case))):
                    case += 1
                # Onces a predicates is fulfilled, perfom action if valid case
                if (self.pred_and_action.auto_max_case(self.phs[self.id]) >=
                        case):
                    self.pred_and_action.automation(
                        ViewEstablishmentEnums.ACTION, self.phs[self.id], case)

            # Emit run time metric
            run_time = time.time() - start_time
            run_method_time.labels(
                self.id, Module.VIEW_ESTABLISHMENT_MODULE).set(run_time)
            self.lock.release()
            # Stopping the while loop, used for testing purpose
            if testing:
                break

            # Send message to all other processors
            self.send_msg()
            throttle()