diff --git a/weed/admin/dash/admin_data.go b/weed/admin/dash/admin_data.go index 1b689b6dd..f0324a0d7 100644 --- a/weed/admin/dash/admin_data.go +++ b/weed/admin/dash/admin_data.go @@ -282,7 +282,7 @@ func (s *AdminServer) ShowOverview(w http.ResponseWriter, r *http.Request) { // dashboard never shows an empty list. func (s *AdminServer) getMasterNodesStatus() []MasterNode { masterMap := make(map[string]MasterNode) - raftCallSucceeded := false + raftReturnedEmpty := false err := s.WithMasterClient(func(client master_pb.SeaweedClient) error { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) @@ -291,7 +291,7 @@ func (s *AdminServer) getMasterNodesStatus() []MasterNode { if err != nil { return err } - raftCallSucceeded = true + raftReturnedEmpty = len(resp.ClusterServers) == 0 for _, server := range resp.ClusterServers { // Skip malformed raft addresses instead of letting an // unconvertible value into masterMap. @@ -323,10 +323,11 @@ func (s *AdminServer) getMasterNodesStatus() []MasterNode { addr := pb.ServerAddress(currentMaster).ToHttpAddress() // A successful empty raft response means raft is not initialized // (standalone/non-raft cluster); the only master IS the leader. - // A failed RPC means connectivity issue; do not claim leadership. + // A failed RPC or a nonempty response whose entries were all + // rejected must not claim leadership. masterMap[addr] = MasterNode{ Address: addr, - IsLeader: raftCallSucceeded, + IsLeader: raftReturnedEmpty, } } } diff --git a/weed/admin/dash/admin_server.go b/weed/admin/dash/admin_server.go index c99d92632..d4485bfcf 100644 --- a/weed/admin/dash/admin_server.go +++ b/weed/admin/dash/admin_server.go @@ -1341,11 +1341,13 @@ func (s *AdminServer) GetClusterMasters() (*ClusterMastersData, error) { } // Then, get additional master information from Raft cluster + raftReturnedEmpty := false err = s.WithMasterClient(func(client master_pb.SeaweedClient) error { resp, err := client.RaftListClusterServers(context.Background(), &master_pb.RaftListClusterServersRequest{}) if err != nil { return err } + raftReturnedEmpty = len(resp.ClusterServers) == 0 // Process each raft server for _, server := range resp.ClusterServers { @@ -1401,10 +1403,12 @@ func (s *AdminServer) GetClusterMasters() (*ClusterMastersData, error) { if currentMaster != "" { masters = append(masters, MasterInfo{ Address: pb.ServerAddress(currentMaster).ToHttpAddress(), - IsLeader: true, + IsLeader: raftReturnedEmpty, Suffrage: "Voter", }) - leaderCount = 1 + if raftReturnedEmpty { + leaderCount = 1 + } } }