aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2025-12-10 13:52:52 -0800
committerGitHub <noreply@github.com>2025-12-10 13:52:52 -0800
commit924d410dc88fcf3e72fcaac5d37a526890bdba79 (patch)
treee57a2c1291b3a9dc4c6b3fd992e9fb6d71bf1b37
parent2fa36549dff81d07fe946178c6f2df8f4f249e16 (diff)
downloadseaweedfs-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.
-rw-r--r--weed/server/master_grpc_server.go29
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() {