diff --git a/cli/cmd/flashgroup.go b/cli/cmd/flashgroup.go index 71d1cadd2..9f7e236ef 100644 --- a/cli/cmd/flashgroup.go +++ b/cli/cmd/flashgroup.go @@ -297,7 +297,7 @@ func newCmdFlashGroupGet(client *master.MasterClient) *cobra.Command { tbl = table{formatFlashNodeSimpleViewTableTitle} } for _, flashNodeViewInfos := range fgView.ZoneFlashNodes { - tbl = showFlashNodesView(flashNodeViewInfos, showHitRate, tbl) + tbl = showFlashNodesView(flashNodeViewInfos, showHitRate, nil, tbl) } stdoutln(alignTable(tbl...)) return @@ -435,7 +435,7 @@ func newCmdFlashGroupSearch(client *master.MasterClient) *cobra.Command { stdoutlnf("Found in FlashGroup:%d", whichGroup) tbl := table{formatFlashNodeSimpleViewTableTitle} for _, fnNodes := range fg.ZoneFlashNodes { - tbl = showFlashNodesView(fnNodes, false, tbl) + tbl = showFlashNodesView(fnNodes, false, nil, tbl) } stdoutln(alignTable(tbl...)) return @@ -460,10 +460,12 @@ func newCmdFlashGroupGraph(client *master.MasterClient) *cobra.Command { set := make(map[uint32]struct{}) groups := make(map[uint64]proto.FlashGroupAdminView) groupn := make(map[uint64]int) + groupStatusMap := make(map[uint64]string) slots := make([]slotInfo, 0) for _, fg := range fgView.FlashGroups { groups[fg.ID] = fg groupn[fg.ID] = 0 + groupStatusMap[fg.ID] = fg.Status.String() for _, slot := range fg.Slots { if _, in := set[slot]; in { continue @@ -478,7 +480,6 @@ func newCmdFlashGroupGraph(client *master.MasterClient) *cobra.Command { sort.Slice(slots, func(i, j int) bool { return slots[i].slot < slots[j].slot }) - stdoutln("[Flash Groups]") tbl := table{arow("Slot", "ID", "Status", "Count", "Ref", "Proportion")} for idx, slot := range slots { @@ -508,11 +509,15 @@ func newCmdFlashGroupGraph(client *master.MasterClient) *cobra.Command { } } } + graphFlashNodeTitle := make([]interface{}, len(formatFlashNodeViewTableTitle)+1) + copy(graphFlashNodeTitle, formatFlashNodeViewTableTitle[:6]) + graphFlashNodeTitle[6] = "GroupStatus" + copy(graphFlashNodeTitle[7:], formatFlashNodeViewTableTitle[6:]) stdoutln("[FlashNodes Busy]") - tbl = showFlashNodesView(busyNodes, true, table{formatFlashNodeViewTableTitle}) + tbl = showFlashNodesView(busyNodes, true, groupStatusMap, table{graphFlashNodeTitle}) stdoutln(alignTable(tbl...)) stdoutln("[FlashNodes Idle]") - tbl = showFlashNodesView(idleNodes, true, table{formatFlashNodeViewTableTitle}) + tbl = showFlashNodesView(idleNodes, true, groupStatusMap, table{graphFlashNodeTitle}) stdoutln(alignTable(tbl...)) return }, diff --git a/cli/cmd/flashnode.go b/cli/cmd/flashnode.go index f45098b6e..af316dd6f 100644 --- a/cli/cmd/flashnode.go +++ b/cli/cmd/flashnode.go @@ -168,7 +168,7 @@ func newCmdFlashNodeList(client *master.MasterClient) *cobra.Command { stdoutln(fmt.Sprintf("[FlashNodes] active:%d", activeFilter)) tbl := table{formatFlashNodeViewTableTitle} for _, flashNodeViewInfos := range zoneFlashNodes { - tbl = showFlashNodesView(flashNodeViewInfos, true, tbl) + tbl = showFlashNodesView(flashNodeViewInfos, true, nil, tbl) } stdoutln(alignTable(tbl...)) return @@ -266,14 +266,24 @@ func newCmdFlashNodeHTTPInactiveDisk(client *master.MasterClient) *cobra.Command } } -func showFlashNodesView(flashNodeViewInfos []*proto.FlashNodeViewInfo, showStat bool, tbl table) table { +func showFlashNodesView(flashNodeViewInfos []*proto.FlashNodeViewInfo, showStat bool, groupStats map[uint64]string, tbl table) table { sort.Slice(flashNodeViewInfos, func(i, j int) bool { return flashNodeViewInfos[i].ID < flashNodeViewInfos[j].ID }) + var groupActiveInfo string for _, fn := range flashNodeViewInfos { + groupActiveInfo = "" + nodeInfo := arow(fn.ZoneName, fn.ID, fn.Addr, formatYesNo(fn.IsActive), formatYesNo(fn.IsEnable), + fn.FlashGroupID, formatTimeToString(fn.ReportTime)) + if groupStats != nil { + if v, ok := groupStats[fn.FlashGroupID]; ok { + groupActiveInfo = v + } + nodeInfo = arow(fn.ZoneName, fn.ID, fn.Addr, formatYesNo(fn.IsActive), formatYesNo(fn.IsEnable), + fn.FlashGroupID, groupActiveInfo, formatTimeToString(fn.ReportTime)) + } if !showStat { - tbl = tbl.append(arow(fn.ZoneName, fn.ID, fn.Addr, formatYesNo(fn.IsActive), formatYesNo(fn.IsEnable), - fn.FlashGroupID, formatTimeToString(fn.ReportTime))) + tbl = tbl.append(nodeInfo) continue } @@ -289,13 +299,15 @@ func showFlashNodesView(flashNodeViewInfos []*proto.FlashNodeViewInfo, showStat num = strconv.Itoa(stat.KeyNum) status = strconv.Itoa(stat.Status) } - if index == 0 { - tbl = tbl.append(arow(fn.ZoneName, fn.ID, fn.Addr, formatYesNo(fn.IsActive), formatYesNo(fn.IsEnable), - fn.FlashGroupID, formatTimeToString(fn.ReportTime), dataPath, hitRate, evicts, limit, maxAlloc, hasAlloc, num, status)) - } else { - tbl = tbl.append(arow("", "", "", "", "", - "", "", dataPath, hitRate, evicts, limit, maxAlloc, hasAlloc, num, status)) + if index != 0 { + if groupStats != nil { + nodeInfo = arow("", "", "", "", "", "", "", "") + } else { + nodeInfo = arow("", "", "", "", "", "", "") + } } + nodeInfo = append(nodeInfo, dataPath, hitRate, evicts, limit, maxAlloc, hasAlloc, num, status) + tbl = tbl.append(nodeInfo) } } return tbl diff --git a/cli/cmd/flashnode_test.go b/cli/cmd/flashnode_test.go index 92ad6f8c7..686c87411 100644 --- a/cli/cmd/flashnode_test.go +++ b/cli/cmd/flashnode_test.go @@ -79,7 +79,7 @@ func TestFmtFlashNode(t *testing.T) { stdoutln() for zone, nodes := range zoneNodes { stdoutln("[Flash Nodes]", zone) - tbl = showFlashNodesView(nodes, false, table{formatFlashNodeSimpleViewTableTitle}) + tbl = showFlashNodesView(nodes, false, nil, table{formatFlashNodeSimpleViewTableTitle}) stdoutln(alignTable(tbl...)) } @@ -87,7 +87,7 @@ func TestFmtFlashNode(t *testing.T) { stdoutln("[FlashNodes All]") tbl = table{formatFlashNodeSimpleViewTableTitle} for _, nodes := range zoneNodes { - tbl = showFlashNodesView(nodes, false, tbl) + tbl = showFlashNodesView(nodes, false, nil, tbl) } stdoutln(alignTable(tbl...)) }