From fcd95d60216a6a081f5b9f00a5d82b53a9b53549 Mon Sep 17 00:00:00 2001 From: Lauri Gustafsson Date: Mon, 16 Dec 2024 11:45:09 +0200 Subject: [PATCH] server: Integrate Message::SetMajority to Message::Coordinator (v0.11.0) --- Cargo.lock | 2 +- server-node/Cargo.toml | 2 +- server-node/src/server.rs | 12 +++++++----- server-node/src/server/peer/message.rs | 5 +++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f621678..7dfb524 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -305,7 +305,7 @@ dependencies = [ [[package]] name = "server-node" -version = "0.10.0" +version = "0.11.0" dependencies = [ "ciborium", "protocol", diff --git a/server-node/Cargo.toml b/server-node/Cargo.toml index 4dfd01c..e4fb3de 100644 --- a/server-node/Cargo.toml +++ b/server-node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "server-node" -version = "0.10.0" +version = "0.11.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/server-node/src/server.rs b/server-node/src/server.rs index 06d6dbd..91d83db 100644 --- a/server-node/src/server.rs +++ b/server-node/src/server.rs @@ -235,8 +235,7 @@ impl Server { self.handle_majority(majority); for peer in self.peers.values() { - peer.send_message(Message::Coordinator); - peer.send_message(Message::SetMajority(self.majority)); + peer.send_message(Message::Coordinator { majority }); } #[allow( @@ -330,6 +329,9 @@ impl Server { self.become_coordinator(); } + // If coordinator was lost, we need to hold an election again. + // It's possible, that during this election, the majority-bit is incorrect. + // This is acceptable, because DHCP clients should never use conflicting addresses. if Some(peer_id) == self.coordinator_id { self.start_election(); } @@ -440,10 +442,9 @@ impl Server { Message::Heartbeat => console::debug!("Received heartbeat from {sender_id}"), Message::Election => self.handle_election(sender_id), Message::Okay => self.handle_okay(sender_id), - Message::Coordinator => self.handle_coordinator(sender_id), + Message::Coordinator { majority } => self.handle_coordinator(sender_id, majority), Message::Lease(lease) => self.handle_add_lease(lease), Message::SetPool(update) => self.handle_set_pool(update), - Message::SetMajority(majority) => self.handle_majority(majority), Message::Join(..) | Message::JoinAck { .. } => { console::warning!("Server received unexpected {message:?} from peer {sender_id}"); } @@ -473,10 +474,11 @@ impl Server { } } - fn handle_coordinator(&mut self, sender_id: peer::Id) { + fn handle_coordinator(&mut self, sender_id: peer::Id, majority: bool) { console::log!("Recognizing {sender_id} as Coordinator"); self.coordinator_id = Some(sender_id); self.election_state = ElectionState::Follower; + self.handle_majority(majority); if sender_id < self.config.id { self.start_election(); } diff --git a/server-node/src/server/peer/message.rs b/server-node/src/server/peer/message.rs index 78ebd69..9ffc653 100644 --- a/server-node/src/server/peer/message.rs +++ b/server-node/src/server/peer/message.rs @@ -25,10 +25,11 @@ pub enum Message { Heartbeat, Election, Okay, - Coordinator, + Coordinator { + majority: bool, + }, Lease(Lease), SetPool(Ipv4Range), - SetMajority(bool), } impl RecvCbor for TcpStream {}