You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zg...@apache.org on 2019/08/01 02:58:28 UTC
[hbase] branch branch-2.0 updated: HBASE-22737 Add a new admin
method and shell cmd to trigger the hbck chore to run (#425)
This is an automated email from the ASF dual-hosted git repository.
zghao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new a28aec8 HBASE-22737 Add a new admin method and shell cmd to trigger the hbck chore to run (#425)
a28aec8 is described below
commit a28aec87946093a1242b4e5696b772a5f37eb92a
Author: Guanghao Zhang <zg...@apache.org>
AuthorDate: Thu Aug 1 08:54:47 2019 +0800
HBASE-22737 Add a new admin method and shell cmd to trigger the hbck chore to run (#425)
Signed-off-by: stack <st...@apache.org>
---
.../org/apache/hadoop/hbase/client/HBaseHbck.java | 49 +++++++++++++++-------
.../java/org/apache/hadoop/hbase/client/Hbck.java | 8 ++++
.../src/main/protobuf/Master.proto | 13 ++++++
.../org/apache/hadoop/hbase/master/HMaster.java | 14 +++----
.../master/{HbckChecker.java => HbckChore.java} | 18 ++++----
.../hadoop/hbase/master/MasterRpcServices.java | 16 +++++++
.../main/resources/hbase-webapps/master/hbck.jsp | 16 +++----
.../org/apache/hadoop/hbase/client/TestHbck.java | 15 +++++++
.../{TestHbckChecker.java => TestHbckChore.java} | 36 ++++++++--------
hbase-shell/src/main/ruby/hbase/admin.rb | 7 ++++
hbase-shell/src/main/ruby/shell.rb | 1 +
.../src/main/ruby/shell/commands/hbck_chore_run.rb | 38 +++++++++++++++++
hbase-shell/src/test/ruby/hbase/admin_test.rb | 4 ++
13 files changed, 177 insertions(+), 58 deletions(-)
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseHbck.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseHbck.java
index 5c33555..f9fb1d7 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseHbck.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseHbck.java
@@ -24,17 +24,24 @@ import java.util.stream.Collectors;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
+import org.apache.yetus.audience.InterfaceAudience;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;
import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AssignsResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BypassProcedureRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BypassProcedureResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableStateResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.HbckService.BlockingInterface;
-import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
-import org.apache.yetus.audience.InterfaceAudience;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunHbckChoreRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunHbckChoreResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ScheduleServerCrashProcedureResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.UnassignsResponse;
+import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;
/**
* Use {@link ClusterConnection#getHbck()} to obtain an instance of {@link Hbck} instead of
@@ -103,9 +110,8 @@ public class HBaseHbck implements Hbck {
public List<Long> assigns(List<String> encodedRegionNames, boolean override)
throws IOException {
try {
- MasterProtos.AssignsResponse response =
- this.hbck.assigns(rpcControllerFactory.newController(),
- RequestConverter.toAssignRegionsRequest(encodedRegionNames, override));
+ AssignsResponse response = this.hbck.assigns(rpcControllerFactory.newController(),
+ RequestConverter.toAssignRegionsRequest(encodedRegionNames, override));
return response.getPidList();
} catch (ServiceException se) {
LOG.debug(toCommaDelimitedString(encodedRegionNames), se);
@@ -117,9 +123,8 @@ public class HBaseHbck implements Hbck {
public List<Long> unassigns(List<String> encodedRegionNames, boolean override)
throws IOException {
try {
- MasterProtos.UnassignsResponse response =
- this.hbck.unassigns(rpcControllerFactory.newController(),
- RequestConverter.toUnassignRegionsRequest(encodedRegionNames, override));
+ UnassignsResponse response = this.hbck.unassigns(rpcControllerFactory.newController(),
+ RequestConverter.toUnassignRegionsRequest(encodedRegionNames, override));
return response.getPidList();
} catch (ServiceException se) {
LOG.debug(toCommaDelimitedString(encodedRegionNames), se);
@@ -135,13 +140,13 @@ public class HBaseHbck implements Hbck {
public List<Boolean> bypassProcedure(List<Long> pids, long waitTime, boolean override,
boolean recursive)
throws IOException {
- MasterProtos.BypassProcedureResponse response = ProtobufUtil.call(
- new Callable<MasterProtos.BypassProcedureResponse>() {
+ BypassProcedureResponse response = ProtobufUtil.call(
+ new Callable<BypassProcedureResponse>() {
@Override
- public MasterProtos.BypassProcedureResponse call() throws Exception {
+ public BypassProcedureResponse call() throws Exception {
try {
return hbck.bypassProcedure(rpcControllerFactory.newController(),
- MasterProtos.BypassProcedureRequest.newBuilder().addAllProcId(pids).
+ BypassProcedureRequest.newBuilder().addAllProcId(pids).
setWaitTime(waitTime).setOverride(override).setRecursive(recursive).build());
} catch (Throwable t) {
LOG.error(pids.stream().map(i -> i.toString()).
@@ -157,7 +162,7 @@ public class HBaseHbck implements Hbck {
public List<Long> scheduleServerCrashProcedure(List<HBaseProtos.ServerName> serverNames)
throws IOException {
try {
- MasterProtos.ScheduleServerCrashProcedureResponse response =
+ ScheduleServerCrashProcedureResponse response =
this.hbck.scheduleServerCrashProcedure(rpcControllerFactory.newController(),
RequestConverter.toScheduleServerCrashProcedureRequest(serverNames));
return response.getPidList();
@@ -169,4 +174,16 @@ public class HBaseHbck implements Hbck {
throw new IOException(se);
}
}
+
+ @Override
+ public boolean runHbckChore() throws IOException {
+ try {
+ RunHbckChoreResponse response = this.hbck.runHbckChore(rpcControllerFactory.newController(),
+ RunHbckChoreRequest.newBuilder().build());
+ return response.getRan();
+ } catch (ServiceException se) {
+ LOG.debug("Failed to run HBCK chore", se);
+ throw new IOException(se);
+ }
+ }
}
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Hbck.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Hbck.java
index debc6c7..0c18cab 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Hbck.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Hbck.java
@@ -111,4 +111,12 @@ public interface Hbck extends Abortable, Closeable {
List<Long> scheduleServerCrashProcedure(List<HBaseProtos.ServerName> serverNames)
throws IOException;
+
+ /**
+ * Request HBCK chore to run at master side.
+ *
+ * @return <code>true</code> if HBCK chore ran, <code>false</code> if HBCK chore already running
+ * @throws IOException if a remote or network exception occurs
+ */
+ boolean runHbckChore() throws IOException;
}
diff --git a/hbase-protocol-shaded/src/main/protobuf/Master.proto b/hbase-protocol-shaded/src/main/protobuf/Master.proto
index d903f27..0464428 100644
--- a/hbase-protocol-shaded/src/main/protobuf/Master.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/Master.proto
@@ -350,6 +350,13 @@ message IsNormalizerEnabledResponse {
required bool enabled = 1;
}
+message RunHbckChoreRequest {
+}
+
+message RunHbckChoreResponse {
+ required bool ran = 1;
+}
+
message RunCatalogScanRequest {
}
@@ -1080,4 +1087,10 @@ service HbckService {
/** Schedule a ServerCrashProcedure to help recover a crash server */
rpc ScheduleServerCrashProcedure(ScheduleServerCrashProcedureRequest)
returns(ScheduleServerCrashProcedureResponse);
+
+ /**
+ * Request HBCK chore to run at master side.
+ */
+ rpc RunHbckChore(RunHbckChoreRequest)
+ returns(RunHbckChoreResponse);
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index ee5d6c6..885ea70 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -354,7 +354,7 @@ public class HMaster extends HRegionServer implements MasterServices {
private ClusterStatusChore clusterStatusChore;
private ClusterStatusPublisher clusterStatusPublisherChore = null;
- private HbckChecker hbckChecker;
+ private HbckChore hbckChore;
CatalogJanitor catalogJanitorChore;
private ReplicationZKNodeCleanerChore replicationZKNodeCleanerChore;
@@ -992,8 +992,8 @@ public class HMaster extends HRegionServer implements MasterServices {
getChoreService().scheduleChore(normalizerChore);
this.catalogJanitorChore = new CatalogJanitor(this);
getChoreService().scheduleChore(catalogJanitorChore);
- this.hbckChecker = new HbckChecker(this);
- getChoreService().scheduleChore(hbckChecker);
+ this.hbckChore = new HbckChore(this);
+ getChoreService().scheduleChore(hbckChore);
// NAMESPACE READ!!!!
// Here we expect hbase:namespace to be online. See inside initClusterSchemaService.
@@ -1465,8 +1465,8 @@ public class HMaster extends HRegionServer implements MasterServices {
if (this.snapshotQuotaChore != null) {
snapshotQuotaChore.cancel();
}
- if (this.hbckChecker != null) {
- hbckChecker.cancel();
+ if (this.hbckChore != null) {
+ hbckChore.cancel();
}
}
@@ -3790,7 +3790,7 @@ public class HMaster extends HRegionServer implements MasterServices {
}
}
- public HbckChecker getHbckChecker() {
- return this.hbckChecker;
+ public HbckChore getHbckChore() {
+ return this.hbckChore;
}
}
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HbckChecker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HbckChore.java
similarity index 95%
rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/HbckChecker.java
rename to hbase-server/src/main/java/org/apache/hadoop/hbase/master/HbckChore.java
index fbc2c70..6a69bae 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HbckChecker.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HbckChore.java
@@ -47,11 +47,11 @@ import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
*/
@InterfaceAudience.Private
@InterfaceStability.Evolving
-public class HbckChecker extends ScheduledChore {
- private static final Logger LOG = LoggerFactory.getLogger(HbckChecker.class.getName());
+public class HbckChore extends ScheduledChore {
+ private static final Logger LOG = LoggerFactory.getLogger(HbckChore.class.getName());
- private static final String HBCK_CHECKER_INTERVAL = "hbase.master.hbck.checker.interval";
- private static final int DEFAULT_HBCK_CHECKER_INTERVAL = 60 * 60 * 1000;
+ private static final String HBCK_CHORE_INTERVAL = "hbase.master.hbck.chore.interval";
+ private static final int DEFAULT_HBCK_CHORE_INTERVAL = 60 * 60 * 1000;
private final MasterServices master;
@@ -100,14 +100,14 @@ public class HbckChecker extends ScheduledChore {
private volatile long checkingStartTimestamp = 0;
private volatile long checkingEndTimestamp = 0;
- public HbckChecker(MasterServices master) {
- super("HbckChecker-", master,
- master.getConfiguration().getInt(HBCK_CHECKER_INTERVAL, DEFAULT_HBCK_CHECKER_INTERVAL));
+ public HbckChore(MasterServices master) {
+ super("HbckChore-", master,
+ master.getConfiguration().getInt(HBCK_CHORE_INTERVAL, DEFAULT_HBCK_CHORE_INTERVAL));
this.master = master;
}
@Override
- protected void chore() {
+ protected synchronized void chore() {
running = true;
regionInfoMap.clear();
orphanRegionsOnRS.clear();
@@ -277,6 +277,6 @@ public class HbckChecker extends ScheduledChore {
* Used for web ui to show when the HBCK checking report generated.
*/
public long getCheckingEndTimestamp() {
- return this.checkingStartTimestamp;
+ return this.checkingEndTimestamp;
}
}
\ No newline at end of file
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
index 6e6224f..cdf1d0d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
@@ -236,6 +236,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCatalog
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCatalogScanResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCleanerChoreRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunCleanerChoreResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunHbckChoreRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.RunHbckChoreResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SecurityCapabilitiesRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SecurityCapabilitiesResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.SetBalancerRunningRequest;
@@ -2252,6 +2254,20 @@ public class MasterRpcServices extends RSRpcServices
// HBCK Services
+ @Override
+ public RunHbckChoreResponse runHbckChore(RpcController c, RunHbckChoreRequest req)
+ throws ServiceException {
+ rpcPreCheck("runHbckChore");
+ LOG.info("{} request HBCK chore to run", master.getClientIdAuditPrefix());
+ HbckChore hbckChore = master.getHbckChore();
+ boolean ran = false;
+ if (!hbckChore.isRunning()) {
+ hbckChore.chore();
+ ran = true;
+ }
+ return RunHbckChoreResponse.newBuilder().setRan(ran).build();
+ }
+
/**
* Update state of the table in meta only. This is required by hbck in some situations to cleanup
* stuck assign/ unassign regions procedures for the table.
diff --git a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp
index a2adeb0..fc212e8 100644
--- a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp
+++ b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp
@@ -27,7 +27,7 @@
import="java.time.ZonedDateTime"
import="java.time.format.DateTimeFormatter"
%>
-<%@ page import="org.apache.hadoop.hbase.master.HbckChecker" %>
+<%@ page import="org.apache.hadoop.hbase.master.HbckChore" %>
<%@ page import="org.apache.hadoop.hbase.master.HMaster" %>
<%@ page import="org.apache.hadoop.hbase.ServerName" %>
<%@ page import="org.apache.hadoop.hbase.util.Bytes" %>
@@ -38,18 +38,18 @@
<%
HMaster master = (HMaster) getServletContext().getAttribute(HMaster.MASTER);
pageContext.setAttribute("pageTitle", "HBase Master HBCK Report: " + master.getServerName());
- HbckChecker hbckChecker = master.getHbckChecker();
+ HbckChore hbckChore = master.getHbckChore();
Map<String, Pair<ServerName, List<ServerName>>> inconsistentRegions = null;
Map<String, ServerName> orphanRegionsOnRS = null;
List<String> orphanRegionsOnFS = null;
long startTimestamp = 0;
long endTimestamp = 0;
- if (hbckChecker != null) {
- inconsistentRegions = hbckChecker.getInconsistentRegions();
- orphanRegionsOnRS = hbckChecker.getOrphanRegionsOnRS();
- orphanRegionsOnFS = hbckChecker.getOrphanRegionsOnFS();
- startTimestamp = hbckChecker.getCheckingStartTimestamp();
- endTimestamp = hbckChecker.getCheckingEndTimestamp();
+ if (hbckChore != null) {
+ inconsistentRegions = hbckChore.getInconsistentRegions();
+ orphanRegionsOnRS = hbckChore.getOrphanRegionsOnRS();
+ orphanRegionsOnFS = hbckChore.getOrphanRegionsOnFS();
+ startTimestamp = hbckChore.getCheckingStartTimestamp();
+ endTimestamp = hbckChore.getCheckingEndTimestamp();
}
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(startTimestamp),
ZoneId.systemDefault());
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHbck.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHbck.java
index 2951600..3be80fb 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHbck.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHbck.java
@@ -28,6 +28,7 @@ import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.master.HMaster;
import org.apache.hadoop.hbase.master.RegionState;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
import org.apache.hadoop.hbase.master.procedure.TableProcedureInterface;
@@ -218,6 +219,20 @@ public class TestHbck {
LOG.info("pid is {}", pids.get(0));
}
+ @Test
+ public void testRunHbckChore() throws Exception {
+ HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster();
+ long endTimestamp = master.getHbckChore().getCheckingEndTimestamp();
+ Hbck hbck = getHbck();
+ boolean ran = false;
+ while (!ran) {
+ ran = hbck.runHbckChore();
+ if (ran) {
+ assertTrue(master.getHbckChore().getCheckingEndTimestamp() > endTimestamp);
+ }
+ }
+ }
+
private void waitOnPids(List<Long> pids) {
for (Long pid: pids) {
while (!TEST_UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor().
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChecker.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChore.java
similarity index 87%
rename from hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChecker.java
rename to hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChore.java
index b225f46..ec32d4f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChecker.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChore.java
@@ -31,7 +31,7 @@ import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
-import org.apache.hadoop.hbase.master.HbckChecker;
+import org.apache.hadoop.hbase.master.HbckChore;
import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.Pair;
@@ -43,19 +43,19 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Category({ MasterTests.class, MediumTests.class })
-public class TestHbckChecker extends TestAssignmentManagerBase {
- private static final Logger LOG = LoggerFactory.getLogger(TestHbckChecker.class);
+public class TestHbckChore extends TestAssignmentManagerBase {
+ private static final Logger LOG = LoggerFactory.getLogger(TestHbckChore.class);
@ClassRule
public static final HBaseClassTestRule CLASS_RULE =
- HBaseClassTestRule.forClass(TestHbckChecker.class);
+ HBaseClassTestRule.forClass(TestHbckChore.class);
- private HbckChecker hbckChecker;
+ private HbckChore hbckChore;
@Before
public void setUp() throws Exception {
super.setUp();
- hbckChecker = new HbckChecker(master);
+ hbckChore = new HbckChore(master);
}
@Test
@@ -65,9 +65,9 @@ public class TestHbckChecker extends TestAssignmentManagerBase {
List<ServerName> serverNames = master.getServerManager().getOnlineServersList();
assertEquals(NSERVERS, serverNames.size());
- hbckChecker.choreForTesting();
+ hbckChore.choreForTesting();
Map<String, Pair<ServerName, List<ServerName>>> inconsistentRegions =
- hbckChecker.getInconsistentRegions();
+ hbckChore.getInconsistentRegions();
// Test for case1: Master thought this region opened, but no regionserver reported it.
assertTrue(inconsistentRegions.containsKey(metaRegionName));
@@ -79,8 +79,8 @@ public class TestHbckChecker extends TestAssignmentManagerBase {
// Reported right region location. Then not in problematic regions.
am.reportOnlineRegions(locationInMeta, Collections.singleton(metaRegionNameAsBytes));
- hbckChecker.choreForTesting();
- inconsistentRegions = hbckChecker.getInconsistentRegions();
+ hbckChore.choreForTesting();
+ inconsistentRegions = hbckChore.getInconsistentRegions();
assertFalse(inconsistentRegions.containsKey(metaRegionName));
}
@@ -97,9 +97,9 @@ public class TestHbckChecker extends TestAssignmentManagerBase {
assertEquals(NSERVERS, serverNames.size());
// Test for case1: Master thought this region opened, but no regionserver reported it.
- hbckChecker.choreForTesting();
+ hbckChore.choreForTesting();
Map<String, Pair<ServerName, List<ServerName>>> inconsistentRegions =
- hbckChecker.getInconsistentRegions();
+ hbckChore.getInconsistentRegions();
assertTrue(inconsistentRegions.containsKey(regionName));
Pair<ServerName, List<ServerName>> pair = inconsistentRegions.get(regionName);
ServerName locationInMeta = pair.getFirst();
@@ -113,8 +113,8 @@ public class TestHbckChecker extends TestAssignmentManagerBase {
final ServerName anotherServer =
serverNames.stream().filter(s -> !s.equals(tempLocationInMeta)).findFirst().get();
am.reportOnlineRegions(anotherServer, Collections.singleton(hri.getRegionName()));
- hbckChecker.choreForTesting();
- inconsistentRegions = hbckChecker.getInconsistentRegions();
+ hbckChore.choreForTesting();
+ inconsistentRegions = hbckChore.getInconsistentRegions();
assertTrue(inconsistentRegions.containsKey(regionName));
pair = inconsistentRegions.get(regionName);
locationInMeta = pair.getFirst();
@@ -125,8 +125,8 @@ public class TestHbckChecker extends TestAssignmentManagerBase {
// Test for case3: More than one regionservers reported opened this region.
am.reportOnlineRegions(locationInMeta, Collections.singleton(hri.getRegionName()));
- hbckChecker.choreForTesting();
- inconsistentRegions = hbckChecker.getInconsistentRegions();
+ hbckChore.choreForTesting();
+ inconsistentRegions = hbckChore.getInconsistentRegions();
assertTrue(inconsistentRegions.containsKey(regionName));
pair = inconsistentRegions.get(regionName);
locationInMeta = pair.getFirst();
@@ -137,8 +137,8 @@ public class TestHbckChecker extends TestAssignmentManagerBase {
// Reported right region location. Then not in problematic regions.
am.reportOnlineRegions(anotherServer, Collections.EMPTY_SET);
- hbckChecker.choreForTesting();
- inconsistentRegions = hbckChecker.getInconsistentRegions();
+ hbckChore.choreForTesting();
+ inconsistentRegions = hbckChore.getInconsistentRegions();
assertFalse(inconsistentRegions.containsKey(regionName));
}
}
diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb
index f77bdf1..565203f 100644
--- a/hbase-shell/src/main/ruby/hbase/admin.rb
+++ b/hbase-shell/src/main/ruby/hbase/admin.rb
@@ -36,6 +36,7 @@ module Hbase
@connection = connection
# Java Admin instance
@admin = @connection.getAdmin
+ @hbck = @connection.getHbck
@conf = @connection.getConfiguration
end
@@ -236,6 +237,12 @@ module Hbase
end
#----------------------------------------------------------------------------------------------
+ # Request HBCK chore to run
+ def hbck_chore_run
+ @hbck.runHbckChore
+ end
+
+ #----------------------------------------------------------------------------------------------
# Request a scan of the catalog table (for garbage collection)
# Returns an int signifying the number of entries cleaned
def catalogjanitor_run
diff --git a/hbase-shell/src/main/ruby/shell.rb b/hbase-shell/src/main/ruby/shell.rb
index a26baf9..235385e 100644
--- a/hbase-shell/src/main/ruby/shell.rb
+++ b/hbase-shell/src/main/ruby/shell.rb
@@ -342,6 +342,7 @@ Shell.load_command_group(
unassign
zk_dump
wal_roll
+ hbck_chore_run
catalogjanitor_run
catalogjanitor_switch
catalogjanitor_enabled
diff --git a/hbase-shell/src/main/ruby/shell/commands/hbck_chore_run.rb b/hbase-shell/src/main/ruby/shell/commands/hbck_chore_run.rb
new file mode 100644
index 0000000..4f77ead
--- /dev/null
+++ b/hbase-shell/src/main/ruby/shell/commands/hbck_chore_run.rb
@@ -0,0 +1,38 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+module Shell
+ module Commands
+ class HbckChoreRun < Command
+ def help
+ <<-EOF
+Request HBCK chore to run at master side. It will try to find the orphan
+regions on RegionServer or FileSystem and find the inconsistent regions.
+You can check the HBCK report at Master web UI.
+
+ hbase> hbck_chore_run
+
+EOF
+ end
+
+ def command
+ admin.hbck_chore_run
+ end
+ end
+ end
+end
diff --git a/hbase-shell/src/test/ruby/hbase/admin_test.rb b/hbase-shell/src/test/ruby/hbase/admin_test.rb
index 2379aaa..d8f00c7 100644
--- a/hbase-shell/src/test/ruby/hbase/admin_test.rb
+++ b/hbase-shell/src/test/ruby/hbase/admin_test.rb
@@ -57,6 +57,10 @@ module Hbase
command(:disable, @test_name)
assert(!command(:is_enabled, @test_name))
end
+
+ define_test 'hbck_chore_run' do
+ command(:hbck_chore_run)
+ end
end
# Simple administration methods tests