From 409531209ea251e76360ab9873caea12ae82245f Mon Sep 17 00:00:00 2001 From: Andrew Purtell Date: Fri, 1 Jun 2018 15:22:18 -0700 Subject: [PATCH] HBASE-20670 NPE in HMaster#isInMaintenanceMode --- .../apache/hadoop/hbase/master/HMaster.java | 25 +++++++++++++++---- .../hbase/master/MasterRpcServices.java | 6 ++++- .../hadoop/hbase/master/MasterServices.java | 5 ++-- 3 files changed, 28 insertions(+), 8 deletions(-) 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 a2b43e957db..8bff5d231fc 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 @@ -2710,7 +2710,10 @@ public class HMaster extends HRegionServer implements MasterServices, Server { * @return true if master is in maintenanceMode */ @Override - public boolean isInMaintenanceMode() { + public boolean isInMaintenanceMode() throws IOException { + if (!isInitialized()) { + throw new PleaseHoldException("Master is initializing"); + } return maintenanceModeTracker.isInMaintenanceMode(); } @@ -3208,7 +3211,11 @@ public class HMaster extends HRegionServer implements MasterServices, Server { * @return The state of the load balancer, or false if the load balancer isn't defined. */ public boolean isBalancerOn() { - if (null == loadBalancerTracker || isInMaintenanceMode()) { + try { + if (null == loadBalancerTracker || isInMaintenanceMode()) { + return false; + } + } catch (IOException e) { return false; } return loadBalancerTracker.isBalancerOn(); @@ -3219,8 +3226,12 @@ public class HMaster extends HRegionServer implements MasterServices, Server { * false is returned. */ public boolean isNormalizerOn() { - return (null == regionNormalizerTracker || isInMaintenanceMode()) ? - false: regionNormalizerTracker.isNormalizerOn(); + try { + return (null == regionNormalizerTracker || isInMaintenanceMode()) ? + false: regionNormalizerTracker.isNormalizerOn(); + } catch (IOException e) { + return false; + } } /** @@ -3230,7 +3241,11 @@ public class HMaster extends HRegionServer implements MasterServices, Server { * @return The state of the switch */ public boolean isSplitOrMergeEnabled(Admin.MasterSwitchType switchType) { - if (null == splitOrMergeTracker || isInMaintenanceMode()) { + try { + if (null == splitOrMergeTracker || isInMaintenanceMode()) { + return false; + } + } catch (IOException e) { return false; } return splitOrMergeTracker.isSplitOrMergeEnabled(switchType); 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 0ccdc278245..c2387460fce 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 @@ -1432,7 +1432,11 @@ public class MasterRpcServices extends RSRpcServices final RpcController controller, final IsInMaintenanceModeRequest request) throws ServiceException { IsInMaintenanceModeResponse.Builder response = IsInMaintenanceModeResponse.newBuilder(); - response.setInMaintenanceMode(master.isInMaintenanceMode()); + try { + response.setInMaintenanceMode(master.isInMaintenanceMode()); + } catch (IOException e) { + throw new ServiceException(e); + } return response.build(); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java index 7d58070a6eb..7312718203e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java @@ -341,15 +341,16 @@ public interface MasterServices extends Server { /** * @return true if master is in maintanceMode + * @throws IOException */ - boolean isInMaintenanceMode(); + boolean isInMaintenanceMode() throws IOException; /** * Abort a procedure. * @param procId ID of the procedure * @param mayInterruptIfRunning if the proc completed at least one step, should it be aborted? * @return true if aborted, false if procedure already completed or does not exist - * @throws IOException + * @throws IOException */ public boolean abortProcedure(final long procId, final boolean mayInterruptIfRunning) throws IOException;