Skip to content

Commit 44c6b43

Browse files
author
Mihir Monani
committed
Implementing as isolate_regions operation instead of unload opration
1 parent 13837aa commit 44c6b43

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,25 @@ public boolean unloadFromRack()
424424
}
425425

426426
private boolean unloadRegions(boolean unloadFromRack)
427+
throws ExecutionException, InterruptedException, TimeoutException {
428+
return unloadRegions(unloadFromRack, null);
429+
}
430+
431+
/**
432+
* Isolated regions specified in {@link #isolateRegionIdArray} on {@link #hostname} in ack Mode
433+
* and Unload regions from given {@link #hostname} using ack/noAck mode and {@link #maxthreads}.
434+
* In noAck mode we do not make sure that region is successfully online on the target region
435+
* server,hence it is the best effort. We do not unload regions to hostnames given in
436+
* {@link #excludeFile}. If designatedFile is present with some contents, we will unload regions
437+
* to hostnames provided in {@link #designatedFile}
438+
* @return true if region isolation succeeded, false otherwise
439+
*/
440+
public boolean isolateRegions()
441+
throws ExecutionException, InterruptedException, TimeoutException {
442+
return unloadRegions(false, isolateRegionIdArray);
443+
}
444+
445+
private boolean unloadRegions(boolean unloadFromRack, List<String> isolateRegionIdArray)
427446
throws InterruptedException, ExecutionException, TimeoutException {
428447
deleteFile(this.filename);
429448
ExecutorService unloadPool = Executors.newFixedThreadPool(1);
@@ -481,7 +500,7 @@ private boolean unloadRegions(boolean unloadFromRack)
481500
} else {
482501
LOG.info("Available servers {}", regionServers);
483502
}
484-
unloadRegions(server, regionServers, movedRegions);
503+
unloadRegions(server, regionServers, movedRegions, isolateRegionIdArray);
485504
} catch (Exception e) {
486505
LOG.error("Error while unloading regions ", e);
487506
return false;
@@ -512,7 +531,7 @@ Collection<ServerName> filterRSGroupServers(RSGroupInfo rsgroup,
512531
}
513532

514533
private void unloadRegions(ServerName server, List<ServerName> regionServers,
515-
List<RegionInfo> movedRegions) throws Exception {
534+
List<RegionInfo> movedRegions, List<String> isolateRegionIdArray) throws Exception {
516535
while (true) {
517536
List<RegionInfo> isolateRegionInfoList = Collections.synchronizedList(new ArrayList<>());
518537
RegionInfo isolateRegionInfo = null;
@@ -860,12 +879,13 @@ private ServerName stripServer(List<ServerName> regionServers, String hostname,
860879
@Override
861880
protected void addOptions() {
862881
this.addRequiredOptWithArg("r", "regionserverhost", "region server <hostname>|<hostname:port>");
863-
this.addRequiredOptWithArg("o", "operation", "Expected: load/unload/unload_from_rack");
882+
this.addRequiredOptWithArg("o", "operation",
883+
"Expected: load/unload/unload_from_rack/isolate_regions");
864884
this.addOptWithArg("m", "maxthreads",
865885
"Define the maximum number of threads to use to unload and reload the regions");
866886
this.addOptWithArg("isolateRegionIds",
867-
"Comma separated list of Region IDs to isolate on the RegionServer and put "
868-
+ " region server host in draining mode. This option should only be used with '-o unload'"
887+
"Comma separated list of Region IDs hash to isolate on a RegionServer and put "
888+
+ " region server in draining mode. This option should only be used with '-o isolate_regions'"
869889
+ " only. By putting region server in decommission/draining mode, master can't assign any"
870890
+ " new region on this server. If one or more regions are not found OR failed to isolate"
871891
+ " successfully, utility will exist without putting RS in draining/decommission mode."
@@ -895,7 +915,7 @@ protected void processOptions(CommandLine cmd) {
895915
if (cmd.hasOption('m')) {
896916
rmbuilder.maxthreads(Integer.parseInt(cmd.getOptionValue('m')));
897917
}
898-
if (cmd.hasOption("isolateRegionIds") && this.loadUnload.equals("unload")) {
918+
if (this.loadUnload.equals("isolate_regions") && cmd.hasOption("isolateRegionIds")) {
899919
rmbuilder
900920
.isolateRegionIdArray(Arrays.asList(cmd.getOptionValue("isolateRegionIds").split(",")));
901921
}
@@ -926,6 +946,8 @@ protected int doWork() throws Exception {
926946
success = rm.unload();
927947
} else if (loadUnload.equalsIgnoreCase("unload_from_rack")) {
928948
success = rm.unloadFromRack();
949+
} else if (loadUnload.equalsIgnoreCase("isolate_regions")) {
950+
success = rm.isolateRegions();
929951
} else {
930952
printUsage();
931953
success = false;

hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionMover2.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ public void regionIsolationOperation(int sourceRSIndex, int destinationRSIndex,
269269
try (RegionMover rm = rmBuilder.build()) {
270270
LOG.debug("Unloading {} except regions : {}", destinationRS.getServerName(),
271271
listOfRegionIDsToIsolate);
272-
rm.unload();
272+
rm.isolateRegions();
273273
Assert.assertEquals(listOfRegionIDsToIsolate.size(),
274274
destinationRS.getNumberOfOnlineRegions());
275275
for (int i = 0; i < listOfRegionIDsToIsolate.size(); i++) {

0 commit comments

Comments
 (0)