You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ch...@apache.org on 2017/08/13 17:08:17 UTC
hbase git commit: HBASE-15511 ClusterStatus should be able to return
responses by scope
Repository: hbase
Updated Branches:
refs/heads/master 173dce734 -> 923195c39
HBASE-15511 ClusterStatus should be able to return responses by scope
Signed-off-by: Chia-Ping Tsai <ch...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/923195c3
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/923195c3
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/923195c3
Branch: refs/heads/master
Commit: 923195c39e872ebca92b5cc5f148e4c1d39718ea
Parents: 173dce7
Author: Reid Chan <re...@outlook.com>
Authored: Mon Aug 14 01:01:30 2017 +0800
Committer: Chia-Ping Tsai <ch...@gmail.com>
Committed: Mon Aug 14 01:02:39 2017 +0800
----------------------------------------------------------------------
.../org/apache/hadoop/hbase/ClusterStatus.java | 297 ++++++++++++++++++-
.../org/apache/hadoop/hbase/client/Admin.java | 8 +
.../apache/hadoop/hbase/client/AsyncAdmin.java | 6 +
.../hadoop/hbase/client/AsyncHBaseAdmin.java | 8 +-
.../apache/hadoop/hbase/client/HBaseAdmin.java | 12 +-
.../hadoop/hbase/client/RawAsyncHBaseAdmin.java | 9 +-
.../hbase/shaded/protobuf/ProtobufUtil.java | 81 ++++-
.../hbase/shaded/protobuf/RequestConverter.java | 14 +-
.../src/main/protobuf/ClusterStatus.proto | 12 +
.../src/main/protobuf/Master.proto | 1 +
.../src/main/protobuf/ClusterStatus.proto | 12 +
.../hbase/master/ClusterStatusPublisher.java | 18 +-
.../org/apache/hadoop/hbase/master/HMaster.java | 62 ++--
.../hadoop/hbase/master/MasterRpcServices.java | 3 +-
.../hbase/client/TestClientClusterStatus.java | 221 ++++++++++++++
15 files changed, 710 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java
index 95d77a2..0dc4984 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java
@@ -47,6 +47,28 @@ import org.apache.hadoop.io.VersionedWritable;
* <li>Regions in transition at master</li>
* <li>The unique cluster ID</li>
* </ul>
+ * <tt>{@link Options}</tt> provides a way to filter out infos which unwanted.
+ * The following codes will retrieve all the cluster information.
+ * <pre>
+ * {@code
+ * // Original version still works
+ * Admin admin = connection.getAdmin();
+ * ClusterStatus status = admin.getClusterStatus();
+ * // or below, a new version which has the same effects
+ * ClusterStatus status = admin.getClusterStatus(Options.defaultOptions());
+ * }
+ * </pre>
+ * If information about dead servers and master coprocessors are unwanted,
+ * then codes in the following way:
+ * <pre>
+ * {@code
+ * Admin admin = connection.getAdmin();
+ * ClusterStatus status = admin.getClusterStatus(
+ * Options.defaultOptions()
+ * .excludeDeadServers()
+ * .excludeMasterCoprocessors());
+ * }
+ * </pre>
*/
@InterfaceAudience.Public
public class ClusterStatus extends VersionedWritable {
@@ -72,6 +94,12 @@ public class ClusterStatus extends VersionedWritable {
private String[] masterCoprocessors;
private Boolean balancerOn;
+ /**
+ * Use {@link ClusterStatus.Builder} to construct a ClusterStatus instead.
+ * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0
+ * (<a href="https://issues.apache.org/jira/browse/HBASE-15511">HBASE-15511</a>).
+ */
+ @Deprecated
public ClusterStatus(final String hbaseVersion, final String clusterid,
final Map<ServerName, ServerLoad> servers,
final Collection<ServerName> deadServers,
@@ -80,8 +108,8 @@ public class ClusterStatus extends VersionedWritable {
final List<RegionState> rit,
final String[] masterCoprocessors,
final Boolean balancerOn) {
+ // TODO: make this constructor private
this.hbaseVersion = hbaseVersion;
-
this.liveServers = servers;
this.deadServers = deadServers;
this.master = master;
@@ -133,7 +161,8 @@ public class ClusterStatus extends VersionedWritable {
*/
public double getAverageLoad() {
int load = getRegionsCount();
- return (double)load / (double)getServersSize();
+ int serverSize = getServersSize();
+ return serverSize != 0 ? (double)load / (double)serverSize : 0.0;
}
/**
@@ -333,4 +362,268 @@ public class ClusterStatus extends VersionedWritable {
}
return sb.toString();
}
+
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+
+ /**
+ * Builder for construct a ClusterStatus.
+ */
+ public static class Builder {
+ private String hbaseVersion = null;
+ private Map<ServerName, ServerLoad> liveServers = null;
+ private Collection<ServerName> deadServers = null;
+ private ServerName master = null;
+ private Collection<ServerName> backupMasters = null;
+ private List<RegionState> intransition = null;
+ private String clusterId = null;
+ private String[] masterCoprocessors = null;
+ private Boolean balancerOn = null;
+
+ private Builder() {}
+
+ public Builder setHBaseVersion(String hbaseVersion) {
+ this.hbaseVersion = hbaseVersion;
+ return this;
+ }
+
+ public Builder setLiveServers(Map<ServerName, ServerLoad> liveServers) {
+ this.liveServers = liveServers;
+ return this;
+ }
+
+ public Builder setDeadServers(Collection<ServerName> deadServers) {
+ this.deadServers = deadServers;
+ return this;
+ }
+
+ public Builder setMaster(ServerName master) {
+ this.master = master;
+ return this;
+ }
+
+ public Builder setBackupMasters(Collection<ServerName> backupMasters) {
+ this.backupMasters = backupMasters;
+ return this;
+ }
+
+ public Builder setRegionState(List<RegionState> intransition) {
+ this.intransition = intransition;
+ return this;
+ }
+
+ public Builder setClusterId(String clusterId) {
+ this.clusterId = clusterId;
+ return this;
+ }
+
+ public Builder setMasterCoprocessors(String[] masterCoprocessors) {
+ this.masterCoprocessors = masterCoprocessors;
+ return this;
+ }
+
+ public Builder setBalancerOn(Boolean balancerOn) {
+ this.balancerOn = balancerOn;
+ return this;
+ }
+
+ public ClusterStatus build() {
+ return new ClusterStatus(hbaseVersion, clusterId, liveServers,
+ deadServers, master, backupMasters, intransition, masterCoprocessors,
+ balancerOn);
+ }
+ }
+
+ /**
+ * Options provides a way to filter out unwanted information.
+ * For compatibility, default options includes all the information about a ClusterStatus.
+ * To filter out unwanted information, use the specific excludeXXX() method.
+ */
+ public static class Options {
+ private boolean includeHBaseVersion = true;
+ private boolean includeLiveServers = true;
+ private boolean includeDeadServers = true;
+ private boolean includeMaster = true;
+ private boolean includeBackupMasters = true;
+ private boolean includeRegionState = true;
+ private boolean includeClusterId = true;
+ private boolean includeMasterCoprocessors = true;
+ private boolean includeBalancerOn = true;
+
+ private Options() {}
+
+ /**
+ * Include all information about a ClusterStatus.
+ */
+ public static Options getDefaultOptions() {
+ return new Options();
+ }
+
+ /**
+ * Filter out hbase verision.
+ */
+ public Options excludeHBaseVersion() {
+ includeHBaseVersion = false;
+ return this;
+ }
+
+ /**
+ * Filter out live servers.
+ */
+ public Options excludeLiveServers() {
+ includeLiveServers = false;
+ return this;
+ }
+
+ /**
+ * Filter out dead servers info.
+ */
+ public Options excludeDeadServers() {
+ includeDeadServers = false;
+ return this;
+ }
+
+ /**
+ * Filter out master info.
+ */
+ public Options excludeMaster() {
+ includeMaster = false;
+ return this;
+ }
+
+ /**
+ * Filter out backup masters info.
+ */
+ public Options excludeBackupMasters() {
+ includeBackupMasters = false;
+ return this;
+ }
+
+ /**
+ * Filter out region state.
+ */
+ public Options excludeRegionState() {
+ includeRegionState = false;
+ return this;
+ }
+
+ /**
+ * Filter out cluster id.
+ */
+ public Options excludeClusterId() {
+ includeClusterId = false;
+ return this;
+ }
+
+ /**
+ * Filter out master's coprocessors info.
+ */
+ public Options excludeMasterCoprocessors() {
+ includeMasterCoprocessors = false;
+ return this;
+ }
+
+ /**
+ * Filter out balancer on info.
+ */
+ public Options excludeBalancerOn() {
+ includeBalancerOn = false;
+ return this;
+ }
+
+ /**
+ * Include hbase version info.
+ */
+ public boolean includeHBaseVersion() {
+ return includeHBaseVersion;
+ }
+
+ /**
+ * Include live servers info.
+ */
+ public boolean includeLiveServers() {
+ return includeLiveServers;
+ }
+
+ /**
+ * Include dead servers info.
+ */
+ public boolean includeDeadServers() {
+ return includeDeadServers;
+ }
+
+ /**
+ * Include master info.
+ */
+ public boolean includeMaster() {
+ return includeMaster;
+ }
+
+ /**
+ * Include backup masters info.
+ */
+ public boolean includeBackupMasters() {
+ return includeBackupMasters;
+ }
+
+ /**
+ * Include region states info.
+ */
+ public boolean includeRegionState() {
+ return includeRegionState;
+ }
+
+ /**
+ * Include cluster id info.
+ */
+ public boolean includeClusterId() {
+ return includeClusterId;
+ }
+
+ /**
+ * Include master's coprocessors.
+ */
+ public boolean includeMasterCoprocessors() {
+ return includeMasterCoprocessors;
+ }
+
+ /**
+ * Include balancer on info.
+ */
+ public boolean includeBalancerOn() {
+ return includeBalancerOn;
+ }
+
+ /**
+ * For an options reusable convenience, reset options to default.
+ */
+ public Options reset() {
+ includeHBaseVersion = true;
+ includeLiveServers = true;
+ includeDeadServers = true;
+ includeMaster = true;
+ includeBackupMasters = true;
+ includeRegionState = true;
+ includeClusterId = true;
+ includeMasterCoprocessors = true;
+ includeBalancerOn = true;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("ClusterStatus info: [");
+ builder.append("include hbase version: " + includeHBaseVersion + ", ");
+ builder.append("include cluster id: " + includeClusterId + ", ");
+ builder.append("include master info: " + includeMaster + ", ");
+ builder.append("include backup masters info: " + includeBackupMasters + ", ");
+ builder.append("include live servers info: " + includeLiveServers + ", ");
+ builder.append("include dead servers info: " + includeDeadServers + ", ");
+ builder.append("include masters coprocessors: " + includeMasterCoprocessors + ", ");
+ builder.append("include region state: " + includeRegionState + ", ");
+ builder.append("include balancer on: " + includeBalancerOn + "]");
+ return builder.toString();
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
index 4f5c128..d2acae3 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
@@ -31,6 +31,7 @@ import java.util.regex.Pattern;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Abortable;
import org.apache.hadoop.hbase.ClusterStatus;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HTableDescriptor;
@@ -1305,6 +1306,13 @@ public interface Admin extends Abortable, Closeable {
ClusterStatus getClusterStatus() throws IOException;
/**
+ * Get cluster status with options to filter out unwanted status.
+ * @return cluster status
+ * @throws IOException if a remote or network exception occurs
+ */
+ ClusterStatus getClusterStatus(Options options) throws IOException;
+
+ /**
* Get {@link RegionLoad} of all regions hosted on a regionserver.
*
* @param sn region server from which regionload is required.
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
index 7e4412d..f2f2bf1 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
@@ -27,6 +27,7 @@ import java.util.function.Function;
import java.util.regex.Pattern;
import org.apache.hadoop.hbase.ClusterStatus;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.ProcedureInfo;
import org.apache.hadoop.hbase.RegionLoad;
@@ -833,6 +834,11 @@ public interface AsyncAdmin {
CompletableFuture<ClusterStatus> getClusterStatus();
/**
+ * @return cluster status wrapped by {@link CompletableFuture}
+ */
+ CompletableFuture<ClusterStatus> getClusterStatus(Options options);
+
+ /**
* @return current master server name wrapped by {@link CompletableFuture}
*/
default CompletableFuture<ServerName> getMaster() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
index 9ba3b73..fbd8690 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
@@ -36,6 +36,7 @@ import io.netty.util.TimerTask;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hbase.ClusterStatus;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.ProcedureInfo;
import org.apache.hadoop.hbase.RegionLoad;
@@ -493,7 +494,12 @@ public class AsyncHBaseAdmin implements AsyncAdmin {
@Override
public CompletableFuture<ClusterStatus> getClusterStatus() {
- return wrap(rawAdmin.getClusterStatus());
+ return getClusterStatus(Options.getDefaultOptions());
+ }
+
+ @Override
+ public CompletableFuture<ClusterStatus> getClusterStatus(Options options) {
+ return wrap(rawAdmin.getClusterStatus(options));
}
@Override
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
index 66dbac5..11f3273 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
@@ -45,6 +45,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Abortable;
import org.apache.hadoop.hbase.ClusterStatus;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
import org.apache.hadoop.hbase.CompoundConfiguration;
import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
@@ -2074,13 +2075,18 @@ public class HBaseAdmin implements Admin {
@Override
public ClusterStatus getClusterStatus() throws IOException {
+ return getClusterStatus(Options.getDefaultOptions());
+ }
+
+ @Override
+ public ClusterStatus getClusterStatus(Options options) throws IOException {
return executeCallable(new MasterCallable<ClusterStatus>(getConnection(),
this.rpcControllerFactory) {
@Override
protected ClusterStatus rpcCall() throws Exception {
- GetClusterStatusRequest req = RequestConverter.buildGetClusterStatusRequest();
- return ProtobufUtil.convert(master.getClusterStatus(getRpcController(), req).
- getClusterStatus());
+ GetClusterStatusRequest req = RequestConverter.buildGetClusterStatusRequest(options);
+ return ProtobufUtil.convert(
+ master.getClusterStatus(getRpcController(), req).getClusterStatus());
}
});
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
index 285286a..03f64fc 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
@@ -55,7 +55,6 @@ import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.MetaTableAccessor;
import org.apache.hadoop.hbase.MetaTableAccessor.QueryType;
-import org.apache.hadoop.hbase.NotServingRegionException;
import org.apache.hadoop.hbase.ProcedureInfo;
import org.apache.hadoop.hbase.RegionLoad;
import org.apache.hadoop.hbase.RegionLocations;
@@ -69,6 +68,7 @@ import org.apache.hadoop.hbase.TableNotDisabledException;
import org.apache.hadoop.hbase.TableNotEnabledException;
import org.apache.hadoop.hbase.TableNotFoundException;
import org.apache.hadoop.hbase.UnknownRegionException;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.client.AsyncRpcRetryingCallerFactory.AdminRequestCallerBuilder;
import org.apache.hadoop.hbase.client.AsyncRpcRetryingCallerFactory.MasterRequestCallerBuilder;
@@ -2421,12 +2421,17 @@ public class RawAsyncHBaseAdmin implements AsyncAdmin {
@Override
public CompletableFuture<ClusterStatus> getClusterStatus() {
+ return getClusterStatus(Options.getDefaultOptions());
+ }
+
+ @Override
+ public CompletableFuture<ClusterStatus> getClusterStatus(Options options) {
return this
.<ClusterStatus> newMasterCaller()
.action(
(controller, stub) -> this
.<GetClusterStatusRequest, GetClusterStatusResponse, ClusterStatus> call(controller,
- stub, RequestConverter.buildGetClusterStatusRequest(),
+ stub, RequestConverter.buildGetClusterStatusRequest(options),
(s, c, req, done) -> s.getClusterStatus(c, req, done),
resp -> ProtobufUtil.convert(resp.getClusterStatus()))).call();
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
index 65e95b6..a527883 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
@@ -17,6 +17,7 @@
*/
package org.apache.hadoop.hbase.shaded.protobuf;
+import java.awt.image.BandCombineOp;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -3069,6 +3070,7 @@ public final class ProtobufUtil {
* @return the converted ClusterStatus
*/
public static ClusterStatus convert(ClusterStatusProtos.ClusterStatus proto) {
+ ClusterStatus.Builder builder = ClusterStatus.newBuilder();
Map<ServerName, ServerLoad> servers = null;
servers = new HashMap<>(proto.getLiveServersList().size());
@@ -3103,10 +3105,74 @@ public final class ProtobufUtil {
masterCoprocessors[i] = proto.getMasterCoprocessors(i).getName();
}
- return new ClusterStatus(proto.getHbaseVersion().getVersion(),
- ClusterId.convert(proto.getClusterId()).toString(),servers,deadServers,
- ProtobufUtil.toServerName(proto.getMaster()),backupMasters,rit,masterCoprocessors,
- proto.getBalancerOn());
+ String clusterId = null;
+ if (proto.hasClusterId()) {
+ clusterId = ClusterId.convert(proto.getClusterId()).toString();
+ }
+
+ String hbaseVersion = null;
+ if (proto.hasHbaseVersion()) {
+ hbaseVersion = proto.getHbaseVersion().getVersion();
+ }
+
+ ServerName master = null;
+ if (proto.hasMaster()) {
+ master = ProtobufUtil.toServerName(proto.getMaster());
+ }
+
+ Boolean balancerOn = null;
+ if (proto.hasBalancerOn()) {
+ balancerOn = proto.getBalancerOn();
+ }
+ builder.setHBaseVersion(hbaseVersion)
+ .setClusterId(clusterId)
+ .setLiveServers(servers)
+ .setDeadServers(deadServers)
+ .setMaster(master)
+ .setBackupMasters(backupMasters)
+ .setRegionState(rit)
+ .setMasterCoprocessors(masterCoprocessors)
+ .setBalancerOn(balancerOn);
+ return builder.build();
+ }
+
+ /**
+ * Convert proto ClusterStatus.Options to ClusterStatusProtos.Options
+ * @param opt
+ * @return proto ClusterStatus.Options
+ */
+ public static ClusterStatus.Options toOptions (ClusterStatusProtos.Options opt) {
+ ClusterStatus.Options option = ClusterStatus.Options.getDefaultOptions();
+ if (!opt.getIncludeHbaseVersion()) option.excludeHBaseVersion();
+ if (!opt.getIncludeLiveServers()) option.excludeLiveServers();
+ if (!opt.getIncludeDeadServers()) option.excludeDeadServers();
+ if (!opt.getIncludeRegionsState()) option.excludeRegionState();
+ if (!opt.getIncludeClusterId()) option.excludeClusterId();
+ if (!opt.getIncludeMasterCoprocessors()) option.excludeMasterCoprocessors();
+ if (!opt.getIncludeMaster()) option.excludeMaster();
+ if (!opt.getIncludeBackupMasters()) option.excludeBackupMasters();
+ if (!opt.getIncludeBalancerOn()) option.excludeBalancerOn();
+ return option;
+ }
+
+ /**
+ * Convert ClusterStatus.Options to proto ClusterStatusProtos.Options
+ * @param opt
+ * @return ClusterStatus.Options
+ */
+ public static ClusterStatusProtos.Options toOptions(ClusterStatus.Options opt) {
+ ClusterStatusProtos.Options.Builder option =
+ ClusterStatusProtos.Options.newBuilder();
+ option.setIncludeHbaseVersion(opt.includeHBaseVersion())
+ .setIncludeLiveServers(opt.includeLiveServers())
+ .setIncludeDeadServers(opt.includeDeadServers())
+ .setIncludeRegionsState(opt.includeRegionState())
+ .setIncludeClusterId(opt.includeClusterId())
+ .setIncludeMasterCoprocessors(opt.includeMasterCoprocessors())
+ .setIncludeMaster(opt.includeMaster())
+ .setIncludeBackupMasters(opt.includeBackupMasters())
+ .setIncludeBalancerOn(opt.includeBalancerOn());
+ return option.build();
}
/**
@@ -3117,8 +3183,11 @@ public final class ProtobufUtil {
public static ClusterStatusProtos.ClusterStatus convert(ClusterStatus status) {
ClusterStatusProtos.ClusterStatus.Builder builder =
ClusterStatusProtos.ClusterStatus.newBuilder();
- builder
- .setHbaseVersion(HBaseVersionFileContent.newBuilder().setVersion(status.getHBaseVersion()));
+ if (status.getHBaseVersion() != null) {
+ builder.setHbaseVersion(
+ HBaseVersionFileContent.newBuilder()
+ .setVersion(status.getHBaseVersion()));
+ }
if (status.getServers() != null) {
for (ServerName serverName : status.getServers()) {
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java
index e84a85f..be46c19 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java
@@ -26,10 +26,10 @@ import java.util.Set;
import java.util.regex.Pattern;
import org.apache.hadoop.hbase.CellScannable;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
import org.apache.hadoop.hbase.DoNotRetryIOException;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.HRegionInfo;
-import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
@@ -1508,18 +1508,14 @@ public final class RequestConverter {
}
/**
- * @see {@link #buildGetClusterStatusRequest}
- */
- private static final GetClusterStatusRequest GET_CLUSTER_STATUS_REQUEST =
- GetClusterStatusRequest.newBuilder().build();
-
- /**
* Creates a protocol buffer GetClusterStatusRequest
*
* @return A GetClusterStatusRequest
*/
- public static GetClusterStatusRequest buildGetClusterStatusRequest() {
- return GET_CLUSTER_STATUS_REQUEST;
+ public static GetClusterStatusRequest buildGetClusterStatusRequest(Options opt) {
+ return GetClusterStatusRequest.newBuilder()
+ .setClusterOptions(ProtobufUtil.toOptions(opt))
+ .build();
}
/**
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto
----------------------------------------------------------------------
diff --git a/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto b/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto
index d1525f7..d647bb1 100644
--- a/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto
@@ -225,3 +225,15 @@ message ClusterStatus {
repeated ServerName backup_masters = 8;
optional bool balancer_on = 9;
}
+
+message Options {
+ optional bool include_hbase_version = 1 [default = true];
+ optional bool include_live_servers = 2 [default = true];
+ optional bool include_dead_servers = 3 [default = true];
+ optional bool include_regions_state = 4 [default = true];
+ optional bool include_cluster_id = 5 [default = true];
+ optional bool include_master_coprocessors = 6 [default = true];
+ optional bool include_master = 7 [default = true];
+ optional bool include_backup_masters = 8 [default = true];
+ optional bool include_balancer_on = 9 [default = true];
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-protocol-shaded/src/main/protobuf/Master.proto
----------------------------------------------------------------------
diff --git a/hbase-protocol-shaded/src/main/protobuf/Master.proto b/hbase-protocol-shaded/src/main/protobuf/Master.proto
index 8d7cad9..33f9bf3 100644
--- a/hbase-protocol-shaded/src/main/protobuf/Master.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/Master.proto
@@ -485,6 +485,7 @@ message GetTableStateResponse {
}
message GetClusterStatusRequest {
+ required Options cluster_options = 1;
}
message GetClusterStatusResponse {
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-protocol/src/main/protobuf/ClusterStatus.proto
----------------------------------------------------------------------
diff --git a/hbase-protocol/src/main/protobuf/ClusterStatus.proto b/hbase-protocol/src/main/protobuf/ClusterStatus.proto
index 54bc0c3..4ae3230 100644
--- a/hbase-protocol/src/main/protobuf/ClusterStatus.proto
+++ b/hbase-protocol/src/main/protobuf/ClusterStatus.proto
@@ -225,3 +225,15 @@ message ClusterStatus {
repeated ServerName backup_masters = 8;
optional bool balancer_on = 9;
}
+
+message Options {
+ optional bool include_hbase_version = 1 [default = true];
+ optional bool include_live_servers = 2 [default = true];
+ optional bool include_dead_servers = 3 [default = true];
+ optional bool include_regions_state = 4 [default = true];
+ optional bool include_cluster_id = 5 [default = true];
+ optional bool include_master_coprocessors = 6 [default = true];
+ optional bool include_master = 7 [default = true];
+ optional bool include_backup_masters = 8 [default = true];
+ optional bool include_balancer_on = 9 [default = true];
+}
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java
index ea5516d..2c903fb 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterStatusPublisher.java
@@ -161,18 +161,12 @@ public class ClusterStatusPublisher extends ScheduledChore {
// We're reusing an existing protobuf message, but we don't send everything.
// This could be extended in the future, for example if we want to send stuff like the
// hbase:meta server name.
- ClusterStatus cs = new ClusterStatus(VersionInfo.getVersion(),
- master.getMasterFileSystem().getClusterId().toString(),
- null,
- sns,
- master.getServerName(),
- null,
- null,
- null,
- null);
-
-
- publisher.publish(cs);
+ ClusterStatus.Builder csBuilder = ClusterStatus.newBuilder();
+ csBuilder.setHBaseVersion(VersionInfo.getVersion())
+ .setClusterId(master.getMasterFileSystem().getClusterId().toString())
+ .setMaster(master.getServerName())
+ .setDeadServers(sns);
+ publisher.publish(csBuilder.build());
}
protected void cleanup() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
----------------------------------------------------------------------
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 421ae8b..faf0893 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
@@ -54,6 +54,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.ClusterStatus;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
import org.apache.hadoop.hbase.CoordinatedStateException;
import org.apache.hadoop.hbase.CoordinatedStateManager;
import org.apache.hadoop.hbase.DoNotRetryIOException;
@@ -2431,6 +2432,48 @@ public class HMaster extends HRegionServer implements MasterServices {
* @return cluster status
*/
public ClusterStatus getClusterStatus() throws InterruptedIOException {
+ return getClusterStatus(Options.getDefaultOptions());
+ }
+
+ /**
+ * @return cluster status
+ */
+ public ClusterStatus getClusterStatus(Options options) throws InterruptedIOException {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Retrieving cluster status info. " + options);
+ }
+ ClusterStatus.Builder builder = ClusterStatus.newBuilder();
+ if (options.includeHBaseVersion()) {
+ builder.setHBaseVersion(VersionInfo.getVersion());
+ }
+ if (options.includeClusterId()) {
+ builder.setClusterId(getClusterId());
+ }
+ if (options.includeLiveServers() && serverManager != null) {
+ builder.setLiveServers(serverManager.getOnlineServers());
+ }
+ if (options.includeDeadServers() && serverManager != null) {
+ builder.setDeadServers(serverManager.getDeadServers().copyServerNames());
+ }
+ if (options.includeMaster()) {
+ builder.setMaster(getServerName());
+ }
+ if (options.includeBackupMasters()) {
+ builder.setBackupMasters(getBackupMasters());
+ }
+ if (options.includeRegionState() && assignmentManager != null) {
+ builder.setRegionState(assignmentManager.getRegionStates().getRegionsStateInTransition());
+ }
+ if (options.includeMasterCoprocessors() && cpHost != null) {
+ builder.setMasterCoprocessors(getMasterCoprocessors());
+ }
+ if (options.includeBalancerOn() && loadBalancerTracker != null) {
+ builder.setBalancerOn(loadBalancerTracker.isBalancerOn());
+ }
+ return builder.build();
+ }
+
+ private List<ServerName> getBackupMasters() throws InterruptedIOException {
// Build Set of backup masters from ZK nodes
List<String> backupMasterStrings;
try {
@@ -2474,24 +2517,7 @@ public class HMaster extends HRegionServer implements MasterServices {
return s1.getServerName().compareTo(s2.getServerName());
}});
}
-
- String clusterId = fileSystemManager != null ?
- fileSystemManager.getClusterId().toString() : null;
- List<RegionState> regionsInTransition = assignmentManager != null ?
- assignmentManager.getRegionStates().getRegionsStateInTransition() : null;
-
- String[] coprocessors = cpHost != null ? getMasterCoprocessors() : null;
- boolean balancerOn = loadBalancerTracker != null ?
- loadBalancerTracker.isBalancerOn() : false;
- Map<ServerName, ServerLoad> onlineServers = null;
- Set<ServerName> deadServers = null;
- if (serverManager != null) {
- deadServers = serverManager.getDeadServers().copyServerNames();
- onlineServers = serverManager.getOnlineServers();
- }
- return new ClusterStatus(VersionInfo.getVersion(), clusterId,
- onlineServers, deadServers, serverName, backupMasters,
- regionsInTransition, coprocessors, balancerOn);
+ return backupMasters;
}
/**
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
----------------------------------------------------------------------
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 995df9b..6e9b1e2 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
@@ -762,7 +762,8 @@ public class MasterRpcServices extends RSRpcServices
GetClusterStatusResponse.Builder response = GetClusterStatusResponse.newBuilder();
try {
master.checkInitialized();
- response.setClusterStatus(ProtobufUtil.convert(master.getClusterStatus()));
+ response.setClusterStatus(ProtobufUtil.convert(
+ master.getClusterStatus(ProtobufUtil.toOptions(req.getClusterOptions()))));
} catch (IOException e) {
throw new ServiceException(e);
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/923195c3/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientClusterStatus.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientClusterStatus.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientClusterStatus.java
new file mode 100644
index 0000000..2cf7bc5
--- /dev/null
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientClusterStatus.java
@@ -0,0 +1,221 @@
+/**
+ * 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.client;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.ClusterStatus;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.ClusterStatus.Options;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.MiniHBaseCluster;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.regionserver.HRegionServer;
+import org.apache.hadoop.hbase.security.User;
+import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.apache.hadoop.hbase.util.JVMClusterUtil.MasterThread;
+import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * Test the ClusterStatus.
+ */
+@Category(SmallTests.class)
+public class TestClientClusterStatus {
+ private static HBaseTestingUtility UTIL;
+ private static Admin ADMIN;
+ private final static int SLAVES = 5;
+ private final static int MASTERS = 3;
+ private static MiniHBaseCluster CLUSTER;
+ private static HRegionServer DEAD;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ Configuration conf = HBaseConfiguration.create();
+ UTIL = new HBaseTestingUtility(conf);
+ UTIL.startMiniCluster(MASTERS, SLAVES);
+ CLUSTER = UTIL.getHBaseCluster();
+ CLUSTER.waitForActiveAndReadyMaster();
+ ADMIN = UTIL.getAdmin();
+ // Kill one region server
+ List<RegionServerThread> rsts = CLUSTER.getLiveRegionServerThreads();
+ RegionServerThread rst = rsts.get(rsts.size() - 1);
+ DEAD = rst.getRegionServer();
+ DEAD.stop("Test dead servers status");
+ while (!DEAD.isStopped()) {
+ Thread.sleep(500);
+ }
+ }
+
+ @Test
+ public void testDefaults() throws Exception {
+ ClusterStatus origin = ADMIN.getClusterStatus();
+ ClusterStatus defaults = ADMIN.getClusterStatus(Options.getDefaultOptions());
+ Assert.assertEquals(origin.getHBaseVersion(), defaults.getHBaseVersion());
+ Assert.assertEquals(origin.getClusterId(), defaults.getClusterId());
+ Assert.assertTrue(origin.getAverageLoad() == defaults.getAverageLoad());
+ Assert.assertTrue(origin.getBackupMastersSize() == defaults.getBackupMastersSize());
+ Assert.assertTrue(origin.getDeadServersSize() == defaults.getDeadServersSize());
+ Assert.assertTrue(origin.getRegionsCount() == defaults.getRegionsCount());
+ Assert.assertTrue(origin.getServersSize() == defaults.getServersSize());
+ }
+
+ @Test
+ public void testExclude() throws Exception {
+ ClusterStatus.Options options = Options.getDefaultOptions();
+ // Only retrieve master's coprocessors which are null in this test env.
+ options.excludeHBaseVersion()
+ .excludeBackupMasters()
+ .excludeBalancerOn()
+ .excludeClusterId()
+ .excludeLiveServers()
+ .excludeDeadServers()
+ .excludeMaster()
+ .excludeRegionState();
+ ClusterStatus status = ADMIN.getClusterStatus(options);
+ // Other cluster status info should be either null or empty.
+ Assert.assertTrue(status.getMasterCoprocessors().length == 0);
+ Assert.assertNull(status.getHBaseVersion());
+ Assert.assertTrue(status.getBackupMasters().isEmpty());
+ Assert.assertNull(status.getBalancerOn());
+ Assert.assertNull(status.getClusterId());
+ Assert.assertTrue(status.getServers().isEmpty());
+ Assert.assertTrue(status.getDeadServerNames().isEmpty());
+ Assert.assertNull(status.getMaster());
+ Assert.assertTrue(status.getBackupMasters().isEmpty());
+ }
+
+ @Test
+ public void testAsyncClient() throws Exception {
+ AsyncRegistry registry = AsyncRegistryFactory.getRegistry(UTIL.getConfiguration());
+ AsyncConnectionImpl asyncConnect = new AsyncConnectionImpl(UTIL.getConfiguration(), registry,
+ registry.getClusterId().get(), User.getCurrent());
+ AsyncAdmin asyncAdmin = asyncConnect.getAdmin();
+ CompletableFuture<ClusterStatus> originFuture =
+ asyncAdmin.getClusterStatus();
+ CompletableFuture<ClusterStatus> defaultsFuture =
+ asyncAdmin.getClusterStatus(Options.getDefaultOptions());
+ ClusterStatus origin = originFuture.get();
+ ClusterStatus defaults = defaultsFuture.get();
+ Assert.assertEquals(origin.getHBaseVersion(), defaults.getHBaseVersion());
+ Assert.assertEquals(origin.getClusterId(), defaults.getClusterId());
+ Assert.assertTrue(origin.getAverageLoad() == defaults.getAverageLoad());
+ Assert.assertTrue(origin.getBackupMastersSize() == defaults.getBackupMastersSize());
+ Assert.assertTrue(origin.getDeadServersSize() == defaults.getDeadServersSize());
+ Assert.assertTrue(origin.getRegionsCount() == defaults.getRegionsCount());
+ Assert.assertTrue(origin.getServersSize() == defaults.getServersSize());
+ if (asyncConnect != null) {
+ asyncConnect.close();
+ }
+ }
+
+ @Test
+ public void testLiveAndDeadServersStatus() throws Exception {
+ List<RegionServerThread> regionserverThreads = CLUSTER.getLiveRegionServerThreads();
+ int numRs = 0;
+ int len = regionserverThreads.size();
+ for (int i = 0; i < len; i++) {
+ if (regionserverThreads.get(i).isAlive()) {
+ numRs++;
+ }
+ }
+ // Retrieve live servers and dead servers info.
+ ClusterStatus.Options options = Options.getDefaultOptions();
+ options.excludeHBaseVersion()
+ .excludeBackupMasters()
+ .excludeBalancerOn()
+ .excludeClusterId()
+ .excludeMaster()
+ .excludeMasterCoprocessors()
+ .excludeRegionState();
+ ClusterStatus status = ADMIN.getClusterStatus(options);
+ Assert.assertNotNull(status);
+ Assert.assertNotNull(status.getServers());
+ // exclude a dead region server
+ Assert.assertEquals(SLAVES - 1, numRs);
+ // live servers = primary master + nums of regionservers
+ Assert.assertEquals(status.getServers().size() - 1, numRs);
+ Assert.assertTrue(status.getRegionsCount() > 0);
+ Assert.assertNotNull(status.getDeadServerNames());
+ Assert.assertEquals(1, status.getDeadServersSize());
+ ServerName deadServerName = status.getDeadServerNames().iterator().next();
+ Assert.assertEquals(DEAD.getServerName(), deadServerName);
+ }
+
+ @Test
+ public void testMasterAndBackupMastersStatus() throws Exception {
+ // get all the master threads
+ List<MasterThread> masterThreads = CLUSTER.getMasterThreads();
+ int numActive = 0;
+ int activeIndex = 0;
+ ServerName activeName = null;
+ HMaster active = null;
+ for (int i = 0; i < masterThreads.size(); i++) {
+ if (masterThreads.get(i).getMaster().isActiveMaster()) {
+ numActive++;
+ activeIndex = i;
+ active = masterThreads.get(activeIndex).getMaster();
+ activeName = active.getServerName();
+ }
+ }
+ Assert.assertNotNull(active);
+ Assert.assertEquals(1, numActive);
+ Assert.assertEquals(MASTERS, masterThreads.size());
+ // Retrieve master and backup masters infos only.
+ ClusterStatus.Options options = Options.getDefaultOptions();
+ options.excludeHBaseVersion()
+ .excludeBalancerOn()
+ .excludeClusterId()
+ .excludeLiveServers()
+ .excludeDeadServers()
+ .excludeMasterCoprocessors()
+ .excludeRegionState();
+ ClusterStatus status = ADMIN.getClusterStatus(options);
+ Assert.assertTrue(status.getMaster().equals(activeName));
+ Assert.assertEquals(MASTERS - 1, status.getBackupMastersSize());
+ }
+
+ @Test
+ public void testOtherStatusInfos() throws Exception {
+ ClusterStatus.Options options = Options.getDefaultOptions();
+ options.excludeMaster()
+ .excludeBackupMasters()
+ .excludeRegionState()
+ .excludeLiveServers()
+ .excludeBackupMasters();
+ ClusterStatus status = ADMIN.getClusterStatus(options);
+ Assert.assertTrue(status.getMasterCoprocessors().length == 0);
+ Assert.assertNotNull(status.getHBaseVersion());
+ Assert.assertNotNull(status.getClusterId());
+ Assert.assertTrue(status.getAverageLoad() == 0.0);
+ Assert.assertNotNull(status.getBalancerOn() && !status.getBalancerOn());
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ if (ADMIN != null) ADMIN.close();
+ UTIL.shutdownMiniCluster();
+ }
+}