From 7688e69146810505d875b0ede4a56c881395a0b7 Mon Sep 17 00:00:00 2001 From: Bruce Zou Date: Mon, 22 Jun 2026 14:11:12 +0800 Subject: [PATCH] use Leader() instead of MaybeLeader() in SendHeartbeat (#10029) During leader election, MaybeLeader() returns empty string immediately (non-blocking), causing master to return NotLeaderError without sending HeartbeatResponse.Leader. Volume servers depend on HeartbeatResponse.Leader to discover the new leader address, so they keep retrying the old leader and cannot switch. Switching to Leader() restores the 20-second exponential backoff retry behavior, ensuring volume servers receive the new leader address as soon as election completes. --- weed/server/master_grpc_server.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 33c1ec37c..9acc37e44 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -120,9 +120,9 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ if !ms.Topo.IsLeader() { // tell the volume servers about the leader - newLeader, err := ms.Topo.MaybeLeader() - if err != nil || newLeader == "" { - glog.Warningf("SendHeartbeat find leader: %v, %v", newLeader, err) + newLeader, err := ms.Topo.Leader() + if err != nil { + glog.Warningf("SendHeartbeat find leader: %v", err) return raft.NotLeaderError } if err := stream.Send(&master_pb.HeartbeatResponse{