diff --git a/src/runtime2/component/consensus.rs b/src/runtime2/component/consensus.rs index 8ce9cc65383a4572dec0b20619390671d6e85d25..b699a836149175797f2696598280be651d0389af 100644 --- a/src/runtime2/component/consensus.rs +++ b/src/runtime2/component/consensus.rs @@ -322,7 +322,7 @@ impl Consensus { self.mode = Mode::SyncAwaitingSolution; let local_solution = self.generate_local_solution(comp_ctx, false); - let decision = self.handle_local_solution(sched_ctx, comp_ctx, comp_ctx.id, local_solution); + let decision = self.handle_local_solution(sched_ctx, comp_ctx, comp_ctx.id, local_solution, false); return decision; } @@ -335,7 +335,7 @@ impl Consensus { self.mode = Mode::SyncAwaitingSolution; let local_solution = self.generate_local_solution(comp_ctx, true); - let decision = self.handle_local_solution(sched_ctx, comp_ctx, comp_ctx.id, local_solution); + let decision = self.handle_local_solution(sched_ctx, comp_ctx, comp_ctx.id, local_solution, true); return decision; } @@ -457,7 +457,7 @@ impl Consensus { return SyncRoundDecision::None; }, SyncMessageContent::LocalSolution(solution_generator_id, local_solution) => { - return self.handle_local_solution(sched_ctx, comp_ctx, solution_generator_id, local_solution); + return self.handle_local_solution(sched_ctx, comp_ctx, solution_generator_id, local_solution, false); }, SyncMessageContent::PartialSolution(partial_solution) => { return self.handle_partial_solution(sched_ctx, comp_ctx, partial_solution); @@ -551,12 +551,18 @@ impl Consensus { })); } - fn handle_local_solution(&mut self, sched_ctx: &SchedulerCtx, comp_ctx: &CompCtx, solution_sender_id: CompId, solution: SyncLocalSolution) -> SyncRoundDecision { + fn handle_local_solution(&mut self, sched_ctx: &SchedulerCtx, comp_ctx: &CompCtx, solution_sender_id: CompId, solution: SyncLocalSolution, fail_if_empty: bool) -> SyncRoundDecision { if self.highest_id == comp_ctx.id { // We are the leader self.solution.combine_with_local_solution(solution_sender_id, solution); - let round_decision = self.solution.get_decision(); + let mut round_decision = self.solution.get_decision(); if round_decision != SyncRoundDecision::None { + if fail_if_empty && self.solution.matched_channels == 0 { + // TODO: Not sure about this, bit of a hack. Situation is that a component + // cannot interact with other components, but it is in a sync round, and has + // failed that sync round. + round_decision = SyncRoundDecision::Failure; + } self.broadcast_decision(sched_ctx, comp_ctx, round_decision); } return round_decision;