From a852761a85426aff0a8e6cb110a74f45986f81cb Mon Sep 17 00:00:00 2001 From: lhy1024 Date: Fri, 21 Oct 2022 15:43:54 +0800 Subject: [PATCH] This is an automated cherry-pick of #5597 close tikv/pd#5598 Signed-off-by: ti-chi-bot --- server/statistics/store_load.go | 13 ++++++ tests/pdctl/hot/hot_test.go | 82 +++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/server/statistics/store_load.go b/server/statistics/store_load.go index 126665c9d23..bdf6d189ae8 100644 --- a/server/statistics/store_load.go +++ b/server/statistics/store_load.go @@ -34,10 +34,20 @@ func (li *StoreLoadDetail) GetID() uint64 { // ToHotPeersStat abstracts load information to HotPeersStat. func (li *StoreLoadDetail) ToHotPeersStat() *HotPeersStat { +<<<<<<< HEAD totalLoads := make([]float64, RegionStatCount) if len(li.HotPeers) == 0 { return &HotPeersStat{ TotalLoads: totalLoads, +======= + storeByteRate, storeKeyRate, storeQueryRate := li.LoadPred.Current.Loads[ByteDim], + li.LoadPred.Current.Loads[KeyDim], li.LoadPred.Current.Loads[QueryDim] + if len(li.HotPeers) == 0 { + return &HotPeersStat{ + StoreByteRate: storeByteRate, + StoreKeyRate: storeKeyRate, + StoreQueryRate: storeQueryRate, +>>>>>>> 8ed16608a (statistics: fix `ToHotPeersStat` result when `HotPeers` is empty (#5597)) TotalBytesRate: 0.0, TotalKeysRate: 0.0, TotalQueryRate: 0.0, @@ -59,11 +69,14 @@ func (li *StoreLoadDetail) ToHotPeersStat() *HotPeersStat { } } } +<<<<<<< HEAD b, k, q := GetRegionStatKind(kind, ByteDim), GetRegionStatKind(kind, KeyDim), GetRegionStatKind(kind, QueryDim) byteRate, keyRate, queryRate := totalLoads[b], totalLoads[k], totalLoads[q] storeByteRate, storeKeyRate, storeQueryRate := li.LoadPred.Current.Loads[ByteDim], li.LoadPred.Current.Loads[KeyDim], li.LoadPred.Current.Loads[QueryDim] +======= +>>>>>>> 8ed16608a (statistics: fix `ToHotPeersStat` result when `HotPeers` is empty (#5597)) return &HotPeersStat{ TotalLoads: totalLoads, diff --git a/tests/pdctl/hot/hot_test.go b/tests/pdctl/hot/hot_test.go index d938c74a517..3c7dad4f703 100644 --- a/tests/pdctl/hot/hot_test.go +++ b/tests/pdctl/hot/hot_test.go @@ -345,3 +345,85 @@ func (s *hotTestSuite) TestHistoryHotRegions(c *C) { c.Assert(e, IsNil) c.Assert(json.Unmarshal(output, &hotRegions), NotNil) } + +func TestHotWithoutHotPeer(t *testing.T) { + re := require.New(t) + statistics.Denoising = false + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + cluster, err := tests.NewTestCluster(ctx, 1, func(cfg *config.Config, serverName string) { cfg.Schedule.HotRegionCacheHitsThreshold = 0 }) + re.NoError(err) + err = cluster.RunInitialServers() + re.NoError(err) + cluster.WaitLeader() + pdAddr := cluster.GetConfig().GetClientURL() + cmd := pdctlCmd.GetRootCmd() + + stores := []*metapb.Store{ + { + Id: 1, + State: metapb.StoreState_Up, + LastHeartbeat: time.Now().UnixNano(), + }, + { + Id: 2, + State: metapb.StoreState_Up, + LastHeartbeat: time.Now().UnixNano(), + }, + } + + leaderServer := cluster.GetServer(cluster.GetLeader()) + re.NoError(leaderServer.BootstrapCluster()) + for _, store := range stores { + pdctl.MustPutStore(re, leaderServer.GetServer(), store) + } + timestamp := uint64(time.Now().UnixNano()) + load := 1024.0 + for _, store := range stores { + for i := 0; i < 5; i++ { + err := leaderServer.GetServer().GetRaftCluster().HandleStoreHeartbeat(&pdpb.StoreStats{ + StoreId: store.Id, + BytesRead: uint64(load * statistics.StoreHeartBeatReportInterval), + KeysRead: uint64(load * statistics.StoreHeartBeatReportInterval), + BytesWritten: uint64(load * statistics.StoreHeartBeatReportInterval), + KeysWritten: uint64(load * statistics.StoreHeartBeatReportInterval), + Capacity: 1000 * units.MiB, + Available: 1000 * units.MiB, + Interval: &pdpb.TimeInterval{ + StartTimestamp: timestamp + uint64(i*statistics.StoreHeartBeatReportInterval), + EndTimestamp: timestamp + uint64((i+1)*statistics.StoreHeartBeatReportInterval)}, + }) + re.NoError(err) + } + } + defer cluster.Destroy() + + // wait hot scheduler starts + time.Sleep(5000 * time.Millisecond) + { + args := []string{"-u", pdAddr, "hot", "read"} + output, err := pdctl.ExecuteCommand(cmd, args...) + hotRegion := statistics.StoreHotPeersInfos{} + re.NoError(err) + re.NoError(json.Unmarshal(output, &hotRegion)) + re.Equal(hotRegion.AsPeer[1].Count, 0) + re.Equal(0.0, hotRegion.AsPeer[1].TotalBytesRate) + re.Equal(load, hotRegion.AsPeer[1].StoreByteRate) + re.Equal(hotRegion.AsLeader[1].Count, 0) + re.Equal(0.0, hotRegion.AsLeader[1].TotalBytesRate) + re.Equal(load, hotRegion.AsLeader[1].StoreByteRate) + } + { + args := []string{"-u", pdAddr, "hot", "write"} + output, err := pdctl.ExecuteCommand(cmd, args...) + hotRegion := statistics.StoreHotPeersInfos{} + re.NoError(err) + re.NoError(json.Unmarshal(output, &hotRegion)) + re.Equal(hotRegion.AsPeer[1].Count, 0) + re.Equal(0.0, hotRegion.AsPeer[1].TotalBytesRate) + re.Equal(load, hotRegion.AsPeer[1].StoreByteRate) + re.Equal(hotRegion.AsLeader[1].Count, 0) + re.Equal(0.0, hotRegion.AsLeader[1].TotalBytesRate) + re.Equal(0.0, hotRegion.AsLeader[1].StoreByteRate) // write leader sum + } +}