From f28ea904fe663625e6e4b5da410da4cbb5e6161e Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 18 Oct 2026 21:07:32 -0700 Subject: [PATCH] master: echo the allocation bound to connected servers on change The bound was only sent at connect time or on digest mismatch, so a healthy stream never learned later increases. If the high-id server then went offline and the master lost state, survivors restored a stale bound and the id could be reissued. Resend the heartbeat response whenever the bound or topology id moved. --- weed/server/master_grpc_server.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 60aa07bc92..ff5be91f70 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -139,6 +139,8 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ } }() + var echoedVid needle.VolumeId + var echoedTopoId string for { heartbeat, err := stream.Recv() if err != nil { @@ -209,6 +211,7 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ glog.Warningf("SendHeartbeat.Send volume size to %s:%d %v", dn.Ip, dn.Port, err) return err } + echoedVid, echoedTopoId = ms.Topo.GetMaxVolumeId(), ms.Topo.GetTopologyId() stats.MasterReceivedHeartbeatCounter.WithLabelValues("dataNode").Inc() dn.Counter++ } @@ -345,6 +348,18 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ glog.Warningf("SendHeartbeat.Send resend request to %s:%d %v", dn.Ip, dn.Port, err) return err } + echoedVid, echoedTopoId = ms.Topo.GetMaxVolumeId(), ms.Topo.GetTopologyId() + } + + // Every connected server keeps a durable copy of the bound. Echo it + // whenever it moved so one veteran can restore it after state loss, + // even while the offline server that held the high ids never rejoins. + if vid, topoId := ms.Topo.GetMaxVolumeId(), ms.Topo.GetTopologyId(); vid != echoedVid || topoId != echoedTopoId { + if err := stream.Send(ms.heartbeatResponse()); err != nil { + glog.Warningf("SendHeartbeat.Send bound echo %v", err) + return err + } + echoedVid, echoedTopoId = vid, topoId } } }