Skip to content

Commit

Permalink
HBASE-22803 Modify config value range to enable turning off of the hb…
Browse files Browse the repository at this point in the history
…ck chore (#466)

Signed-off-by: Guanghao Zhang <zghao@apache.org>
  • Loading branch information
the-sakthi authored Aug 9, 2019
1 parent 9250977 commit eb92b25
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,26 @@ public class HbckChore extends ScheduledChore {
private volatile long checkingStartTimestamp = 0;
private volatile long checkingEndTimestamp = 0;

private boolean disabled = false;

public HbckChore(MasterServices master) {
super("HbckChore-", master,
master.getConfiguration().getInt(HBCK_CHORE_INTERVAL, DEFAULT_HBCK_CHORE_INTERVAL));
this.master = master;
int interval =
master.getConfiguration().getInt(HBCK_CHORE_INTERVAL, DEFAULT_HBCK_CHORE_INTERVAL);
if (interval <= 0) {
LOG.warn(HBCK_CHORE_INTERVAL + " is <=0 hence disabling hbck chore");
disableChore();
}
}

@Override
protected synchronized void chore() {
if (isDisabled() || isRunning()) {
LOG.warn("hbckChore is either disabled or is already running. Can't run the chore");
return;
}
running = true;
regionInfoMap.clear();
orphanRegionsOnRS.clear();
Expand All @@ -124,6 +136,29 @@ protected synchronized void chore() {
running = false;
}

// This function does the sanity checks of making sure the chore is not run when it is
// disabled or when it's already running. It returns whether the chore was actually run or not.
protected boolean runChore() {
if (isDisabled() || isRunning()) {
if (isDisabled()) {
LOG.warn("hbck chore is disabled! Set " + HBCK_CHORE_INTERVAL + " > 0 to enable it.");
} else {
LOG.warn("hbck chore already running. Can't run till it finishes.");
}
return false;
}
chore();
return true;
}

private void disableChore() {
this.disabled = true;
}

public boolean isDisabled() {
return this.disabled;
}

private void saveCheckResultToSnapshot() {
// Need synchronized here, as this "snapshot" may be access by web ui.
rwLock.writeLock().lock();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2376,11 +2376,7 @@ public RunHbckChoreResponse runHbckChore(RpcController c, RunHbckChoreRequest re
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;
}
boolean ran = hbckChore.runChore();
return RunHbckChoreResponse.newBuilder().setRan(ran).build();
}

Expand Down
4 changes: 4 additions & 0 deletions hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,11 @@
<div class="page-header">
<h1>HBCK Chore Report</h1>
<p>
<% if (hbckChore.isDisabled()) { %>
<span>HBCK chore is currently disabled. Set hbase.master.hbck.chore.interval > 0 in the config & do a rolling-restart to enable it.</span>
<% } else { %>
<span>Checking started at <%= iso8601start %> and generated report at <%= iso8601end %>. Execute 'hbck_chore_run' in hbase shell to generate a new sub-report.</span>
<% } %>
</p>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,4 +198,22 @@ public void testOrphanRegionsOnFS() throws Exception {
hbckChore.choreForTesting();
assertEquals(0, hbckChore.getOrphanRegionsOnFS().size());
}

@Test
public void testChoreDisable() {
// The way to disable to chore is to set hbase.master.hbck.chore.interval <= 0
// When the interval is > 0, the chore should run.
long lastRunTime = hbckChore.getCheckingEndTimestamp();
hbckChore.choreForTesting();
boolean ran = lastRunTime != hbckChore.getCheckingEndTimestamp();
assertTrue(ran);

// When the interval <= 0, the chore shouldn't run
master.getConfiguration().setInt("hbase.master.hbck.chore.interval", 0);
HbckChore hbckChoreWithChangedConf = new HbckChore(master);
lastRunTime = hbckChoreWithChangedConf.getCheckingEndTimestamp();
hbckChoreWithChangedConf.choreForTesting();
ran = lastRunTime != hbckChoreWithChangedConf.getCheckingEndTimestamp();
assertFalse(ran);
}
}

0 comments on commit eb92b25

Please sign in to comment.