diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index 80f118a..1411cc0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -45,6 +45,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Chore; +import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.exceptions.DeserializationException; @@ -953,7 +954,11 @@ public class AssignmentManager extends ZooKeeperListener { if (regionState != null) { // When there are more than one region server a new RS is selected as the // destination and the same is updated in the regionplan. (HBASE-5546) - getRegionPlan(regionState.getRegion(), sn, true); + try { + getRegionPlan(regionState.getRegion(), sn, true); + } catch (HBaseIOException e) { + LOG.warn("Failed to get region plan", e); + } new ClosedRegionHandler(server, this, regionState.getRegion()).process(); } } @@ -1828,7 +1833,11 @@ public class AssignmentManager extends ZooKeeperListener { RegionOpeningState regionOpenState; for (int i = 1; i <= maximumAttempts && !server.isStopped(); i++) { if (plan == null) { // Get a server for the region at first - plan = getRegionPlan(region, forceNewPlan); + try { + plan = getRegionPlan(region, forceNewPlan); + } catch (HBaseIOException e) { + LOG.warn("Failed to get region plan", e); + } } if (plan == null) { LOG.warn("Unable to determine a plan to assign " + region); @@ -1993,8 +2002,12 @@ public class AssignmentManager extends ZooKeeperListener { // The new plan could be the same as the existing plan since we don't // exclude the server of the original plan, which should not be // excluded since it could be the only server up now. - RegionPlan newPlan = getRegionPlan(region, true); - + RegionPlan newPlan = null; + try { + newPlan = getRegionPlan(region, true); + } catch (HBaseIOException e) { + LOG.warn("Failed to get region plan", e); + } if (newPlan == null) { if (tomActivated) { this.timeoutMonitor.setAllRegionServersOffline(true); @@ -2095,7 +2108,7 @@ public class AssignmentManager extends ZooKeeperListener { * if no servers to assign, it returns null). */ private RegionPlan getRegionPlan(final HRegionInfo region, - final boolean forceNewPlan) { + final boolean forceNewPlan) throws HBaseIOException { return getRegionPlan(region, null, forceNewPlan); } @@ -2109,7 +2122,7 @@ public class AssignmentManager extends ZooKeeperListener { * if no servers to assign, it returns null). */ private RegionPlan getRegionPlan(final HRegionInfo region, - final ServerName serverToExclude, final boolean forceNewPlan) { + final ServerName serverToExclude, final boolean forceNewPlan) throws HBaseIOException { // Pickup existing plan or make a new one final String encodedName = region.getEncodedName(); final List destServers = 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 35aa0ce..6250968 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 @@ -1477,7 +1477,7 @@ MasterServices, Server { return balancerCutoffTime; } - public boolean balance() { + public boolean balance() throws HBaseIOException { // if master not initialized, don't run balancer. if (!this.initialized) { LOG.debug("Master has not been initialized, don't run balancer."); @@ -1562,7 +1562,11 @@ MasterServices, Server { @Override public BalanceResponse balance(RpcController c, BalanceRequest request) throws ServiceException { - return BalanceResponse.newBuilder().setBalancerRan(balance()).build(); + try { + return BalanceResponse.newBuilder().setBalancerRan(balance()).build(); + } catch (HBaseIOException ex) { + throw new ServiceException(ex); + } } enum BalanceSwitchMode { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java index b1427c4..c843b49 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.hbase.ClusterStatus; +import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.ServerName; @@ -64,7 +65,8 @@ public interface LoadBalancer extends Configurable { * @param clusterState * @return List of plans */ - List balanceCluster(Map> clusterState); + List balanceCluster(Map> clusterState) throws HBaseIOException; /** * Perform a Round Robin assignment of regions. @@ -75,7 +77,7 @@ public interface LoadBalancer extends Configurable { Map> roundRobinAssignment( List regions, List servers - ); + ) throws HBaseIOException; /** * Assign regions to the previously hosting region server @@ -86,7 +88,7 @@ public interface LoadBalancer extends Configurable { Map> retainAssignment( Map regions, List servers - ); + ) throws HBaseIOException; /** * Sync assign a region @@ -97,7 +99,7 @@ public interface LoadBalancer extends Configurable { Map immediateAssignment( List regions, List servers - ); + ) throws HBaseIOException; /** * Get a random region server from the list @@ -107,5 +109,5 @@ public interface LoadBalancer extends Configurable { */ ServerName randomAssignment( HRegionInfo regionInfo, List servers - ); + ) throws HBaseIOException; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BalancerChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BalancerChore.java index b662af5..41064bd 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BalancerChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BalancerChore.java @@ -18,8 +18,11 @@ package org.apache.hadoop.hbase.master.balancer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.hbase.Chore; +import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.master.HMaster; /** @@ -28,6 +31,7 @@ import org.apache.hadoop.hbase.master.HMaster; */ @InterfaceAudience.Private public class BalancerChore extends Chore { + private static final Log LOG = LogFactory.getLog(BalancerChore.class); private final HMaster master; @@ -40,6 +44,10 @@ public class BalancerChore extends Chore { @Override protected void chore() { - master.balance(); + try { + master.balance(); + } catch (HBaseIOException e) { + LOG.error("Failed to balance.", e); + } } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java index a610f7c..e9524f4 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestRegionPlacement.java @@ -35,6 +35,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseIOException; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HColumnDescriptor; @@ -93,7 +94,7 @@ public class TestRegionPlacement { } @Test - public void testFavoredNodesPresentForRoundRobinAssignment() { + public void testFavoredNodesPresentForRoundRobinAssignment() throws HBaseIOException { LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(TEST_UTIL.getConfiguration()); balancer.setMasterServices(TEST_UTIL.getMiniHBaseCluster().getMaster()); List servers = new ArrayList(); @@ -153,7 +154,7 @@ public class TestRegionPlacement { } @Test - public void testFavoredNodesPresentForRandomAssignment() { + public void testFavoredNodesPresentForRandomAssignment() throws HBaseIOException { LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(TEST_UTIL.getConfiguration()); balancer.setMasterServices(TEST_UTIL.getMiniHBaseCluster().getMaster()); List servers = new ArrayList();