From 6d92b60179244af2540a33aaf26afd3bb3852032 Mon Sep 17 00:00:00 2001 From: Balazs Meszaros Date: Mon, 29 Jan 2018 16:43:20 +0100 Subject: [PATCH] HBASE-19886 Display maintenance mode in shell, web UI, JMX --- .../hadoop/hbase/master/MetricsMasterSource.java | 2 ++ .../hadoop/hbase/master/MetricsMasterWrapper.java | 7 ++++ .../hbase/master/MetricsMasterSourceImpl.java | 5 ++- .../hbase/tmpl/master/MasterStatusTmpl.jamon | 6 ++++ .../hbase/master/MetricsMasterWrapperImpl.java | 5 +++ hbase-shell/src/main/ruby/hbase/admin.rb | 7 ++++ hbase-shell/src/main/ruby/shell.rb | 1 + .../ruby/shell/commands/is_in_maintenance_mode.rb | 37 ++++++++++++++++++++++ 8 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 hbase-shell/src/main/ruby/shell/commands/is_in_maintenance_mode.rb diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java index b1c47ec13e..2ae92f5291 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSource.java @@ -59,6 +59,7 @@ public interface MetricsMasterSource extends BaseSource { String SERVER_NAME_NAME = "serverName"; String CLUSTER_ID_NAME = "clusterId"; String IS_ACTIVE_MASTER_NAME = "isActiveMaster"; + String IS_MASTER_IN_MAINTENANCE_MODE_NAME = "isMasterInMaintenanceMode"; String SPLIT_PLAN_COUNT_NAME = "splitPlanCount"; String MERGE_PLAN_COUNT_NAME = "mergePlanCount"; @@ -76,6 +77,7 @@ public interface MetricsMasterSource extends BaseSource { String SERVER_NAME_DESC = "Server Name"; String CLUSTER_ID_DESC = "Cluster Id"; String IS_ACTIVE_MASTER_DESC = "Is Active Master"; + String IS_MASTER_IN_MAINTENANCE_MODE_DESC = "Is Master in maintenance mode"; String SPLIT_PLAN_COUNT_DESC = "Number of Region Split Plans executed"; String MERGE_PLAN_COUNT_DESC = "Number of Region Merge Plans executed"; diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java index 80e08920df..7d012e28d3 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java @@ -81,6 +81,13 @@ public interface MetricsMasterWrapper { */ boolean getIsActiveMaster(); + /** + * Check if the master is in maintenance mode. + * + * @return true if yes, otherwise false. + */ + boolean getIsMasterInMaintenanceMode(); + /** * Get the live region servers * diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java index 48163a3be9..5009eeb067 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java @@ -111,7 +111,10 @@ public class MetricsMasterSourceImpl .tag(Interns.info(CLUSTER_ID_NAME, CLUSTER_ID_DESC), masterWrapper.getClusterId()) .tag(Interns.info(IS_ACTIVE_MASTER_NAME, IS_ACTIVE_MASTER_DESC), - String.valueOf(masterWrapper.getIsActiveMaster())); + String.valueOf(masterWrapper.getIsActiveMaster())) + .tag(Interns.info(IS_MASTER_IN_MAINTENANCE_MODE_NAME, + IS_MASTER_IN_MAINTENANCE_MODE_DESC), + Boolean.toString(masterWrapper.getIsMasterInMaintenanceMode())); } metricsRegistry.snapshot(metricsRecordBuilder, all); diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon index 3253a57623..12e0a69b2b 100644 --- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon +++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.jamon @@ -185,6 +185,12 @@ AssignmentManager assignmentManager = master.getAssignmentManager(); re-enabled from the hbase shell by running the command 'catalogjanitor_switch true' + <%if master.isInMaintenanceMode() %> +
+ Your Master is in maintenance mode. This may be because of HBCK aborting while + running in repair mode. Please re-run HBCK in repair mode. +
+ <%if !master.isBalancerOn() %>
The Load Balancer is not enabled which will eventually cause performance degradation diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java index 6a9b572936..3574c9f6f5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java @@ -143,6 +143,11 @@ public class MetricsMasterWrapperImpl implements MetricsMasterWrapper { return master.isActiveMaster(); } + @Override + public boolean getIsMasterInMaintenanceMode() { + return master.isInMaintenanceMode(); + } + @Override public long getNumWALFiles() { return master.getNumWALFiles(); diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb index 13b6578aa0..4d340d0e39 100644 --- a/hbase-shell/src/main/ruby/hbase/admin.rb +++ b/hbase-shell/src/main/ruby/hbase/admin.rb @@ -223,6 +223,13 @@ module Hbase @admin.isNormalizerEnabled end + #---------------------------------------------------------------------------------------------- + # Query the current state of master in maintenance mode. + # Returns the state of maintenance mode (true is on). + def is_in_maintenance_mode? + @admin.isMasterInMaintenanceMode + end + #---------------------------------------------------------------------------------------------- # Request a scan of the catalog table (for garbage collection) # Returns an int signifying the number of entries cleaned diff --git a/hbase-shell/src/main/ruby/shell.rb b/hbase-shell/src/main/ruby/shell.rb index 4a74646cc1..507c0a9260 100644 --- a/hbase-shell/src/main/ruby/shell.rb +++ b/hbase-shell/src/main/ruby/shell.rb @@ -336,6 +336,7 @@ Shell.load_command_group( normalize normalizer_switch normalizer_enabled + is_in_maintenance_mode close_region compact flush diff --git a/hbase-shell/src/main/ruby/shell/commands/is_in_maintenance_mode.rb b/hbase-shell/src/main/ruby/shell/commands/is_in_maintenance_mode.rb new file mode 100644 index 0000000000..061e201d04 --- /dev/null +++ b/hbase-shell/src/main/ruby/shell/commands/is_in_maintenance_mode.rb @@ -0,0 +1,37 @@ +# +# +# 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. +# + +module Shell + module Commands + class IsInMaintenanceMode < Command + def help + <<-EOF +Is master in maintenance mode? For example: + hbase> is_in_maintenance_mode +EOF + end + + def command() + state = admin.is_in_maintenance_mode? + formatter.row([state.to_s]) + state + end + end + end +end -- 2.15.1