diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6df5a998..dfd9aaf8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,7 @@ jobs: build_and_test: name: Build and test runs-on: ubuntu-latest + continue-on-error: ${{ matrix.toolchain != 'stable' }} strategy: matrix: toolchain: [stable, beta] diff --git a/src/pbft/mod.rs b/src/pbft/mod.rs index b2bf91e6..d0e5d737 100644 --- a/src/pbft/mod.rs +++ b/src/pbft/mod.rs @@ -575,10 +575,7 @@ impl OnEvent for Replica, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { warn!("progress prepared {op_num}"); let entry = &self.log[op_num as usize]; let pre_prepare = entry @@ -1032,10 +1029,8 @@ impl OnEvent for Replica, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { + // TODO anyhow::bail!("{:?} timeout", StateTransfer(op_num)) } } @@ -1045,10 +1040,7 @@ impl OnEvent> for Replica, _: &mut impl Timer, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { if let Some(new_view) = self.new_views.get(&query_new_view.view_num) { self.net.send(query_new_view.replica_id, new_view.clone())? } @@ -1064,10 +1056,7 @@ impl OnEvent for Replica, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { warn!("[{}] do view change for view {view_num}", self.id); assert!(view_num >= self.view_num); self.view_num = view_num; @@ -1085,10 +1074,7 @@ impl OnEvent for Replica, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { self.do_view_change() } } @@ -1122,10 +1108,7 @@ impl OnEvent> for Replica, timer: &mut impl Timer, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { if view_change.view_num == self.view_num { self.net.send(All, view_change.clone())?; self.insert_view_change(view_change, timer)? @@ -1159,10 +1142,7 @@ impl OnEvent>> &mut self, Recv(view_change): Recv>, _: &mut impl Timer, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { if view_change.view_num < self.view_num { return Ok(()); } @@ -1185,10 +1165,7 @@ impl OnEvent> &mut self, Verified(view_change): Verified, timer: &mut impl Timer, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { self.insert_view_change(view_change, timer) } } @@ -1236,15 +1213,19 @@ fn pre_prepares_for_view_changes( Ok(pre_prepares) } +impl Replica { + fn have_entered(&self, view_num: u32) -> bool { + self.view_num > view_num || self.view_num == view_num && !self.view_change() + } +} + impl Replica { fn insert_view_change( &mut self, view_change: Verifiable, timer: &mut impl Timer, ) -> anyhow::Result<()> { - if view_change.view_num < self.view_num - || view_change.view_num == self.view_num && !self.view_change() - { + if self.have_entered(view_change.view_num) { return Ok(()); } let view_change_quorum = self.view_changes.entry(view_change.view_num).or_default(); @@ -1293,10 +1274,7 @@ impl OnEvent> for Replica, timer: &mut impl Timer, - ) -> anyhow::Result<()> - where - Self: Sized, - { + ) -> anyhow::Result<()> { if self.view_num == new_view.view_num { self.net.send(All, new_view.clone())?; self.enter_view(new_view, timer)? @@ -1311,7 +1289,7 @@ impl Replica { new_view: Verifiable, timer: &mut impl Timer, ) -> anyhow::Result<()> { - assert!(new_view.view_num >= self.view_num); + assert!(!self.have_entered(new_view.view_num)); self.view_num = new_view.view_num; assert!(self.view_change()); for pre_prepare in &new_view.pre_prepares { @@ -1379,13 +1357,8 @@ impl OnEvent>> &mut self, Recv(new_view): Recv>, _: &mut impl Timer, - ) -> anyhow::Result<()> - where - Self: Sized, - { - if self.view_num > new_view.view_num - || self.view_num == new_view.view_num && !self.view_change() - { + ) -> anyhow::Result<()> { + if self.have_entered(new_view.view_num) { return Ok(()); } let num_replica = self.num_replica; @@ -1413,10 +1386,9 @@ impl OnEvent>> anyhow::Ok(()) }; if do_verify().is_ok() { - sender.send(Verified(new_view)) - } else { - Ok(()) + sender.send(Verified(new_view))? } + Ok(()) })) } } @@ -1426,16 +1398,11 @@ impl OnEvent> for Replica, timer: &mut impl Timer, - ) -> anyhow::Result<()> - where - Self: Sized, - { - if self.view_num > new_view.view_num - || self.view_num == new_view.view_num && !self.view_change() - { - return Ok(()); + ) -> anyhow::Result<()> { + if !self.have_entered(new_view.view_num) { + self.enter_view(new_view, timer)? } - self.enter_view(new_view, timer) + Ok(()) } } @@ -1504,7 +1471,7 @@ pub fn to_replica_on_buf( buf: &[u8], sender: &mut impl SendReplicaRecvEvent, ) -> anyhow::Result<()> { - deserialize::>(buf)?.send(sender) + deserialize::>(buf)?.send(sender) } #[cfg(test)]