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)
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()