From a075d6a011ad1a9794ddb43ae4609a19a5720f8f Mon Sep 17 00:00:00 2001 From: Viraj Jasani Date: Tue, 14 Jan 2020 23:01:49 -0800 Subject: [PATCH] HBASE-23569 : Validate that all default chores of HMaster are scheduled Signed-off-by: Andrew Purtell --- .../master/TestMasterChoreScheduled.java | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterChoreScheduled.java diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterChoreScheduled.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterChoreScheduled.java new file mode 100644 index 00000000000..63d022955a3 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterChoreScheduled.java @@ -0,0 +1,145 @@ +/** + * 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.master; + +import java.io.IOException; +import java.lang.reflect.Field; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.ScheduledChore; +import org.apache.hadoop.hbase.StartMiniClusterOption; +import org.apache.hadoop.hbase.master.balancer.BalancerChore; +import org.apache.hadoop.hbase.master.balancer.ClusterStatusChore; +import org.apache.hadoop.hbase.master.cleaner.HFileCleaner; +import org.apache.hadoop.hbase.master.cleaner.LogCleaner; +import org.apache.hadoop.hbase.master.cleaner.ReplicationBarrierCleaner; +import org.apache.hadoop.hbase.master.normalizer.RegionNormalizerChore; +import org.apache.hadoop.hbase.testclassification.MasterTests; +import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.zookeeper.KeeperException; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +/** + * Tests to validate if HMaster default chores are scheduled + */ +@Category({MasterTests.class, MediumTests.class}) +public class TestMasterChoreScheduled { + + @ClassRule + public static final HBaseClassTestRule CLASS_RULE = + HBaseClassTestRule.forClass(TestMasterChoreScheduled.class); + + private static HMaster hMaster; + + private static final HBaseTestingUtility UTIL = new HBaseTestingUtility(); + + public static final class MockHMaster extends HMaster { + + public MockHMaster(Configuration conf) throws IOException, KeeperException { + super(conf); + } + } + + @BeforeClass + public static void setUp() throws Exception { + UTIL.startMiniCluster(StartMiniClusterOption.builder().numRegionServers(1) + .masterClass(TestCloseAnOpeningRegion.MockHMaster.class).build()); + hMaster = UTIL.getMiniHBaseCluster().getMaster(); + } + + @AfterClass + public static void tearDown() throws Exception { + UTIL.shutdownMiniCluster(); + } + + @Test + public void testDefaultScheduledChores() throws Exception { + // test if logCleaner chore is scheduled by default in HMaster init + TestChoreField logCleanerTestChoreField = new TestChoreField<>(); + LogCleaner logCleaner = logCleanerTestChoreField.getChoreObj("logCleaner"); + logCleanerTestChoreField.testIfChoreScheduled(logCleaner); + + // test if hfileCleaner chore is scheduled by default in HMaster init + TestChoreField hFileCleanerTestChoreField = new TestChoreField<>(); + HFileCleaner hFileCleaner = hFileCleanerTestChoreField.getChoreObj("hfileCleaner"); + hFileCleanerTestChoreField.testIfChoreScheduled(hFileCleaner); + + // test if replicationBarrierCleaner chore is scheduled by default in HMaster init + TestChoreField replicationBarrierCleanerTestChoreField = + new TestChoreField<>(); + ReplicationBarrierCleaner replicationBarrierCleaner = + replicationBarrierCleanerTestChoreField.getChoreObj("replicationBarrierCleaner"); + replicationBarrierCleanerTestChoreField.testIfChoreScheduled(replicationBarrierCleaner); + + // test if clusterStatusChore chore is scheduled by default in HMaster init + TestChoreField clusterStatusChoreTestChoreField = new TestChoreField<>(); + ClusterStatusChore clusterStatusChore = clusterStatusChoreTestChoreField + .getChoreObj("clusterStatusChore"); + clusterStatusChoreTestChoreField.testIfChoreScheduled(clusterStatusChore); + + // test if balancerChore chore is scheduled by default in HMaster init + TestChoreField balancerChoreTestChoreField = new TestChoreField<>(); + BalancerChore balancerChore = balancerChoreTestChoreField.getChoreObj("balancerChore"); + balancerChoreTestChoreField.testIfChoreScheduled(balancerChore); + + // test if normalizerChore chore is scheduled by default in HMaster init + TestChoreField regionNormalizerChoreTestChoreField = + new TestChoreField<>(); + RegionNormalizerChore regionNormalizerChore = regionNormalizerChoreTestChoreField + .getChoreObj("normalizerChore"); + regionNormalizerChoreTestChoreField.testIfChoreScheduled(regionNormalizerChore); + + // test if catalogJanitorChore chore is scheduled by default in HMaster init + TestChoreField catalogJanitorTestChoreField = new TestChoreField<>(); + CatalogJanitor catalogJanitor = catalogJanitorTestChoreField + .getChoreObj("catalogJanitorChore"); + catalogJanitorTestChoreField.testIfChoreScheduled(catalogJanitor); + + // test if hbckChore chore is scheduled by default in HMaster init + TestChoreField hbckChoreTestChoreField = new TestChoreField<>(); + HbckChore hbckChore = hbckChoreTestChoreField.getChoreObj("hbckChore"); + hbckChoreTestChoreField.testIfChoreScheduled(hbckChore); + } + + + private static class TestChoreField { + + private E getChoreObj(String fieldName) throws NoSuchFieldException, + IllegalAccessException { + Field masterField = HMaster.class.getDeclaredField(fieldName); + masterField.setAccessible(true); + E choreFieldVal = (E) masterField.get(hMaster); + return choreFieldVal; + } + + private void testIfChoreScheduled(E choreObj) { + Assert.assertNotNull(choreObj); + Assert.assertTrue(hMaster.getChoreService().isChoreScheduled(choreObj)); + } + + } + +}