From 3427af801b6577d8220fed6f70d6e74fc8ca8e7d Mon Sep 17 00:00:00 2001 From: Georgy Moshkin <gmoshkin@picodata.io> Date: Tue, 8 Nov 2022 18:54:04 +0300 Subject: [PATCH] refactor: simplify conf_change even more --- src/traft/governor.rs | 47 +++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/src/traft/governor.rs b/src/traft/governor.rs index 05f801b342..dce87f0ee3 100644 --- a/src/traft/governor.rs +++ b/src/traft/governor.rs @@ -77,14 +77,17 @@ pub(crate) fn raft_conf_change( // Remove / replace voters for voter_id in raft_conf.voters.clone().iter() { - let peer = raft_conf.all.get(voter_id); - match peer { - #[rustfmt::skip] - Some(Peer {target_grade: TargetGrade::Online, ..}) => { + let Some(peer) = raft_conf.all.get(voter_id) else { + // Nearly impossible, but rust forces me to check it. + let ccs = raft_conf.change_single(RemoveNode, *voter_id); + changes.push(ccs); + continue; + }; + match peer.target_grade { + TargetGrade::Online => { // Do nothing } - #[rustfmt::skip] - Some(peer @ Peer {target_grade: TargetGrade::Offline, ..}) => { + TargetGrade::Offline => { // A voter goes offline. Replace it with // another online instance if possible. let Some(replacement) = peers.iter().find(|peer| { @@ -96,17 +99,11 @@ pub(crate) fn raft_conf_change( let ccs2 = raft_conf.change_single(AddNode, replacement.raft_id); changes.extend_from_slice(&[ccs1, ccs2]); } - #[rustfmt::skip] - Some(peer @ Peer {target_grade: TargetGrade::Expelled, ..}) => { + TargetGrade::Expelled => { // Expelled instance is removed unconditionally. let ccs = raft_conf.change_single(RemoveNode, peer.raft_id); changes.push(ccs); } - None => { - // Nearly impossible, but rust forces me to check it. - let ccs = raft_conf.change_single(RemoveNode, *voter_id); - changes.push(ccs); - } } } @@ -119,27 +116,21 @@ pub(crate) fn raft_conf_change( // Remove unknown / expelled learners for learner_id in raft_conf.learners.clone().iter() { - let peer = raft_conf.all.get(learner_id); - match peer { - #[rustfmt::skip] - Some(Peer {target_grade: TargetGrade::Online, ..}) => { - // Do nothing - } - #[rustfmt::skip] - Some(Peer {target_grade: TargetGrade::Offline, ..}) => { + let Some(peer) = raft_conf.all.get(learner_id) else { + // Nearly impossible, but rust forces me to check it. + let ccs = raft_conf.change_single(RemoveNode, *learner_id); + changes.push(ccs); + continue; + }; + match peer.target_grade { + TargetGrade::Online | TargetGrade::Offline => { // Do nothing } - #[rustfmt::skip] - Some(peer @ Peer {target_grade: TargetGrade::Expelled, ..}) => { + TargetGrade::Expelled => { // Expelled instance is removed unconditionally. let ccs = raft_conf.change_single(RemoveNode, peer.raft_id); changes.push(ccs); } - None => { - // Nearly impossible, but rust forces me to check it. - let ccs = raft_conf.change_single(RemoveNode, *learner_id); - changes.push(ccs); - } } } -- GitLab