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