From 9d013ea9b8edbd6cf3030730a8a0ab02d00a47da Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 2 Aug 2025 02:16:49 -0700 Subject: Admin UI: include ec shard sizes into volume server info (#7071) * show ec shards on dashboard, show max in its own column * master collect shard size info * master send shard size via VolumeList * change to more efficient shard sizes slice * include ec shard sizes into volume server info * Eliminated Redundant gRPC Calls * much more efficient * Efficient Counting: bits.OnesCount32() uses CPU-optimized instructions to count set bits in O(1) * avoid extra volume list call * simplify * preserve existing shard sizes * avoid hard coded value * Update weed/storage/erasure_coding/ec_volume_info.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update weed/admin/dash/volume_management.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update ec_volume_info.go * address comments * avoid duplicated functions * Update weed/admin/dash/volume_management.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * simplify * refactoring * fix compilation --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- weed/admin/dash/admin_data.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'weed/admin/dash/admin_data.go') diff --git a/weed/admin/dash/admin_data.go b/weed/admin/dash/admin_data.go index 7571bdf6a..b474437c4 100644 --- a/weed/admin/dash/admin_data.go +++ b/weed/admin/dash/admin_data.go @@ -23,6 +23,10 @@ type AdminData struct { MessageBrokers []MessageBrokerNode `json:"message_brokers"` DataCenters []DataCenter `json:"datacenters"` LastUpdated time.Time `json:"last_updated"` + + // EC shard totals for dashboard + TotalEcVolumes int `json:"total_ec_volumes"` // Total number of EC volumes across all servers + TotalEcShards int `json:"total_ec_shards"` // Total number of EC shards across all servers } // Object Store Users management structures @@ -98,6 +102,13 @@ func (s *AdminServer) GetAdminData(username string) (AdminData, error) { return AdminData{}, err } + // Get volume servers data with EC shard information + volumeServersData, err := s.GetClusterVolumeServers() + if err != nil { + glog.Errorf("Failed to get cluster volume servers: %v", err) + return AdminData{}, err + } + // Get master nodes status masterNodes := s.getMasterNodesStatus() @@ -122,6 +133,19 @@ func (s *AdminServer) GetAdminData(username string) (AdminData, error) { // Keep default value on error } + // Calculate EC shard totals + var totalEcVolumes, totalEcShards int + ecVolumeSet := make(map[uint32]bool) // To avoid counting the same EC volume multiple times + + for _, vs := range volumeServersData.VolumeServers { + totalEcShards += vs.EcShards + // Count unique EC volumes across all servers + for _, ecInfo := range vs.EcShardDetails { + ecVolumeSet[ecInfo.VolumeID] = true + } + } + totalEcVolumes = len(ecVolumeSet) + // Prepare admin data adminData := AdminData{ Username: username, @@ -130,11 +154,13 @@ func (s *AdminServer) GetAdminData(username string) (AdminData, error) { TotalSize: topology.TotalSize, VolumeSizeLimitMB: volumeSizeLimitMB, MasterNodes: masterNodes, - VolumeServers: topology.VolumeServers, + VolumeServers: volumeServersData.VolumeServers, FilerNodes: filerNodes, MessageBrokers: messageBrokers, DataCenters: topology.DataCenters, LastUpdated: topology.UpdatedAt, + TotalEcVolumes: totalEcVolumes, + TotalEcShards: totalEcShards, } return adminData, nil -- cgit v1.2.3