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