From 3311a8083c1df05836f4e8dcf6374b15adf63348 Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Thu, 29 Sep 2022 14:43:25 +0300
Subject: [PATCH] fix(grades): don't allow peers to change their Grade

---
 src/main.rs           |  3 +--
 src/traft/failover.rs | 17 +++++++++++++++--
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 951deff305..af5c7f5b3f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -19,7 +19,7 @@ use clap::StructOpt as _;
 use protobuf::Message as _;
 
 use crate::traft::InstanceId;
-use crate::traft::{Grade, LogicalClock, RaftIndex, TargetGrade, UpdatePeerRequest};
+use crate::traft::{LogicalClock, RaftIndex, TargetGrade, UpdatePeerRequest};
 use traft::error::Error;
 
 mod app;
@@ -828,7 +828,6 @@ fn postjoin(args: &args::Run, storage: RaftSpaceAccess, peer_storage: PeerStorag
 
         tlog!(Info, "initiating self-activation of {}", peer.instance_id);
         let req = UpdatePeerRequest::new(peer.instance_id, cluster_id)
-            .with_grade(Grade::Online)
             .with_target_grade(TargetGrade::Online)
             .with_failure_domain(args.failure_domain());
 
diff --git a/src/traft/failover.rs b/src/traft/failover.rs
index f53f2ac248..9d9671b49f 100644
--- a/src/traft/failover.rs
+++ b/src/traft/failover.rs
@@ -9,8 +9,8 @@ use crate::{stringify_cfunc, tarantool, tlog};
 use crate::traft::error::Error;
 use crate::traft::event;
 use crate::traft::node;
-use crate::traft::Grade;
 use crate::traft::Storage;
+use crate::traft::TargetGrade;
 use crate::traft::{UpdatePeerRequest, UpdatePeerResponse};
 
 pub fn on_shutdown() {
@@ -44,7 +44,8 @@ pub fn on_shutdown() {
         .cluster_id()
         .unwrap()
         .expect("cluster_id must be present");
-    let req = UpdatePeerRequest::new(peer.instance_id, cluster_id).with_grade(Grade::Offline);
+    let req = UpdatePeerRequest::new(peer.instance_id, cluster_id)
+        .with_target_grade(TargetGrade::Offline);
 
     let fn_name = stringify_cfunc!(raft_update_peer);
     // will run until we get successfully deactivate or tarantool shuts down
@@ -108,6 +109,18 @@ fn raft_update_peer(
         }));
     }
 
+    let mut req = req;
+    let instance_id = &*req.instance_id;
+    req.changes.retain(|ch| match ch {
+        super::PeerChange::Grade(grade) => {
+            tlog!(Warning, "attempt to change grade by peer";
+                "instance_id" => instance_id,
+                "grade" => grade.to_str(),
+            );
+            false
+        }
+        _ => true,
+    });
     node.handle_topology_request_and_wait(req.into())?;
     Ok(UpdatePeerResponse {})
 }
-- 
GitLab