HBASE-12924 HRegionServer#MovedRegionsCleaner Chore does not start
Signed-off-by: Elliott Clark <eclark@apache.org>
This commit is contained in:
parent
c80d64c3fe
commit
daf6858a7a
|
@ -788,7 +788,7 @@ public class HRegionServer extends HasThread implements
|
||||||
this.leases = new Leases(this.threadWakeFrequency);
|
this.leases = new Leases(this.threadWakeFrequency);
|
||||||
|
|
||||||
// Create the thread to clean the moved regions list
|
// Create the thread to clean the moved regions list
|
||||||
movedRegionsCleaner = MovedRegionsCleaner.createAndStart(this);
|
movedRegionsCleaner = MovedRegionsCleaner.create(this);
|
||||||
|
|
||||||
if (this.nonceManager != null) {
|
if (this.nonceManager != null) {
|
||||||
// Create the scheduled chore that cleans up nonces.
|
// Create the scheduled chore that cleans up nonces.
|
||||||
|
@ -1648,6 +1648,7 @@ public class HRegionServer extends HasThread implements
|
||||||
if (this.healthCheckChore != null) choreService.scheduleChore(healthCheckChore);
|
if (this.healthCheckChore != null) choreService.scheduleChore(healthCheckChore);
|
||||||
if (this.nonceManagerChore != null) choreService.scheduleChore(nonceManagerChore);
|
if (this.nonceManagerChore != null) choreService.scheduleChore(nonceManagerChore);
|
||||||
if (this.storefileRefresher != null) choreService.scheduleChore(storefileRefresher);
|
if (this.storefileRefresher != null) choreService.scheduleChore(storefileRefresher);
|
||||||
|
if (this.movedRegionsCleaner != null) choreService.scheduleChore(movedRegionsCleaner);
|
||||||
|
|
||||||
// Leases is not a Thread. Internally it runs a daemon thread. If it gets
|
// Leases is not a Thread. Internally it runs a daemon thread. If it gets
|
||||||
// an unhandled exception, it will just exit.
|
// an unhandled exception, it will just exit.
|
||||||
|
@ -2012,6 +2013,7 @@ public class HRegionServer extends HasThread implements
|
||||||
if (this.periodicFlusher != null) periodicFlusher.cancel(true);
|
if (this.periodicFlusher != null) periodicFlusher.cancel(true);
|
||||||
if (this.healthCheckChore != null) healthCheckChore.cancel(true);
|
if (this.healthCheckChore != null) healthCheckChore.cancel(true);
|
||||||
if (this.storefileRefresher != null) storefileRefresher.cancel(true);
|
if (this.storefileRefresher != null) storefileRefresher.cancel(true);
|
||||||
|
if (this.movedRegionsCleaner != null) movedRegionsCleaner.cancel(true);
|
||||||
|
|
||||||
if (this.cacheFlusher != null) {
|
if (this.cacheFlusher != null) {
|
||||||
this.cacheFlusher.join();
|
this.cacheFlusher.join();
|
||||||
|
@ -2951,21 +2953,31 @@ public class HRegionServer extends HasThread implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use this to allow tests to override and schedule more frequently.
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected int movedRegionCleanerPeriod() {
|
||||||
|
return TIMEOUT_REGION_MOVED;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Chore thread to clean the moved region cache.
|
* Creates a Chore thread to clean the moved region cache.
|
||||||
*/
|
*/
|
||||||
protected static class MovedRegionsCleaner extends ScheduledChore implements Stoppable {
|
|
||||||
|
protected final static class MovedRegionsCleaner extends ScheduledChore implements Stoppable {
|
||||||
private HRegionServer regionServer;
|
private HRegionServer regionServer;
|
||||||
Stoppable stoppable;
|
Stoppable stoppable;
|
||||||
|
|
||||||
private MovedRegionsCleaner(
|
private MovedRegionsCleaner(
|
||||||
HRegionServer regionServer, Stoppable stoppable){
|
HRegionServer regionServer, Stoppable stoppable){
|
||||||
super("MovedRegionsCleaner for region " + regionServer, stoppable, TIMEOUT_REGION_MOVED);
|
super("MovedRegionsCleaner for region " + regionServer, stoppable,
|
||||||
|
regionServer.movedRegionCleanerPeriod());
|
||||||
this.regionServer = regionServer;
|
this.regionServer = regionServer;
|
||||||
this.stoppable = stoppable;
|
this.stoppable = stoppable;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MovedRegionsCleaner createAndStart(HRegionServer rs){
|
static MovedRegionsCleaner create(HRegionServer rs){
|
||||||
Stoppable stoppable = new Stoppable() {
|
Stoppable stoppable = new Stoppable() {
|
||||||
private volatile boolean isStopped = false;
|
private volatile boolean isStopped = false;
|
||||||
@Override public void stop(String why) { isStopped = true;}
|
@Override public void stop(String why) { isStopped = true;}
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.apache.hadoop.hbase;
|
||||||
|
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.hbase.testclassification.MediumTests;
|
||||||
|
import org.apache.hadoop.hbase.testclassification.MiscTests;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.experimental.categories.Category;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether background cleanup of MovedRegion entries is happening
|
||||||
|
*/
|
||||||
|
@Category({ MiscTests.class, MediumTests.class }) public class TestMovedRegionsCleaner {
|
||||||
|
|
||||||
|
public static final Log LOG = LogFactory.getLog(TestRegionRebalancing.class);
|
||||||
|
private final HBaseTestingUtility UTIL = new HBaseTestingUtility();
|
||||||
|
|
||||||
|
public static int numCalls = 0;
|
||||||
|
|
||||||
|
private static class TestMockRegionServer extends MiniHBaseCluster.MiniHBaseClusterRegionServer {
|
||||||
|
|
||||||
|
public TestMockRegionServer(Configuration conf, CoordinatedStateManager cp)
|
||||||
|
throws IOException, InterruptedException {
|
||||||
|
super(conf, cp);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int movedRegionCleanerPeriod() {
|
||||||
|
return 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void cleanMovedRegions() {
|
||||||
|
// count the number of calls that are being made to this
|
||||||
|
//
|
||||||
|
numCalls++;
|
||||||
|
super.cleanMovedRegions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@After public void after() throws Exception {
|
||||||
|
UTIL.shutdownMiniCluster();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before public void before() throws Exception {
|
||||||
|
UTIL.getConfiguration()
|
||||||
|
.setStrings(HConstants.REGION_SERVER_IMPL, TestMockRegionServer.class.getName());
|
||||||
|
UTIL.startMiniCluster(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the cluster, wait for some time and verify that the background
|
||||||
|
* MovedRegion cleaner indeed gets called
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
@Test public void testMovedRegionsCleaner() throws IOException, InterruptedException {
|
||||||
|
// We need to sleep long enough to trigger at least one round of background calls
|
||||||
|
// to MovedRegionCleaner happen. Currently the period is set to 500ms.
|
||||||
|
// Setting the sleep here for 2s just to be safe
|
||||||
|
//
|
||||||
|
UTIL.waitFor(2000, new Waiter.Predicate<IOException>() {
|
||||||
|
@Override
|
||||||
|
public boolean evaluate() throws IOException {
|
||||||
|
|
||||||
|
// verify that there was at least one call to the cleanMovedRegions function
|
||||||
|
//
|
||||||
|
return numCalls > 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue