diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2025-12-10 13:52:52 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-10 13:52:52 -0800 |
| commit | 924d410dc88fcf3e72fcaac5d37a526890bdba79 (patch) | |
| tree | e57a2c1291b3a9dc4c6b3fd992e9fb6d71bf1b37 /weed/server/master_grpc_server.go | |
| parent | 2fa36549dff81d07fe946178c6f2df8f4f249e16 (diff) | |
| download | seaweedfs-924d410dc88fcf3e72fcaac5d37a526890bdba79.tar.xz seaweedfs-924d410dc88fcf3e72fcaac5d37a526890bdba79.zip | |
fix: weed shell can't connect to master when no volume servers (#7710)
fix: weed shell can't connect to master when no volume servers (#7701)
When there are no volume servers registered, the master's KeepConnected
handler would not send any initial message to clients. This caused the
shell's masterClient to block indefinitely on stream.Recv(), preventing
it from setting currentMaster and completing the connection handshake.
The fix ensures the master always sends at least one message with leader
information to newly connected clients, even when ToVolumeLocations()
returns an empty slice.
Diffstat (limited to 'weed/server/master_grpc_server.go')
| -rw-r--r-- | weed/server/master_grpc_server.go | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index e053d9ea7..14b74c037 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -284,15 +284,30 @@ func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServ } ms.deleteClient(clientName) }() - for i, message := range ms.Topo.ToVolumeLocations() { - if i == 0 { - if leader, err := ms.Topo.Leader(); err == nil { - message.Leader = string(leader) - } - } - if sendErr := stream.Send(&master_pb.KeepConnectedResponse{VolumeLocation: message}); sendErr != nil { + + // Send volume locations to the client + volumeLocations := ms.Topo.ToVolumeLocations() + if len(volumeLocations) == 0 { + // Always send at least one message with leader info so the client can unblock + leader, _ := ms.Topo.Leader() + if sendErr := stream.Send(&master_pb.KeepConnectedResponse{ + VolumeLocation: &master_pb.VolumeLocation{ + Leader: string(leader), + }, + }); sendErr != nil { return sendErr } + } else { + for i, message := range volumeLocations { + if i == 0 { + if leader, err := ms.Topo.Leader(); err == nil { + message.Leader = string(leader) + } + } + if sendErr := stream.Send(&master_pb.KeepConnectedResponse{VolumeLocation: message}); sendErr != nil { + return sendErr + } + } } go func() { |
