3939
4040import java .util .Collections ;
4141import java .util .Map ;
42- import java .util .Set ;
4342import java .util .function .Consumer ;
4443
4544public class DataNodeHeartbeatHandler implements AsyncMethodCallback <TDataNodeHeartbeatResp > {
@@ -53,7 +52,6 @@ public class DataNodeHeartbeatHandler implements AsyncMethodCallback<TDataNodeHe
5352 private final int nodeId ;
5453
5554 private final LoadManager loadManager ;
56- private final Set <TConsensusGroupId > regionGroupIdsOnDataNode ;
5755
5856 private final Map <Integer , Long > deviceNum ;
5957 private final Map <Integer , Long > timeSeriesNum ;
@@ -67,7 +65,6 @@ public class DataNodeHeartbeatHandler implements AsyncMethodCallback<TDataNodeHe
6765 public DataNodeHeartbeatHandler (
6866 int nodeId ,
6967 LoadManager loadManager ,
70- Set <TConsensusGroupId > regionGroupIdsOnDataNode ,
7168 Map <Integer , Long > deviceNum ,
7269 Map <Integer , Long > timeSeriesNum ,
7370 Map <Integer , Long > regionDisk ,
@@ -77,7 +74,6 @@ public DataNodeHeartbeatHandler(
7774
7875 this .nodeId = nodeId ;
7976 this .loadManager = loadManager ;
80- this .regionGroupIdsOnDataNode = regionGroupIdsOnDataNode ;
8177 this .deviceNum = deviceNum ;
8278 this .timeSeriesNum = timeSeriesNum ;
8379 this .regionDisk = regionDisk ;
@@ -88,11 +84,21 @@ public DataNodeHeartbeatHandler(
8884
8985 @ Override
9086 public void onComplete (TDataNodeHeartbeatResp heartbeatResp ) {
91- // Update NodeCache
87+ cacheNodeHeartbeatSample (heartbeatResp );
88+ cacheRegionGroupHeartbeatSamples (heartbeatResp );
89+ cacheUsageSamples (heartbeatResp );
90+ cachePipeHeartbeat (heartbeatResp );
91+ cacheConfirmedConfigNodeEndPoints (heartbeatResp );
92+ cacheRegionSizeSamples (heartbeatResp );
93+ }
94+
95+ private void cacheNodeHeartbeatSample (TDataNodeHeartbeatResp heartbeatResp ) {
9296 loadManager
9397 .getLoadCache ()
9498 .cacheDataNodeHeartbeatSample (nodeId , new NodeHeartbeatSample (heartbeatResp ));
99+ }
95100
101+ private void cacheRegionGroupHeartbeatSamples (TDataNodeHeartbeatResp heartbeatResp ) {
96102 RegionStatus regionStatus = RegionStatus .valueOf (heartbeatResp .getStatus ());
97103
98104 Map <TConsensusGroupId , Boolean > judgedLeaders =
@@ -101,53 +107,63 @@ public void onComplete(TDataNodeHeartbeatResp heartbeatResp) {
101107 : Collections .emptyMap ();
102108 judgedLeaders .forEach (
103109 (regionGroupId , isLeader ) -> {
104-
105- // Do not allow regions to inherit the Removing state from datanode
106- RegionStatus nextRegionStatus = regionStatus ;
107- if (nextRegionStatus == RegionStatus .Removing ) {
108- nextRegionStatus =
109- loadManager .getLoadCache ().getRegionCacheLastSampleStatus (regionGroupId , nodeId );
110- }
111-
112- // Update RegionGroupCache
113- loadManager
114- .getLoadCache ()
115- .cacheRegionHeartbeatSample (
116- regionGroupId ,
117- nodeId ,
118- new RegionHeartbeatSample (
119- heartbeatResp .getHeartbeatTimestamp (),
120- // Region will inherit DataNode's status
121- nextRegionStatus ),
122- false );
123-
124- boolean shouldCacheConsensusSample =
125- (TConsensusGroupType .SchemaRegion .equals (regionGroupId .getType ())
126- && SCHEMA_REGION_SHOULD_CACHE_CONSENSUS_SAMPLE )
127- || (TConsensusGroupType .DataRegion .equals (regionGroupId .getType ())
128- && DATA_REGION_SHOULD_CACHE_CONSENSUS_SAMPLE );
129- boolean hasConsensusLogicalTimestamp =
130- heartbeatResp .isSetConsensusLogicalTimeMap ()
131- && heartbeatResp .getConsensusLogicalTimeMap ().containsKey (regionGroupId );
132- if (shouldCacheConsensusSample
133- && hasConsensusLogicalTimestamp
134- && Boolean .TRUE .equals (isLeader )) {
135- loadManager
136- .getLoadCache ()
137- .cacheConsensusSample (
138- regionGroupId ,
139- new ConsensusGroupHeartbeatSample (
140- heartbeatResp .getConsensusLogicalTimeMap ().get (regionGroupId ), nodeId ));
141- }
110+ cacheRegionHeartbeatSample (heartbeatResp , regionStatus , regionGroupId );
111+ cacheConsensusSampleIfNeeded (heartbeatResp , regionGroupId , isLeader );
142112 });
113+ }
114+
115+ private void cacheRegionHeartbeatSample (
116+ TDataNodeHeartbeatResp heartbeatResp ,
117+ RegionStatus dataNodeRegionStatus ,
118+ TConsensusGroupId regionGroupId ) {
143119 loadManager
144120 .getLoadCache ()
145- .cacheUnreportedDataNodeRegionHeartbeatSamples (
121+ .cacheRegionHeartbeatSample (
122+ regionGroupId ,
146123 nodeId ,
147- regionGroupIdsOnDataNode ,
148- judgedLeaders .keySet (),
149- heartbeatResp .getHeartbeatTimestamp ());
124+ new RegionHeartbeatSample (
125+ heartbeatResp .getHeartbeatTimestamp (),
126+ getRegionHeartbeatStatus (regionGroupId , dataNodeRegionStatus )),
127+ false );
128+ }
150129
130+ private RegionStatus getRegionHeartbeatStatus (
131+ TConsensusGroupId regionGroupId , RegionStatus dataNodeRegionStatus ) {
132+ return dataNodeRegionStatus == RegionStatus .Removing
133+ ? loadManager .getLoadCache ().getRegionCacheLastSampleStatus (regionGroupId , nodeId )
134+ : dataNodeRegionStatus ;
135+ }
136+
137+ private void cacheConsensusSampleIfNeeded (
138+ TDataNodeHeartbeatResp heartbeatResp , TConsensusGroupId regionGroupId , Boolean isLeader ) {
139+ if (!Boolean .TRUE .equals (isLeader )
140+ || !shouldCacheConsensusSample (regionGroupId )
141+ || !hasConsensusLogicalTimestamp (heartbeatResp , regionGroupId )) {
142+ return ;
143+ }
144+
145+ loadManager
146+ .getLoadCache ()
147+ .cacheConsensusSample (
148+ regionGroupId ,
149+ new ConsensusGroupHeartbeatSample (
150+ heartbeatResp .getConsensusLogicalTimeMap ().get (regionGroupId ), nodeId ));
151+ }
152+
153+ private boolean shouldCacheConsensusSample (TConsensusGroupId regionGroupId ) {
154+ return (TConsensusGroupType .SchemaRegion .equals (regionGroupId .getType ())
155+ && SCHEMA_REGION_SHOULD_CACHE_CONSENSUS_SAMPLE )
156+ || (TConsensusGroupType .DataRegion .equals (regionGroupId .getType ())
157+ && DATA_REGION_SHOULD_CACHE_CONSENSUS_SAMPLE );
158+ }
159+
160+ private boolean hasConsensusLogicalTimestamp (
161+ TDataNodeHeartbeatResp heartbeatResp , TConsensusGroupId regionGroupId ) {
162+ return heartbeatResp .isSetConsensusLogicalTimeMap ()
163+ && heartbeatResp .getConsensusLogicalTimeMap ().containsKey (regionGroupId );
164+ }
165+
166+ private void cacheUsageSamples (TDataNodeHeartbeatResp heartbeatResp ) {
151167 if (heartbeatResp .getRegionDeviceUsageMap () != null ) {
152168 deviceNum .putAll (heartbeatResp .getRegionDeviceUsageMap ());
153169 deviceUsageRespProcess .accept (heartbeatResp .getRegionDeviceUsageMap ());
@@ -159,6 +175,9 @@ public void onComplete(TDataNodeHeartbeatResp heartbeatResp) {
159175 if (heartbeatResp .getRegionDisk () != null ) {
160176 regionDisk .putAll (heartbeatResp .getRegionDisk ());
161177 }
178+ }
179+
180+ private void cachePipeHeartbeat (TDataNodeHeartbeatResp heartbeatResp ) {
162181 if (heartbeatResp .getPipeMetaList () != null ) {
163182 pipeRuntimeCoordinator .parseHeartbeat (
164183 nodeId ,
@@ -167,12 +186,18 @@ public void onComplete(TDataNodeHeartbeatResp heartbeatResp) {
167186 heartbeatResp .getPipeRemainingEventCountList (),
168187 heartbeatResp .getPipeRemainingTimeList ());
169188 }
189+ }
190+
191+ private void cacheConfirmedConfigNodeEndPoints (TDataNodeHeartbeatResp heartbeatResp ) {
170192 if (heartbeatResp .isSetConfirmedConfigNodeEndPoints ()) {
171193 loadManager
172194 .getLoadCache ()
173195 .updateConfirmedConfigNodeEndPoints (
174196 nodeId , heartbeatResp .getConfirmedConfigNodeEndPoints ());
175197 }
198+ }
199+
200+ private void cacheRegionSizeSamples (TDataNodeHeartbeatResp heartbeatResp ) {
176201 if (heartbeatResp .isSetRegionDisk ()) {
177202 loadManager .getLoadCache ().updateRegionSizeMap (nodeId , heartbeatResp .getRegionDisk ());
178203 }
0 commit comments