diff --git a/pkg/core/region.go b/pkg/core/region.go index ba547ca6c4d0..450fab499e68 100644 --- a/pkg/core/region.go +++ b/pkg/core/region.go @@ -64,6 +64,7 @@ type RegionInfo struct { readBytes uint64 readKeys uint64 approximateSize int64 + approximateKvSize int64 approximateKeys int64 interval *pdpb.TimeInterval replicationStatus *replication_modepb.RegionReplicationStatus @@ -151,6 +152,7 @@ func RegionFromHeartbeat(heartbeat *pdpb.RegionHeartbeatRequest, opts ...RegionC if heartbeat.GetApproximateSize() > 0 && regionSize < EmptyRegionApproximateSize { regionSize = EmptyRegionApproximateSize } + regionKvSize := heartbeat.GetApproximateKvSize() / units.MiB region := &RegionInfo{ term: heartbeat.GetTerm(), @@ -164,6 +166,7 @@ func RegionFromHeartbeat(heartbeat *pdpb.RegionHeartbeatRequest, opts ...RegionC readBytes: heartbeat.GetBytesRead(), readKeys: heartbeat.GetKeysRead(), approximateSize: int64(regionSize), + approximateKvSize: int64(regionKvSize), approximateKeys: int64(heartbeat.GetApproximateKeys()), interval: heartbeat.GetInterval(), replicationStatus: heartbeat.GetReplicationStatus(), @@ -230,6 +233,7 @@ func (r *RegionInfo) Clone(opts ...RegionCreateOption) *RegionInfo { readBytes: r.readBytes, readKeys: r.readKeys, approximateSize: r.approximateSize, + approximateKvSize: r.approximateKvSize, approximateKeys: r.approximateKeys, interval: typeutil.DeepClone(r.interval, TimeIntervalFactory), replicationStatus: r.replicationStatus, @@ -520,6 +524,11 @@ func (r *RegionInfo) GetStorePeerApproximateKeys(storeID uint64) int64 { return r.approximateKeys } +// GetApproximateKvSize returns the approximate kv size of the region. +func (r *RegionInfo) GetApproximateKvSize() int64 { + return r.approximateKvSize +} + // GetApproximateKeys returns the approximate keys of the region. func (r *RegionInfo) GetApproximateKeys() int64 { return r.approximateKeys diff --git a/pkg/core/region_option.go b/pkg/core/region_option.go index 92820e3f5491..ba46fab94207 100644 --- a/pkg/core/region_option.go +++ b/pkg/core/region_option.go @@ -274,6 +274,13 @@ func SetApproximateSize(v int64) RegionCreateOption { } } +// SetApproximateKvSize sets the approximate size for the region. +func SetApproximateKvSize(v int64) RegionCreateOption { + return func(region *RegionInfo) { + region.approximateKvSize = v + } +} + // SetApproximateKeys sets the approximate keys for the region. func SetApproximateKeys(v int64) RegionCreateOption { return func(region *RegionInfo) { diff --git a/pkg/statistics/region.go b/pkg/statistics/region.go index 51030b676d2d..f39c58ed81cc 100644 --- a/pkg/statistics/region.go +++ b/pkg/statistics/region.go @@ -23,6 +23,7 @@ type RegionStats struct { Count int `json:"count"` EmptyCount int `json:"empty_count"` StorageSize int64 `json:"storage_size"` + UserStorageSize int64 `json:"user_storage_size"` StorageKeys int64 `json:"storage_keys"` StoreLeaderCount map[uint64]int `json:"store_leader_count"` StorePeerCount map[uint64]int `json:"store_peer_count"` @@ -57,10 +58,12 @@ func (s *RegionStats) Observe(r *core.RegionInfo) { s.Count++ approximateKeys := r.GetApproximateKeys() approximateSize := r.GetApproximateSize() + approximateKvSize := r.GetApproximateKvSize() if approximateSize <= core.EmptyRegionApproximateSize { s.EmptyCount++ } s.StorageSize += approximateSize + s.UserStorageSize += approximateKvSize s.StorageKeys += approximateKeys leader := r.GetLeader() if leader != nil { diff --git a/server/api/stats_test.go b/server/api/stats_test.go index 60391b68de0d..4003f53ed9e4 100644 --- a/server/api/stats_test.go +++ b/server/api/stats_test.go @@ -74,6 +74,7 @@ func (suite *statsTestSuite) TestRegionStats() { }, &metapb.Peer{Id: 101, StoreId: 1}, core.SetApproximateSize(100), + core.SetApproximateKvSize(80), core.SetApproximateKeys(50), ), core.NewRegionInfo( @@ -90,6 +91,7 @@ func (suite *statsTestSuite) TestRegionStats() { }, &metapb.Peer{Id: 105, StoreId: 4}, core.SetApproximateSize(200), + core.SetApproximateKvSize(180), core.SetApproximateKeys(150), ), core.NewRegionInfo( @@ -105,6 +107,7 @@ func (suite *statsTestSuite) TestRegionStats() { }, &metapb.Peer{Id: 107, StoreId: 5}, core.SetApproximateSize(1), + core.SetApproximateKvSize(1), core.SetApproximateKeys(1), ), core.NewRegionInfo( @@ -119,6 +122,7 @@ func (suite *statsTestSuite) TestRegionStats() { }, &metapb.Peer{Id: 108, StoreId: 4}, core.SetApproximateSize(50), + core.SetApproximateKvSize(30), core.SetApproximateKeys(20), ), } @@ -139,6 +143,7 @@ func (suite *statsTestSuite) TestRegionStats() { Count: 4, EmptyCount: 1, StorageSize: 351, + UserStorageSize: 291, StorageKeys: 221, StoreLeaderCount: map[uint64]int{1: 1, 4: 2, 5: 1}, StorePeerCount: map[uint64]int{1: 3, 2: 1, 3: 1, 4: 2, 5: 2}, @@ -152,6 +157,7 @@ func (suite *statsTestSuite) TestRegionStats() { Count: 2, EmptyCount: 1, StorageSize: 201, + UserStorageSize: 181, StorageKeys: 151, StoreLeaderCount: map[uint64]int{4: 1, 5: 1}, StorePeerCount: map[uint64]int{1: 2, 4: 1, 5: 2},