Skip to content

Commit 99caa2c

Browse files
author
ukumawat
committed
HBASE-28158 handle split region scenarios and spotless
1 parent fac5055 commit 99caa2c

File tree

13 files changed

+60
-38
lines changed

13 files changed

+60
-38
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2019,8 +2019,7 @@ private void balanceThrottling(long nextBalanceStartTime, int maxRegionsInTransi
20192019
// Throttling by max number regions in transition
20202020
while (
20212021
!interrupted && maxRegionsInTransition > 0
2022-
&& this.assignmentManager.getRegionsInTransitionCount()
2023-
>= maxRegionsInTransition
2022+
&& this.assignmentManager.getRegionsInTransitionCount() >= maxRegionsInTransition
20242023
&& EnvironmentEdgeManager.currentTime() <= cutoffTime
20252024
) {
20262025
try {
@@ -3080,8 +3079,7 @@ public ClusterMetrics getClusterMetricsWithoutCoprocessor(EnumSet<Option> option
30803079
}
30813080
case REGIONS_IN_TRANSITION: {
30823081
if (assignmentManager != null) {
3083-
builder.setRegionsInTransition(
3084-
assignmentManager.getRegionsStateInTransition());
3082+
builder.setRegionsInTransition(assignmentManager.getRegionsStateInTransition());
30853083
}
30863084
break;
30873085
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import edu.umd.cs.findbugs.annotations.NonNull;
2121
import java.io.IOException;
2222
import java.util.ArrayList;
23+
import java.util.Arrays;
2324
import java.util.Collection;
2425
import java.util.Collections;
2526
import java.util.Comparator;
@@ -337,6 +338,8 @@ public void start() throws IOException, KeeperException {
337338
regionNode.setLastHost(lastHost);
338339
regionNode.setRegionLocation(regionLocation);
339340
regionNode.setOpenSeqNum(openSeqNum);
341+
regionInTransitionTracker.handleRegionStateNodeOperation(regionNode);
342+
340343
if (regionNode.getProcedure() != null) {
341344
regionNode.getProcedure().stateLoaded(this, regionNode);
342345
}
@@ -1801,7 +1804,7 @@ public void joinCluster() throws IOException {
18011804
*/
18021805
// Public so can be run by the Master as part of the startup. Needs hbase:meta to be online.
18031806
// Needs to be done after the table state manager has been started.
1804-
//TODO umesh we can update the rit map here
1807+
// TODO umesh we can update the rit map here
18051808
public void processOfflineRegions() {
18061809
TransitRegionStateProcedure[] procs =
18071810
regionStates.getRegionStateNodes().stream().filter(rsn -> rsn.isInState(State.OFFLINE))
@@ -2077,7 +2080,8 @@ public boolean hasRegionsInTransition() {
20772080
}
20782081

20792082
public List<RegionStateNode> getRegionsInTransition() {
2080-
return new ArrayList<RegionStateNode>(regionInTransitionTracker.getRegionsInTransition().values());
2083+
return new ArrayList<RegionStateNode>(
2084+
regionInTransitionTracker.getRegionsInTransition().values());
20812085
}
20822086

20832087
public boolean isRegionInTransition(final RegionInfo regionInfo) {
@@ -2107,7 +2111,6 @@ public SortedSet<RegionState> getRegionsInTransitionOrderedByTimestamp() {
21072111
return rit;
21082112
}
21092113

2110-
21112114
public List<RegionInfo> getAssignedRegions() {
21122115
return regionStates.getAssignedRegions();
21132116
}
@@ -2173,7 +2176,7 @@ private CompletableFuture<Void> transitStateAndUpdate(RegionStateNode regionNode
21732176
if (e != null) {
21742177
// revert
21752178
regionNode.setState(state);
2176-
}else{
2179+
} else {
21772180
regionInTransitionTracker.handleRegionStateNodeOperation(regionNode);
21782181
}
21792182
});
@@ -2340,6 +2343,9 @@ public void markRegionAsSplit(final RegionInfo parent, final ServerName serverNa
23402343
// it is a split parent. And usually only one of them can match, as after restart, the region
23412344
// state will be changed from SPLIT to CLOSED.
23422345
regionStateStore.splitRegion(parent, daughterA, daughterB, serverName, td);
2346+
regionInTransitionTracker.handleRegionStateNodeOperation(node);
2347+
regionInTransitionTracker.handleRegionStateNodeOperation(nodeA);
2348+
regionInTransitionTracker.handleRegionStateNodeOperation(nodeB);
23432349
if (shouldAssignFavoredNodes(parent)) {
23442350
List<ServerName> onlineServers = this.master.getServerManager().getOnlineServersList();
23452351
getFavoredNodePromoter().generateFavoredNodesForDaughter(onlineServers, parent, daughterA,
@@ -2363,9 +2369,12 @@ public void markRegionAsMerged(final RegionInfo child, final ServerName serverNa
23632369
for (RegionInfo ri : mergeParents) {
23642370
regionStates.deleteRegion(ri);
23652371
}
2366-
//TODO need to handle delete and new region
2372+
// TODO need to handle delete and new region
23672373
TableDescriptor td = master.getTableDescriptors().get(child.getTable());
23682374
regionStateStore.mergeRegions(child, mergeParents, serverName, td);
2375+
regionInTransitionTracker.handleRegionStateNodeOperation(node);
2376+
Arrays.stream(mergeParents).forEach(regionInfo -> regionInTransitionTracker
2377+
.handleRegionStateNodeOperation(regionStates.getRegionStateNode(regionInfo)));
23692378
if (shouldAssignFavoredNodes(child)) {
23702379
getFavoredNodePromoter().generateFavoredNodesForMergedRegion(child, mergeParents);
23712380
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
118
package org.apache.hadoop.hbase.master.assignment;
219

320
import java.util.List;
@@ -12,16 +29,16 @@
1229

1330
@InterfaceAudience.Private
1431
public class RegionInTransitionTracker {
32+
private static final Logger LOG = LoggerFactory.getLogger(RegionInTransitionTracker.class);
1533

1634
private final List<RegionState.State> DISABLE_TABLE_REGION_STATE =
1735
List.of(RegionState.State.OFFLINE, RegionState.State.CLOSED);
18-
private final List<RegionState.State> ENABLE_TABLE_REGION_STATE =
19-
List.of(RegionState.State.OPEN, RegionState.State.SPLIT, RegionState.State.MERGED);
2036

21-
private static final Logger LOG = LoggerFactory.getLogger(RegionInTransitionTracker.class);
37+
private final List<RegionState.State> ENABLE_TABLE_REGION_STATE = List.of(RegionState.State.OPEN);
2238

2339
private final ConcurrentSkipListMap<RegionInfo, RegionStateNode> regionInTransition =
2440
new ConcurrentSkipListMap<>(RegionInfo.COMPARATOR);
41+
2542
private final TableStateManager tableStateManager;
2643

2744
public RegionInTransitionTracker(TableStateManager tableStateManager) {
@@ -34,8 +51,13 @@ public boolean isRegionInTransition(final RegionInfo regionInfo) {
3451

3552
public void handleRegionStateNodeOperation(RegionStateNode regionStateNode) {
3653
RegionState.State currentState = regionStateNode.getState();
37-
38-
if (!getExceptedRegionStates(regionStateNode).contains(currentState)) {
54+
// if reiong is merged or split it should not be in RIT list
55+
if (
56+
currentState == RegionState.State.SPLIT || currentState == RegionState.State.MERGED
57+
|| regionStateNode.getRegionInfo().isSplit()
58+
) {
59+
removeRegionInTransition(regionStateNode.getRegionInfo());
60+
} else if (!getExceptedRegionStates(regionStateNode).contains(currentState)) {
3961
addRegionInTransition(regionStateNode);
4062
} else {
4163
removeRegionInTransition(regionStateNode.getRegionInfo());
@@ -47,8 +69,10 @@ public void handleRegionDelete(RegionStateNode regionStateNode) {
4769
}
4870

4971
private List<RegionState.State> getExceptedRegionStates(RegionStateNode regionStateNode) {
50-
if (tableStateManager.isTableState(regionStateNode.getTable(), TableState.State.ENABLED,
51-
TableState.State.ENABLING)) {
72+
if (
73+
tableStateManager.isTableState(regionStateNode.getTable(), TableState.State.ENABLED,
74+
TableState.State.ENABLING)
75+
) {
5276
return ENABLE_TABLE_REGION_STATE;
5377
} else {
5478
return DISABLE_TABLE_REGION_STATE;
@@ -57,13 +81,13 @@ private List<RegionState.State> getExceptedRegionStates(RegionStateNode regionSt
5781

5882
public void addRegionInTransition(final RegionStateNode regionStateNode) {
5983
if (regionInTransition.putIfAbsent(regionStateNode.getRegionInfo(), regionStateNode) == null) {
60-
LOG.info("Added to RIT list" + regionStateNode.getRegionInfo().getEncodedName());
84+
LOG.info("Added to RIT list " + regionStateNode.getRegionInfo().getEncodedName());
6185
}
6286
}
6387

6488
public void removeRegionInTransition(final RegionInfo regionInfo) {
6589
if (regionInTransition.remove(regionInfo) != null) {
66-
LOG.info("Removed from RIT list" + regionInfo);
90+
LOG.info("Removed from RIT list " + regionInfo.getEncodedName());
6791
}
6892
}
6993

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ public void clear() {
9494
}
9595

9696
public boolean isRegionInRegionStates(final RegionInfo hri) {
97-
return (regionsMap.containsKey(hri.getRegionName())
98-
|| regionOffline.containsKey(hri));
97+
return (regionsMap.containsKey(hri.getRegionName()) || regionOffline.containsKey(hri));
9998
}
10099

101100
// ==========================================================================
@@ -591,7 +590,6 @@ private boolean isTableDisabled(final TableStateManager tableStateManager,
591590
TableState.State.DISABLING);
592591
}
593592

594-
595593
// ==========================================================================
596594
// Region offline helpers
597595
// ==========================================================================

hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.apache.hadoop.hbase.master.RegionState;
3434
import org.apache.hadoop.hbase.master.assignment.AssignmentManager;
3535
import org.apache.hadoop.hbase.master.assignment.RegionStateNode;
36-
import org.apache.hadoop.hbase.master.assignment.RegionStates;
3736
import org.apache.hadoop.hbase.procedure2.Procedure;
3837
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
3938
import org.apache.hadoop.hbase.quotas.MasterQuotaManager;

hbase-server/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupInfoManagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,8 +1191,8 @@ public BalanceResponse balanceRSGroup(String groupName, BalanceRequest request)
11911191
Map<String, RegionState> groupRIT = rsGroupGetRegionsInTransition(groupName);
11921192
if (groupRIT.size() > 0 && !request.isIgnoreRegionsInTransition()) {
11931193
LOG.debug("Not running balancer because {} region(s) in transition: {}", groupRIT.size(),
1194-
StringUtils.abbreviate(masterServices.getAssignmentManager()
1195-
.getRegionsInTransition().toString(), 256));
1194+
StringUtils.abbreviate(
1195+
masterServices.getAssignmentManager().getRegionsInTransition().toString(), 256));
11961196
return responseBuilder.build();
11971197
}
11981198

hbase-server/src/test/java/org/apache/hadoop/hbase/HBaseTestingUtil.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3433,8 +3433,7 @@ public ExplainingPredicate<IOException> predicateNoRegionsInTransition() {
34333433
return new ExplainingPredicate<IOException>() {
34343434
@Override
34353435
public String explainFailure() throws IOException {
3436-
final AssignmentManager am =
3437-
getMiniHBaseCluster().getMaster().getAssignmentManager();
3436+
final AssignmentManager am = getMiniHBaseCluster().getMaster().getAssignmentManager();
34383437
return "found in transition: " + am.getRegionsInTransition().toString();
34393438
}
34403439

hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestSplitOrMergeStatus.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ public void testSplitRegionReplicaRitRecovery() throws Exception {
193193
ProcedureTestingUtility.waitProcedure(procExec, procId2);
194194
AssignmentTestingUtil.killRs(TEST_UTIL, serverName);
195195
Threads.sleepWithoutInterrupt(5000);
196-
boolean hasRegionsInTransition = TEST_UTIL.getMiniHBaseCluster().getMaster()
197-
.getAssignmentManager().hasRegionsInTransition();
196+
boolean hasRegionsInTransition =
197+
TEST_UTIL.getMiniHBaseCluster().getMaster().getAssignmentManager().hasRegionsInTransition();
198198
assertEquals(false, hasRegionsInTransition);
199199
}
200200

hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterBalanceThrottling.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ private Thread startBalancerChecker(final HMaster master, final AtomicInteger ma
126126
@Override
127127
public void run() {
128128
while (!stop.get()) {
129-
maxCount.set(Math.max(maxCount.get(),
130-
master.getAssignmentManager().getRegionsInTransitionCount()));
129+
maxCount.set(
130+
Math.max(maxCount.get(), master.getAssignmentManager().getRegionsInTransitionCount()));
131131
try {
132132
Thread.sleep(10);
133133
} catch (InterruptedException e) {

hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestFavoredStochasticLoadBalancer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,6 @@ public void testAllFavoredNodesDead() throws Exception {
381381
// Lets kill all the RS that are favored nodes for this region.
382382
stopServersAndWaitUntilProcessed(currentFN);
383383

384-
385384
final AssignmentManager am = master.getAssignmentManager();
386385
final RegionStates regionStates = am.getRegionStates();
387386
TEST_UTIL.waitFor(10000, new Waiter.Predicate<Exception>() {

0 commit comments

Comments
 (0)