From 51da00a6c634964a4ae6ff077711b5daa2a70716 Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Thu, 21 Mar 2024 20:55:13 -0700 Subject: [PATCH 1/9] HBASE-26192 Master UI hbck should provide a JSON formatted output option --- .../apache/hadoop/hbase/master/HMaster.java | 8 + .../hadoop/hbase/master/MasterServices.java | 4 + .../master/http/hbck/HbckConfigFactory.java | 54 ++++ .../http/hbck/model/HbckEmptyRegionInfo.java | 33 +++ .../hbck/model/HbckInconsistentRegions.java | 47 ++++ .../master/http/hbck/model/HbckMetrics.java | 88 ++++++ .../hbck/model/HbckOrphanRegionsOnFS.java | 39 +++ .../hbck/model/HbckOrphanRegionsOnRS.java | 39 +++ .../http/hbck/model/HbckOverlapRegions.java | 39 +++ .../http/hbck/model/HbckRegionDetails.java | 51 ++++ .../http/hbck/model/HbckRegionHoles.java | 39 +++ .../http/hbck/model/HbckServerName.java | 45 +++ .../http/hbck/model/HbckUnknownServers.java | 40 +++ .../hbck/resource/HbckMetricsResource.java | 151 ++++++++++ .../hbase/master/MockNoopMasterServices.java | 6 + .../master/http/TestHbckMetricsResource.java | 260 ++++++++++++++++++ 16 files changed, 943 insertions(+) create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionDetails.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckServerName.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java create mode 100644 hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java create mode 100644 hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.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 ddef3e27b405..a03d9d76490f 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 @@ -146,6 +146,7 @@ import org.apache.hadoop.hbase.master.http.MasterRedirectServlet; import org.apache.hadoop.hbase.master.http.MasterStatusServlet; import org.apache.hadoop.hbase.master.http.api_v1.ResourceConfigFactory; +import org.apache.hadoop.hbase.master.http.hbck.HbckConfigFactory; import org.apache.hadoop.hbase.master.janitor.CatalogJanitor; import org.apache.hadoop.hbase.master.locking.LockManager; import org.apache.hadoop.hbase.master.migrate.RollingUpgradeChore; @@ -760,6 +761,7 @@ protected MasterRpcServices createRpcServices() throws IOException { protected void configureInfoServer(InfoServer infoServer) { infoServer.addUnprivilegedServlet("master-status", "/master-status", MasterStatusServlet.class); infoServer.addUnprivilegedServlet("api_v1", "/api/v1/*", buildApiV1Servlet()); + infoServer.addUnprivilegedServlet("hbck", "/hbck/*", buildHbckServlet()); infoServer.setAttribute(MASTER, this); } @@ -769,6 +771,11 @@ private ServletHolder buildApiV1Servlet() { return new ServletHolder(new ServletContainer(config)); } + private ServletHolder buildHbckServlet() { + final ResourceConfig config = HbckConfigFactory.createResourceConfig(conf, this); + return new ServletHolder(new ServletContainer(config)); + } + @Override protected Class getDumpServlet() { return MasterDumpServlet.class; @@ -4253,6 +4260,7 @@ public SyncReplicationReplayWALManager getSyncReplicationReplayWALManager() { return this.syncReplicationReplayWALManager; } + @Override public HbckChore getHbckChore() { return this.hbckChore; } 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 b5e25bb44f33..3aa5c2df751b 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 @@ -34,6 +34,7 @@ import org.apache.hadoop.hbase.executor.ExecutorService; import org.apache.hadoop.hbase.favored.FavoredNodesManager; import org.apache.hadoop.hbase.master.assignment.AssignmentManager; +import org.apache.hadoop.hbase.master.hbck.HbckChore; import org.apache.hadoop.hbase.master.janitor.CatalogJanitor; import org.apache.hadoop.hbase.master.locking.LockManager; import org.apache.hadoop.hbase.master.normalizer.RegionNormalizerManager; @@ -106,6 +107,9 @@ public interface MasterServices extends Server { /** Returns Master's instance of {@link CatalogJanitor} */ CatalogJanitor getCatalogJanitor(); + /** Returns Master's instance of {@link HbckChore} */ + HbckChore getHbckChore(); + /** Returns Master's instance of {@link ProcedureExecutor} */ ProcedureExecutor getMasterProcedureExecutor(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java new file mode 100644 index 000000000000..48f4ceae01c5 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java @@ -0,0 +1,54 @@ +/* + * 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.http.hbck; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.http.jersey.ResponseEntityMapper; +import org.apache.hadoop.hbase.master.HMaster; +import org.apache.hadoop.hbase.master.http.gson.GsonSerializationFeature; +import org.apache.hadoop.hbase.master.http.jersey.MasterFeature; +import org.apache.yetus.audience.InterfaceAudience; + +import org.apache.hbase.thirdparty.org.glassfish.jersey.server.ResourceConfig; +import org.apache.hbase.thirdparty.org.glassfish.jersey.server.ServerProperties; +import org.apache.hbase.thirdparty.org.glassfish.jersey.server.TracingConfig; + +@InterfaceAudience.Private +public class HbckConfigFactory { + private HbckConfigFactory() { + } + + public static ResourceConfig createResourceConfig(Configuration conf, HMaster master) { + return new ResourceConfig().setApplicationName("hbck") + .packages(HbckConfigFactory.class.getPackage().getName()) + // TODO: anything registered here that does not have necessary bindings won't inject properly + // at annotation sites and will result in a WARN logged by o.a.h.t.o.g.j.i.inject.Providers. + // These warnings should be treated by the service as fatal errors, but I have not found a + // callback API for registering a failed binding handler. + .register(ResponseEntityMapper.class).register(GsonSerializationFeature.class) + .register(new MasterFeature(master)) + + // devs: enable TRACING to see how jersey is dispatching to resources. + // in hbase-site.xml, set 'hbase.http.jersey.tracing.type=ON_DEMAND` and + // to curl, add `-H X-Jersey-Tracing-Accept:true` + .property(ServerProperties.TRACING, + conf.get("hbase.http.jersey.tracing.type", TracingConfig.OFF.name())) + .property(ServerProperties.TRACING_THRESHOLD, + conf.get("hbase.http.jersey.tracing.threshold", "TRACE")); + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java new file mode 100644 index 000000000000..0d8d8a678c24 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java @@ -0,0 +1,33 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckEmptyRegionInfo { + private final String emptyRegionInfo; + + public HbckEmptyRegionInfo(String emptyRegionInfo) { + this.emptyRegionInfo = emptyRegionInfo; + } + + public String getEmptyRegionInfo() { + return emptyRegionInfo; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java new file mode 100644 index 000000000000..3a6926c98567 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java @@ -0,0 +1,47 @@ +/* + * 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.http.hbck.model; + +import java.util.List; +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckInconsistentRegions { + private final String inconsistentRegionId; + private final HbckServerName serverNameInMeta; + private final List listOfServerName; + + public HbckInconsistentRegions(String inconsistentRegionId, HbckServerName serverNameInMeta, + List listOfServerName) { + this.inconsistentRegionId = inconsistentRegionId; + this.serverNameInMeta = serverNameInMeta; + this.listOfServerName = listOfServerName; + } + + public String getInconsistentRegionId() { + return inconsistentRegionId; + } + + public HbckServerName getServerNameInMeta() { + return serverNameInMeta; + } + + public List getListOfServerName() { + return listOfServerName; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java new file mode 100644 index 000000000000..9d7a20d4f7ca --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java @@ -0,0 +1,88 @@ +/* + * 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.http.hbck.model; + +import java.util.List; +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckMetrics { + + private final long hbckReportStartTime; + private final long hbckReportEndTime; + private final List hbckOrphanRegionsOnFs; + private final List hbckOrphanRegionsOnRs; + private final List hbckInconsistentRegions; + private final List hbckHoles; + private final List hbckOverlaps; + private final List hbckUnknownServers; + private final List hbckEmptyRegionInfo; + + public HbckMetrics(long hbckReportStartTime, long hbckReportEndTime, + List hbckOrphanRegionsOnFs, + List hbckOrphanRegionsOnRs, + List hbckInconsistentRegions, List hbckHoles, + List hbckOverlaps, List hbckUnknownServers, + List hbckEmptyRegionInfo) { + this.hbckReportStartTime = hbckReportStartTime; + this.hbckReportEndTime = hbckReportEndTime; + this.hbckOrphanRegionsOnFs = hbckOrphanRegionsOnFs; + this.hbckOrphanRegionsOnRs = hbckOrphanRegionsOnRs; + this.hbckInconsistentRegions = hbckInconsistentRegions; + this.hbckHoles = hbckHoles; + this.hbckOverlaps = hbckOverlaps; + this.hbckUnknownServers = hbckUnknownServers; + this.hbckEmptyRegionInfo = hbckEmptyRegionInfo; + } + + public long gethbckReportStartTime() { + return hbckReportStartTime; + } + + public long gethbckReportEndTime() { + return hbckReportEndTime; + } + + public List gethbckOrphanRegionsOnFs() { + return hbckOrphanRegionsOnFs; + } + + public List gethbckOrphanRegionsOnRs() { + return hbckOrphanRegionsOnRs; + } + + public List gethbckInconsistentRegions() { + return hbckInconsistentRegions; + } + + public List gethbckHoles() { + return hbckHoles; + } + + public List gethbckOverlaps() { + return hbckOverlaps; + } + + public List gethbckUnknownServers() { + return hbckUnknownServers; + } + + public List gethbckEmptyRegionInfo() { + return hbckEmptyRegionInfo; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java new file mode 100644 index 000000000000..037c596a7ff9 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java @@ -0,0 +1,39 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckOrphanRegionsOnFS { + private final String orphanRegionId; + private final String orphanRegionHdfsPath; + + public HbckOrphanRegionsOnFS(String regionId, String orphanRegionHdfsPath) { + this.orphanRegionId = regionId; + this.orphanRegionHdfsPath = orphanRegionHdfsPath; + } + + public String getOrphanRegionId() { + return orphanRegionId; + } + + public String getOrphanRegionHdfsPath() { + return orphanRegionHdfsPath; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java new file mode 100644 index 000000000000..599981549bff --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java @@ -0,0 +1,39 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckOrphanRegionsOnRS { + private final String orphanRegionId; + private final HbckServerName orphanRegionRsName; + + public HbckOrphanRegionsOnRS(String orphanRegionId, HbckServerName orphanRegionRsName) { + this.orphanRegionId = orphanRegionId; + this.orphanRegionRsName = orphanRegionRsName; + } + + public String getOrphanRegionId() { + return orphanRegionId; + } + + public HbckServerName getOrphanRegionRsName() { + return orphanRegionRsName; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java new file mode 100644 index 000000000000..d2fd2939ec48 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java @@ -0,0 +1,39 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckOverlapRegions { + private final HbckRegionDetails overlapRegion1; + private final HbckRegionDetails overlapRegion2; + + public HbckOverlapRegions(HbckRegionDetails overlapRegion1, HbckRegionDetails overlapRegion2) { + this.overlapRegion1 = overlapRegion1; + this.overlapRegion2 = overlapRegion2; + } + + public HbckRegionDetails getOverlapRegion1() { + return overlapRegion1; + } + + public HbckRegionDetails getOverlapRegion2() { + return overlapRegion2; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionDetails.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionDetails.java new file mode 100644 index 000000000000..103f36460eea --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionDetails.java @@ -0,0 +1,51 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckRegionDetails { + private final String regionId; + private final String tableName; + private final String startKey; + private final String endKey; + + public HbckRegionDetails(String regionId, String tableName, String startKey, String endKey) { + this.regionId = regionId; + this.tableName = tableName; + this.startKey = startKey; + this.endKey = endKey; + } + + public String getRegionId() { + return regionId; + } + + public String getTableName() { + return tableName; + } + + public String getStartKey() { + return startKey; + } + + public String getEndKey() { + return endKey; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java new file mode 100644 index 000000000000..2d04adfbe781 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java @@ -0,0 +1,39 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckRegionHoles { + private final HbckRegionDetails regionHole1; + private final HbckRegionDetails regionHole2; + + public HbckRegionHoles(HbckRegionDetails regionHole1, HbckRegionDetails regionHole2) { + this.regionHole1 = regionHole1; + this.regionHole2 = regionHole2; + } + + public HbckRegionDetails getRegionHole1() { + return regionHole1; + } + + public HbckRegionDetails getRegionHole2() { + return regionHole2; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckServerName.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckServerName.java new file mode 100644 index 000000000000..1834d8208f91 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckServerName.java @@ -0,0 +1,45 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckServerName { + private final String hostName; + private final int hostPort; + private final long startCode; + + public HbckServerName(String hostName, int hostPort, long startCode) { + this.hostName = hostName; + this.hostPort = hostPort; + this.startCode = startCode; + } + + public String getHostName() { + return hostName; + } + + public int getHostPort() { + return hostPort; + } + + public long getStartCode() { + return startCode; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java new file mode 100644 index 000000000000..000d976aa339 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java @@ -0,0 +1,40 @@ +/* + * 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.http.hbck.model; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public class HbckUnknownServers { + private final HbckRegionDetails unknownServerRegionId; + private final HbckServerName unknownServerName; + + public HbckUnknownServers(HbckRegionDetails unknownServerRegionId, + HbckServerName unknownServerName) { + this.unknownServerRegionId = unknownServerRegionId; + this.unknownServerName = unknownServerName; + } + + public HbckRegionDetails getUnknownServerRegionId() { + return unknownServerRegionId; + } + + public HbckServerName getUnknownServerName() { + return unknownServerName; + } +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java new file mode 100644 index 000000000000..7d884feafb6c --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java @@ -0,0 +1,151 @@ +/* + * 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.http.hbck.resource; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import javax.inject.Inject; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.client.RegionInfo; +import org.apache.hadoop.hbase.master.MasterServices; +import org.apache.hadoop.hbase.master.hbck.HbckReport; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckEmptyRegionInfo; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckInconsistentRegions; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckMetrics; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckOrphanRegionsOnFS; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckOrphanRegionsOnRS; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckOverlapRegions; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckRegionDetails; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckRegionHoles; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckServerName; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckUnknownServers; +import org.apache.hadoop.hbase.master.janitor.CatalogJanitorReport; +import org.apache.hadoop.hbase.util.Bytes; +import org.apache.yetus.audience.InterfaceAudience; + +import org.apache.hbase.thirdparty.javax.ws.rs.GET; +import org.apache.hbase.thirdparty.javax.ws.rs.Path; +import org.apache.hbase.thirdparty.javax.ws.rs.Produces; +import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; + +@Path("hbck_metrics") +@Produces({ MediaType.APPLICATION_JSON }) +@InterfaceAudience.Private +public class HbckMetricsResource { + private final HbckReport hbckReport; + private final CatalogJanitorReport catalogJanitorReport; + + @Inject + public HbckMetricsResource(MasterServices master) { + this.hbckReport = master.getHbckChore().getLastReport(); + this.catalogJanitorReport = master.getCatalogJanitor().getLastReport(); + } + + @GET + public HbckMetrics getBaseHbckMetrics() { + return new HbckMetrics(hbckReport.getCheckingStartTimestamp().toEpochMilli(), + hbckReport.getCheckingEndTimestamp().toEpochMilli(), getOrphanRegionsOnFS(), + getOrphanRegionsOnRS(), getInconsistentRegions(), getRegionChainHoles(), + getRegionChainOverlap(), getUnknownServers(), getEmptyRegionInfo()); + } + + @GET + @Path("/temp_inconsistent_regions") + public List tempGetInconsistentRegions() { + HbckServerName hbckServerName = new HbckServerName("localhost", 16010, 12345); + List serverNamesList = new ArrayList<>(); + serverNamesList.add(hbckServerName); + HbckInconsistentRegions hbckInconsistentRegion = + new HbckInconsistentRegions("abcdefef", hbckServerName, serverNamesList); + List listOfHbckInconsistentRegions = new ArrayList<>(); + listOfHbckInconsistentRegions.add(hbckInconsistentRegion); + return listOfHbckInconsistentRegions; + } + + @GET + @Path("/orphan_regions_on_fs") + public List getOrphanRegionsOnFS() { + return hbckReport.getOrphanRegionsOnFS().entrySet().stream() + .map(obj1 -> new HbckOrphanRegionsOnFS(obj1.getKey(), obj1.getValue().toString())) + .collect(Collectors.toList()); + } + + @GET + @Path("/orphan_regions_on_rs") + public List getOrphanRegionsOnRS() { + return hbckReport.getOrphanRegionsOnRS().entrySet().stream() + .map(obj1 -> new HbckOrphanRegionsOnRS(obj1.getKey(), parseServerName(obj1.getValue()))) + .collect(Collectors.toList()); + } + + @GET + @Path("/inconsistent_regions") + public List getInconsistentRegions() { + return hbckReport.getInconsistentRegions().entrySet().stream() + .map(obj1 -> new HbckInconsistentRegions(obj1.getKey(), + parseServerName(obj1.getValue().getFirst()), obj1.getValue().getSecond().stream() + .map(this::parseServerName).collect(Collectors.toList()))) + .collect(Collectors.toList()); + } + + @GET + @Path("/region_holes") + public List getRegionChainHoles() { + return catalogJanitorReport.getHoles().stream() + .map(obj1 -> new HbckRegionHoles(parseRegionInfo(obj1.getFirst()), + parseRegionInfo(obj1.getSecond()))) + .collect(Collectors.toList()); + } + + @GET + @Path("/region_overlaps") + public List getRegionChainOverlap() { + return catalogJanitorReport.getOverlaps().stream() + .map(obj1 -> new HbckOverlapRegions(parseRegionInfo(obj1.getFirst()), + parseRegionInfo(obj1.getSecond()))) + .collect(Collectors.toList()); + } + + @GET + @Path("/unknown_servers") + public List getUnknownServers() { + return catalogJanitorReport.getUnknownServers().stream() + .map(obj1 -> new HbckUnknownServers(parseRegionInfo(obj1.getFirst()), + parseServerName(obj1.getSecond()))) + .collect(Collectors.toList()); + } + + @GET + @Path("/empty_regioninfo") + public List getEmptyRegionInfo() { + return catalogJanitorReport.getEmptyRegionInfo().stream() + .map(obj1 -> new HbckEmptyRegionInfo(Bytes.toString(obj1))).collect(Collectors.toList()); + } + + public HbckRegionDetails parseRegionInfo(RegionInfo regionInfo) { + return new HbckRegionDetails(regionInfo.getEncodedName(), + regionInfo.getTable().getNameAsString(), new String(regionInfo.getStartKey()), + new String(regionInfo.getEndKey())); + } + + public HbckServerName parseServerName(ServerName serverName) { + return new HbckServerName(serverName.getHostname(), serverName.getPort(), + serverName.getStartCode()); + } +} diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java index 0c4f3d7db266..3d4d63722e09 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockNoopMasterServices.java @@ -39,6 +39,7 @@ import org.apache.hadoop.hbase.executor.ExecutorService; import org.apache.hadoop.hbase.favored.FavoredNodesManager; import org.apache.hadoop.hbase.master.assignment.AssignmentManager; +import org.apache.hadoop.hbase.master.hbck.HbckChore; import org.apache.hadoop.hbase.master.janitor.CatalogJanitor; import org.apache.hadoop.hbase.master.locking.LockManager; import org.apache.hadoop.hbase.master.normalizer.RegionNormalizerManager; @@ -117,6 +118,11 @@ public CatalogJanitor getCatalogJanitor() { return null; } + @Override + public HbckChore getHbckChore() { + return null; + } + @Override public MasterFileSystem getMasterFileSystem() { return null; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java new file mode 100644 index 000000000000..646204b17d66 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java @@ -0,0 +1,260 @@ +/* + * 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.http; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.startsWith; +import static org.junit.Assert.assertThrows; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.ConnectionRule; +import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.MiniClusterRule; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.StartTestingClusterOption; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.AsyncAdmin; +import org.apache.hadoop.hbase.client.AsyncConnection; +import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; +import org.apache.hadoop.hbase.client.Durability; +import org.apache.hadoop.hbase.client.TableDescriptor; +import org.apache.hadoop.hbase.client.TableDescriptorBuilder; +import org.apache.hadoop.hbase.master.http.hbck.resource.HbckMetricsResource; +import org.apache.hadoop.hbase.testclassification.LargeTests; +import org.apache.hadoop.hbase.testclassification.MasterTests; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.rules.ExternalResource; +import org.junit.rules.RuleChain; + +import org.apache.hbase.thirdparty.javax.ws.rs.NotAcceptableException; +import org.apache.hbase.thirdparty.javax.ws.rs.client.Client; +import org.apache.hbase.thirdparty.javax.ws.rs.client.ClientBuilder; +import org.apache.hbase.thirdparty.javax.ws.rs.client.WebTarget; +import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; + +/** + * Tests for the master api_v1 {@link HbckMetricsResource}. + */ +@Category({ MasterTests.class, LargeTests.class }) +public class TestHbckMetricsResource { + + @ClassRule + public static final HBaseClassTestRule CLASS_RULE = + HBaseClassTestRule.forClass(TestHbckMetricsResource.class); + + private static final MiniClusterRule miniClusterRule = MiniClusterRule.newBuilder() + .setMiniClusterOption( + StartTestingClusterOption.builder().numZkServers(3).numMasters(3).numDataNodes(3).build()) + .setConfiguration(() -> { + // enable Master InfoServer and random port selection + final Configuration conf = HBaseConfiguration.create(); + conf.setInt(HConstants.MASTER_INFO_PORT, 0); + conf.set("hbase.http.jersey.tracing.type", "ON_DEMAND"); + // If we don't set this value to higher like 5sec, hbck chore won't get a chance to run and + // the all tests in this class will fail. + conf.setInt("hbase.master.hbck.chore.interval", 1000); + return conf; + }).build(); + + private static final ConnectionRule connectionRule = + ConnectionRule.createAsyncConnectionRule(miniClusterRule::createAsyncConnection); + private static final ClassSetup classRule = new ClassSetup(connectionRule::getAsyncConnection); + + private static final class ClassSetup extends ExternalResource { + + private final Supplier connectionSupplier; + private final TableName tableName; + private AsyncAdmin admin; + private WebTarget target; + + public ClassSetup(final Supplier connectionSupplier) { + this.connectionSupplier = connectionSupplier; + tableName = TableName.valueOf(TestHbckMetricsResource.class.getSimpleName()); + } + + public WebTarget getTarget() { + return target; + } + + @Override + protected void before() throws Throwable { + final AsyncConnection conn = connectionSupplier.get(); + admin = conn.getAdmin(); + final TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(tableName) + .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("c")).build()) + .setDurability(Durability.SKIP_WAL).build(); + admin.createTable(tableDescriptor).get(); + + final String baseUrl = + admin.getMaster().thenApply(ServerName::getHostname).thenCombine(admin.getMasterInfoPort(), + (hostName, infoPort) -> "http://" + hostName + ":" + infoPort).get(); + final Client client = ClientBuilder.newClient(); + target = client.target(baseUrl).path("hbck/hbck_metrics"); + } + + @Override + protected void after() { + final TableName tableName = TableName.valueOf("test"); + try { + admin.tableExists(tableName).thenCompose(val -> { + if (val) { + return admin.disableTable(tableName) + .thenCompose(ignored -> admin.deleteTable(tableName)); + } else { + return CompletableFuture.completedFuture(null); + } + }).get(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @ClassRule + public static RuleChain ruleChain = + RuleChain.outerRule(miniClusterRule).around(connectionRule).around(classRule); + + @Test + public void testGetRoot() { + final String response = classRule.getTarget().request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(containsString("\"hbck_report_start_time\":"), + containsString("\"hbck_report_end_time\":"), containsString("\"hbck_orphan_regions_on_fs\":"), + containsString("\"hbck_orphan_regions_on_rs\":"), + containsString("\"hbck_inconsistent_regions\":"), containsString("\"hbck_holes\":"), + containsString("\"hbck_overlaps\":"), containsString("\"hbck_unknown_servers\":"), + containsString("\"hbck_empty_region_info\":"))); + } + + @Test + public void testGetRootHtml() { + assertThrows(NotAcceptableException.class, () -> classRule.getTarget() + .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); + } + + @Test + public void testGetOrphanRegionOnFS() { + final String response = + classRule.getTarget().path("orphan_regions_on_fs").request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + } + + @Test + public void testGetOrphanRegionOnFSHtml() { + assertThrows(NotAcceptableException.class, + () -> classRule.getTarget().path("orphan_regions_on_fs").request(MediaType.TEXT_HTML_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class)); + } + + @Test + public void testGetOrphanRegionOnRS() { + final String response = + classRule.getTarget().path("orphan_regions_on_rs").request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + } + + @Test + public void testGetOrphanRegionOnRSHtml() { + assertThrows(NotAcceptableException.class, + () -> classRule.getTarget().path("orphan_regions_on_rs").request(MediaType.TEXT_HTML_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class)); + } + + @Test + public void testGetInconsistentRegions() { + final String response = + classRule.getTarget().path("inconsistent_regions").request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + } + + @Test + public void testGetInconsistentRegionsHtml() { + assertThrows(NotAcceptableException.class, + () -> classRule.getTarget().path("inconsistent_regions").request(MediaType.TEXT_HTML_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class)); + } + + @Test + public void testGetRegionHoles() { + final String response = + classRule.getTarget().path("region_holes").request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + } + + @Test + public void testGetRegionHolesHtml() { + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("region_holes") + .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); + } + + @Test + public void testGetRegionOverlaps() { + final String response = + classRule.getTarget().path("region_overlaps").request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + } + + @Test + public void testGetRegionOverlapsHtml() { + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("region_overlaps") + .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); + } + + @Test + public void testGetUnkownServers() { + final String response = + classRule.getTarget().path("unknown_servers").request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + } + + @Test + public void testGetUnkownServersHtml() { + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("unknown_servers") + .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); + } + + @Test + public void testGetEmptyRegionInfo() { + final String response = + classRule.getTarget().path("empty_regioninfo").request(MediaType.APPLICATION_JSON_TYPE) + .header("X-Jersey-Tracing-Accept", true).get(String.class); + assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + } + + @Test + public void testGetEmptyRegionInfoHtml() { + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("empty_regioninfo") + .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); + } +} From 0529d5007297c4ca244dab864352823db75e2dd7 Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Thu, 21 Mar 2024 21:07:04 -0700 Subject: [PATCH 2/9] Remove extra test method --- .../http/hbck/resource/HbckMetricsResource.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java index 7d884feafb6c..962773fb4501 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java @@ -65,19 +65,6 @@ public HbckMetrics getBaseHbckMetrics() { getRegionChainOverlap(), getUnknownServers(), getEmptyRegionInfo()); } - @GET - @Path("/temp_inconsistent_regions") - public List tempGetInconsistentRegions() { - HbckServerName hbckServerName = new HbckServerName("localhost", 16010, 12345); - List serverNamesList = new ArrayList<>(); - serverNamesList.add(hbckServerName); - HbckInconsistentRegions hbckInconsistentRegion = - new HbckInconsistentRegions("abcdefef", hbckServerName, serverNamesList); - List listOfHbckInconsistentRegions = new ArrayList<>(); - listOfHbckInconsistentRegions.add(hbckInconsistentRegion); - return listOfHbckInconsistentRegions; - } - @GET @Path("/orphan_regions_on_fs") public List getOrphanRegionsOnFS() { From 919d49cd6b912548a4e0181a6c91c73d7fe6f681 Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Thu, 21 Mar 2024 22:54:56 -0700 Subject: [PATCH 3/9] Updated variable names for better JSON Reponse --- .../http/hbck/model/HbckEmptyRegionInfo.java | 8 ++++---- .../http/hbck/model/HbckInconsistentRegions.java | 16 ++++++++-------- .../http/hbck/model/HbckOrphanRegionsOnFS.java | 16 ++++++++-------- .../http/hbck/model/HbckOrphanRegionsOnRS.java | 16 ++++++++-------- .../http/hbck/model/HbckOverlapRegions.java | 16 ++++++++-------- .../master/http/hbck/model/HbckRegionHoles.java | 16 ++++++++-------- .../http/hbck/model/HbckUnknownServers.java | 16 ++++++++-------- 7 files changed, 52 insertions(+), 52 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java index 0d8d8a678c24..835178abb8a2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java @@ -21,13 +21,13 @@ @InterfaceAudience.Private public class HbckEmptyRegionInfo { - private final String emptyRegionInfo; + private final String regionInfo; public HbckEmptyRegionInfo(String emptyRegionInfo) { - this.emptyRegionInfo = emptyRegionInfo; + this.regionInfo = emptyRegionInfo; } - public String getEmptyRegionInfo() { - return emptyRegionInfo; + public String getRegionInfo() { + return regionInfo; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java index 3a6926c98567..2d165cdef36c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java @@ -22,26 +22,26 @@ @InterfaceAudience.Private public class HbckInconsistentRegions { - private final String inconsistentRegionId; + private final String regionId; private final HbckServerName serverNameInMeta; - private final List listOfServerName; + private final List listOfServers; public HbckInconsistentRegions(String inconsistentRegionId, HbckServerName serverNameInMeta, List listOfServerName) { - this.inconsistentRegionId = inconsistentRegionId; + this.regionId = inconsistentRegionId; this.serverNameInMeta = serverNameInMeta; - this.listOfServerName = listOfServerName; + this.listOfServers = listOfServerName; } - public String getInconsistentRegionId() { - return inconsistentRegionId; + public String getRegionId() { + return regionId; } public HbckServerName getServerNameInMeta() { return serverNameInMeta; } - public List getListOfServerName() { - return listOfServerName; + public List getListOfServers() { + return listOfServers; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java index 037c596a7ff9..e6ed22b179f4 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java @@ -21,19 +21,19 @@ @InterfaceAudience.Private public class HbckOrphanRegionsOnFS { - private final String orphanRegionId; - private final String orphanRegionHdfsPath; + private final String regionId; + private final String regionHdfsPath; public HbckOrphanRegionsOnFS(String regionId, String orphanRegionHdfsPath) { - this.orphanRegionId = regionId; - this.orphanRegionHdfsPath = orphanRegionHdfsPath; + this.regionId = regionId; + this.regionHdfsPath = orphanRegionHdfsPath; } - public String getOrphanRegionId() { - return orphanRegionId; + public String getRegionId() { + return regionId; } - public String getOrphanRegionHdfsPath() { - return orphanRegionHdfsPath; + public String getRegionHdfsPath() { + return regionHdfsPath; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java index 599981549bff..66b48a2f83e3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java @@ -21,19 +21,19 @@ @InterfaceAudience.Private public class HbckOrphanRegionsOnRS { - private final String orphanRegionId; - private final HbckServerName orphanRegionRsName; + private final String regionId; + private final HbckServerName rsName; public HbckOrphanRegionsOnRS(String orphanRegionId, HbckServerName orphanRegionRsName) { - this.orphanRegionId = orphanRegionId; - this.orphanRegionRsName = orphanRegionRsName; + this.regionId = orphanRegionId; + this.rsName = orphanRegionRsName; } - public String getOrphanRegionId() { - return orphanRegionId; + public String getRegionId() { + return regionId; } - public HbckServerName getOrphanRegionRsName() { - return orphanRegionRsName; + public HbckServerName getRsName() { + return rsName; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java index d2fd2939ec48..e4b3b74a82b5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java @@ -21,19 +21,19 @@ @InterfaceAudience.Private public class HbckOverlapRegions { - private final HbckRegionDetails overlapRegion1; - private final HbckRegionDetails overlapRegion2; + private final HbckRegionDetails region1; + private final HbckRegionDetails region2; public HbckOverlapRegions(HbckRegionDetails overlapRegion1, HbckRegionDetails overlapRegion2) { - this.overlapRegion1 = overlapRegion1; - this.overlapRegion2 = overlapRegion2; + this.region1 = overlapRegion1; + this.region2 = overlapRegion2; } - public HbckRegionDetails getOverlapRegion1() { - return overlapRegion1; + public HbckRegionDetails getRegion1() { + return region1; } - public HbckRegionDetails getOverlapRegion2() { - return overlapRegion2; + public HbckRegionDetails getRegion2() { + return region2; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java index 2d04adfbe781..e96a48e61049 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java @@ -21,19 +21,19 @@ @InterfaceAudience.Private public class HbckRegionHoles { - private final HbckRegionDetails regionHole1; - private final HbckRegionDetails regionHole2; + private final HbckRegionDetails region1; + private final HbckRegionDetails region2; public HbckRegionHoles(HbckRegionDetails regionHole1, HbckRegionDetails regionHole2) { - this.regionHole1 = regionHole1; - this.regionHole2 = regionHole2; + this.region1 = regionHole1; + this.region2 = regionHole2; } - public HbckRegionDetails getRegionHole1() { - return regionHole1; + public HbckRegionDetails getRegion1() { + return region1; } - public HbckRegionDetails getRegionHole2() { - return regionHole2; + public HbckRegionDetails getRegion2() { + return region2; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java index 000d976aa339..06148de94b1e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java @@ -21,20 +21,20 @@ @InterfaceAudience.Private public class HbckUnknownServers { - private final HbckRegionDetails unknownServerRegionId; - private final HbckServerName unknownServerName; + private final HbckRegionDetails serverRegionId; + private final HbckServerName serverName; public HbckUnknownServers(HbckRegionDetails unknownServerRegionId, HbckServerName unknownServerName) { - this.unknownServerRegionId = unknownServerRegionId; - this.unknownServerName = unknownServerName; + this.serverRegionId = unknownServerRegionId; + this.serverName = unknownServerName; } - public HbckRegionDetails getUnknownServerRegionId() { - return unknownServerRegionId; + public HbckRegionDetails getServerRegionId() { + return serverRegionId; } - public HbckServerName getUnknownServerName() { - return unknownServerName; + public HbckServerName getServerName() { + return serverName; } } From c449580add51fa6ce650c5b6fe269843ef6d8b8e Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Fri, 22 Mar 2024 04:01:21 -0700 Subject: [PATCH 4/9] PR review comments --- .../http/hbck/model/HbckOverlapRegions.java | 6 +++--- .../http/hbck/resource/HbckMetricsResource.java | 17 ++++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java index e4b3b74a82b5..84571219b1cf 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java @@ -24,9 +24,9 @@ public class HbckOverlapRegions { private final HbckRegionDetails region1; private final HbckRegionDetails region2; - public HbckOverlapRegions(HbckRegionDetails overlapRegion1, HbckRegionDetails overlapRegion2) { - this.region1 = overlapRegion1; - this.region2 = overlapRegion2; + public HbckOverlapRegions(HbckRegionDetails region1, HbckRegionDetails region2) { + this.region1 = region1; + this.region2 = region2; } public HbckRegionDetails getRegion1() { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java index 962773fb4501..2b969a430787 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java @@ -17,7 +17,6 @@ */ package org.apache.hadoop.hbase.master.http.hbck.resource; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; @@ -44,7 +43,7 @@ import org.apache.hbase.thirdparty.javax.ws.rs.Produces; import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; -@Path("hbck_metrics") +@Path("hbck-metrics") @Produces({ MediaType.APPLICATION_JSON }) @InterfaceAudience.Private public class HbckMetricsResource { @@ -66,7 +65,7 @@ public HbckMetrics getBaseHbckMetrics() { } @GET - @Path("/orphan_regions_on_fs") + @Path("/orphan-regions-on-fs") public List getOrphanRegionsOnFS() { return hbckReport.getOrphanRegionsOnFS().entrySet().stream() .map(obj1 -> new HbckOrphanRegionsOnFS(obj1.getKey(), obj1.getValue().toString())) @@ -74,7 +73,7 @@ public List getOrphanRegionsOnFS() { } @GET - @Path("/orphan_regions_on_rs") + @Path("/orphan-regions-on-rs") public List getOrphanRegionsOnRS() { return hbckReport.getOrphanRegionsOnRS().entrySet().stream() .map(obj1 -> new HbckOrphanRegionsOnRS(obj1.getKey(), parseServerName(obj1.getValue()))) @@ -82,7 +81,7 @@ public List getOrphanRegionsOnRS() { } @GET - @Path("/inconsistent_regions") + @Path("/inconsistent-regions") public List getInconsistentRegions() { return hbckReport.getInconsistentRegions().entrySet().stream() .map(obj1 -> new HbckInconsistentRegions(obj1.getKey(), @@ -92,7 +91,7 @@ public List getInconsistentRegions() { } @GET - @Path("/region_holes") + @Path("/region-holes") public List getRegionChainHoles() { return catalogJanitorReport.getHoles().stream() .map(obj1 -> new HbckRegionHoles(parseRegionInfo(obj1.getFirst()), @@ -101,7 +100,7 @@ public List getRegionChainHoles() { } @GET - @Path("/region_overlaps") + @Path("/region-overlaps") public List getRegionChainOverlap() { return catalogJanitorReport.getOverlaps().stream() .map(obj1 -> new HbckOverlapRegions(parseRegionInfo(obj1.getFirst()), @@ -110,7 +109,7 @@ public List getRegionChainOverlap() { } @GET - @Path("/unknown_servers") + @Path("/unknown-servers") public List getUnknownServers() { return catalogJanitorReport.getUnknownServers().stream() .map(obj1 -> new HbckUnknownServers(parseRegionInfo(obj1.getFirst()), @@ -119,7 +118,7 @@ public List getUnknownServers() { } @GET - @Path("/empty_regioninfo") + @Path("/empty-regioninfo") public List getEmptyRegionInfo() { return catalogJanitorReport.getEmptyRegionInfo().stream() .map(obj1 -> new HbckEmptyRegionInfo(Bytes.toString(obj1))).collect(Collectors.toList()); From caaee3d61e876dc19b9576ad077d90cfc0cbd281 Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Fri, 22 Mar 2024 04:32:38 -0700 Subject: [PATCH 5/9] Test fix after changes in resources naming changes --- .../master/http/TestHbckMetricsResource.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java index 646204b17d66..0420b4a7b705 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java @@ -58,7 +58,7 @@ import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; /** - * Tests for the master api_v1 {@link HbckMetricsResource}. + * Tests for the {@link HbckMetricsResource}. */ @Category({ MasterTests.class, LargeTests.class }) public class TestHbckMetricsResource { @@ -114,7 +114,7 @@ protected void before() throws Throwable { admin.getMaster().thenApply(ServerName::getHostname).thenCombine(admin.getMasterInfoPort(), (hostName, infoPort) -> "http://" + hostName + ":" + infoPort).get(); final Client client = ClientBuilder.newClient(); - target = client.target(baseUrl).path("hbck/hbck_metrics"); + target = client.target(baseUrl).path("hbck/hbck-metrics"); } @Override @@ -160,7 +160,7 @@ public void testGetRootHtml() { @Test public void testGetOrphanRegionOnFS() { final String response = - classRule.getTarget().path("orphan_regions_on_fs").request(MediaType.APPLICATION_JSON_TYPE) + classRule.getTarget().path("orphan-regions-on-fs").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); } @@ -168,14 +168,14 @@ public void testGetOrphanRegionOnFS() { @Test public void testGetOrphanRegionOnFSHtml() { assertThrows(NotAcceptableException.class, - () -> classRule.getTarget().path("orphan_regions_on_fs").request(MediaType.TEXT_HTML_TYPE) + () -> classRule.getTarget().path("orphan-regions-on-fs").request(MediaType.TEXT_HTML_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class)); } @Test public void testGetOrphanRegionOnRS() { final String response = - classRule.getTarget().path("orphan_regions_on_rs").request(MediaType.APPLICATION_JSON_TYPE) + classRule.getTarget().path("orphan-regions-on-rs").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); } @@ -183,14 +183,14 @@ public void testGetOrphanRegionOnRS() { @Test public void testGetOrphanRegionOnRSHtml() { assertThrows(NotAcceptableException.class, - () -> classRule.getTarget().path("orphan_regions_on_rs").request(MediaType.TEXT_HTML_TYPE) + () -> classRule.getTarget().path("orphan-regions-on-rs").request(MediaType.TEXT_HTML_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class)); } @Test public void testGetInconsistentRegions() { final String response = - classRule.getTarget().path("inconsistent_regions").request(MediaType.APPLICATION_JSON_TYPE) + classRule.getTarget().path("inconsistent-regions").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); } @@ -198,63 +198,63 @@ public void testGetInconsistentRegions() { @Test public void testGetInconsistentRegionsHtml() { assertThrows(NotAcceptableException.class, - () -> classRule.getTarget().path("inconsistent_regions").request(MediaType.TEXT_HTML_TYPE) + () -> classRule.getTarget().path("inconsistent-regions").request(MediaType.TEXT_HTML_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class)); } @Test public void testGetRegionHoles() { final String response = - classRule.getTarget().path("region_holes").request(MediaType.APPLICATION_JSON_TYPE) + classRule.getTarget().path("region-holes").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); } @Test public void testGetRegionHolesHtml() { - assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("region_holes") + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("region-holes") .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); } @Test public void testGetRegionOverlaps() { final String response = - classRule.getTarget().path("region_overlaps").request(MediaType.APPLICATION_JSON_TYPE) + classRule.getTarget().path("region-overlaps").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); } @Test public void testGetRegionOverlapsHtml() { - assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("region_overlaps") + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("region-overlaps") .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); } @Test public void testGetUnkownServers() { final String response = - classRule.getTarget().path("unknown_servers").request(MediaType.APPLICATION_JSON_TYPE) + classRule.getTarget().path("unknown-servers").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); } @Test public void testGetUnkownServersHtml() { - assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("unknown_servers") + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("unknown-servers") .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); } @Test public void testGetEmptyRegionInfo() { final String response = - classRule.getTarget().path("empty_regioninfo").request(MediaType.APPLICATION_JSON_TYPE) + classRule.getTarget().path("empty-regioninfo").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); } @Test public void testGetEmptyRegionInfoHtml() { - assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("empty_regioninfo") + assertThrows(NotAcceptableException.class, () -> classRule.getTarget().path("empty-regioninfo") .request(MediaType.TEXT_HTML_TYPE).header("X-Jersey-Tracing-Accept", true).get(String.class)); } } From 8177556d139b5f7dddbb37ec55406d1172c2ede9 Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Fri, 22 Mar 2024 14:47:44 -0700 Subject: [PATCH 6/9] Mocked hbck and catalog janitor report object and variable name updates --- .../apache/hadoop/hbase/master/HMaster.java | 16 ++ .../http/hbck/model/HbckOverlapRegions.java | 18 +- .../http/hbck/model/HbckRegionHoles.java | 18 +- .../http/hbck/model/HbckUnknownServers.java | 11 +- .../master/http/TestHbckMetricsResource.java | 194 ++++++++++++++++-- 5 files changed, 217 insertions(+), 40 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 a03d9d76490f..d0d6e1ea2fd3 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 @@ -1384,6 +1384,22 @@ private void finishActiveMasterInitialization() throws IOException, InterruptedE status.markComplete("Progress after master initialized complete"); } + /** + * Used for testing only to set Mock objects. + * @param hbckChore hbckChore + */ + public void setHbckChoreForTesting(HbckChore hbckChore) { + this.hbckChore = hbckChore; + } + + /** + * Used for testing only to set Mock objects. + * @param catalogJanitorChore catalogJanitorChore + */ + public void setCatalogJanitorChoreForTesting(CatalogJanitor catalogJanitorChore) { + this.catalogJanitorChore = catalogJanitorChore; + } + private void createMissingCFsInMetaDuringUpgrade(TableDescriptor metaDescriptor) throws IOException { TableDescriptor newMetaDesc = TableDescriptorBuilder.newBuilder(metaDescriptor) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java index 84571219b1cf..cfa0340767be 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java @@ -21,19 +21,19 @@ @InterfaceAudience.Private public class HbckOverlapRegions { - private final HbckRegionDetails region1; - private final HbckRegionDetails region2; + private final HbckRegionDetails region1Info; + private final HbckRegionDetails region2Info; - public HbckOverlapRegions(HbckRegionDetails region1, HbckRegionDetails region2) { - this.region1 = region1; - this.region2 = region2; + public HbckOverlapRegions(HbckRegionDetails region1Info, HbckRegionDetails region2Info) { + this.region1Info = region1Info; + this.region2Info = region2Info; } - public HbckRegionDetails getRegion1() { - return region1; + public HbckRegionDetails getRegion1Info() { + return region1Info; } - public HbckRegionDetails getRegion2() { - return region2; + public HbckRegionDetails getRegion2Info() { + return region2Info; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java index e96a48e61049..7b778872f544 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java @@ -21,19 +21,19 @@ @InterfaceAudience.Private public class HbckRegionHoles { - private final HbckRegionDetails region1; - private final HbckRegionDetails region2; + private final HbckRegionDetails region1Info; + private final HbckRegionDetails region2Info; - public HbckRegionHoles(HbckRegionDetails regionHole1, HbckRegionDetails regionHole2) { - this.region1 = regionHole1; - this.region2 = regionHole2; + public HbckRegionHoles(HbckRegionDetails region1Info, HbckRegionDetails region2Info) { + this.region1Info = region1Info; + this.region2Info = region2Info; } - public HbckRegionDetails getRegion1() { - return region1; + public HbckRegionDetails getRegion1Info() { + return region1Info; } - public HbckRegionDetails getRegion2() { - return region2; + public HbckRegionDetails getRegion2Info() { + return region2Info; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java index 06148de94b1e..c291c8da64e2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java @@ -21,17 +21,16 @@ @InterfaceAudience.Private public class HbckUnknownServers { - private final HbckRegionDetails serverRegionId; + private final HbckRegionDetails regionInfo; private final HbckServerName serverName; - public HbckUnknownServers(HbckRegionDetails unknownServerRegionId, - HbckServerName unknownServerName) { - this.serverRegionId = unknownServerRegionId; + public HbckUnknownServers(HbckRegionDetails regionInfo, HbckServerName unknownServerName) { + this.regionInfo = regionInfo; this.serverName = unknownServerName; } - public HbckRegionDetails getServerRegionId() { - return serverRegionId; + public HbckRegionDetails getRegionInfo() { + return regionInfo; } public HbckServerName getServerName() { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java index 0420b4a7b705..6ed5087ccbdb 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestHbckMetricsResource.java @@ -17,16 +17,27 @@ */ package org.apache.hadoop.hbase.master.http; +import static org.apache.hadoop.hbase.client.RegionInfoBuilder.FIRST_META_REGIONINFO; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.ConnectionRule; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseConfiguration; @@ -39,17 +50,27 @@ import org.apache.hadoop.hbase.client.AsyncConnection; import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; import org.apache.hadoop.hbase.client.Durability; +import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; +import org.apache.hadoop.hbase.master.HMaster; +import org.apache.hadoop.hbase.master.hbck.HbckChore; +import org.apache.hadoop.hbase.master.hbck.HbckReport; import org.apache.hadoop.hbase.master.http.hbck.resource.HbckMetricsResource; +import org.apache.hadoop.hbase.master.janitor.CatalogJanitor; +import org.apache.hadoop.hbase.master.janitor.CatalogJanitorReport; import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Pair; import org.junit.ClassRule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.ExternalResource; import org.junit.rules.RuleChain; +import org.mockito.Mockito; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.apache.hbase.thirdparty.javax.ws.rs.NotAcceptableException; import org.apache.hbase.thirdparty.javax.ws.rs.client.Client; @@ -63,6 +84,54 @@ @Category({ MasterTests.class, LargeTests.class }) public class TestHbckMetricsResource { + private static final Logger LOG = LoggerFactory.getLogger(TestHbckMetricsResource.class); + + // Test data for Mock HBCK Report + private static final long reportStartTime = 123456789000L; + private static final long reportEndTime = 234567890000L; + private static final String regionId1 = "regionId1"; + private static final String regionId2 = "regionId2"; + private static final String localhost1 = "localhost1"; + private static final String localhost2 = "localhost2"; + private static final String port = "16010"; + private static final String hostStartCode = "123456789"; + private static final String path1 = "hdfs://path1"; + private static final String path2 = "hdfs://path2"; + private static final String metaRegionID = FIRST_META_REGIONINFO.getEncodedName(); + private static final String metaTableName = FIRST_META_REGIONINFO.getTable().getNameAsString(); + + // Various Keys in HBCK JSON Response. + private static final String quoteColon = "\":"; + private static final String quote = "\""; + private static final String regionId = quote + "region_id" + quoteColon; + private static final String regionHdfsPath = quote + "region_hdfs_path" + quoteColon; + private static final String rsName = quote + "rs_name" + quoteColon; + private static final String hostName = quote + "host_name" + quoteColon; + private static final String hostPort = quote + "host_port" + quoteColon; + private static final String startCode = quote + "start_code" + quoteColon; + private static final String serverNameInMeta = quote + "server_name_in_meta" + quoteColon; + private static final String listOfServers = quote + "list_of_servers" + quoteColon; + private static final String region1Info = quote + "region1_info" + quoteColon; + private static final String region2Info = quote + "region2_info" + quoteColon; + private static final String regionInfo = quote + "region_info" + quoteColon; + private static final String serverName = quote + "server_name" + quoteColon; + private static final String tableName = quote + "table_name" + quoteColon; + + private static final String dataStartsWith = "{\"data\":["; + private static final String dataEndsWith = "]}"; + private static final String hbckReportStartTime = quote + "hbck_report_start_time" + quoteColon; + private static final String hbckReportEndTime = quote + "hbck_report_end_time" + quoteColon; + private static final String hbckOrphanRegionOnFS = + quote + "hbck_orphan_regions_on_fs" + quoteColon; + private static final String hbckOrphanRegionOnRS = + quote + "hbck_orphan_regions_on_rs" + quoteColon; + private static final String hbckInconsistentRegion = + quote + "hbck_inconsistent_regions" + quoteColon; + private static final String hbckHoles = quote + "hbck_holes" + quoteColon; + private static final String hbckOverlaps = quote + "hbck_overlaps" + quoteColon; + private static final String hbckUnknownServers = quote + "hbck_unknown_servers" + quoteColon; + private static final String hbckEmptyRegionInfo = quote + "hbck_empty_region_info" + quoteColon; + @ClassRule public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule.forClass(TestHbckMetricsResource.class); @@ -75,9 +144,6 @@ public class TestHbckMetricsResource { final Configuration conf = HBaseConfiguration.create(); conf.setInt(HConstants.MASTER_INFO_PORT, 0); conf.set("hbase.http.jersey.tracing.type", "ON_DEMAND"); - // If we don't set this value to higher like 5sec, hbck chore won't get a chance to run and - // the all tests in this class will fail. - conf.setInt("hbase.master.hbck.chore.interval", 1000); return conf; }).build(); @@ -110,6 +176,68 @@ protected void before() throws Throwable { .setDurability(Durability.SKIP_WAL).build(); admin.createTable(tableDescriptor).get(); + HMaster master = miniClusterRule.getTestingUtility().getMiniHBaseCluster().getMaster(); + + HbckChore hbckChore = mock(HbckChore.class); + HbckReport hbckReport = mock(HbckReport.class); + CatalogJanitor catalogJanitorChore = mock(CatalogJanitor.class); + CatalogJanitorReport catalogJanitorReport = mock(CatalogJanitorReport.class); + master.setHbckChoreForTesting(hbckChore); + master.setCatalogJanitorChoreForTesting(catalogJanitorChore); + + // Test data for Mock HBCK Report + ServerName server1 = + ServerName.valueOf(localhost1, Integer.parseInt(port), Integer.parseInt(hostStartCode)); + ServerName server2 = + ServerName.valueOf(localhost2, Integer.parseInt(port), Integer.parseInt(hostStartCode)); + Path hdfsPath1 = new Path(path1); + Path hdfsPath2 = new Path(path2); + + // Orphan on RS Test data + Map mapOfOrphanRegionsOnRS = new HashMap<>(); + mapOfOrphanRegionsOnRS.put(regionId1, server1); + mapOfOrphanRegionsOnRS.put(regionId2, server2); + + // Orphan Region on FS Test Data + Map mapOfOrphanRegionOnFS = new HashMap<>(); + mapOfOrphanRegionOnFS.put(regionId1, hdfsPath1); + mapOfOrphanRegionOnFS.put(regionId2, hdfsPath2); + + // Inconsistent Regions Test Data + Map>> mapOfInconsistentRegions = new HashMap<>(); + mapOfInconsistentRegions.put(regionId1, new Pair<>(server1, Arrays.asList(server1, server2))); + mapOfInconsistentRegions.put(regionId2, new Pair<>(server2, Arrays.asList(server1, server2))); + + // Region Overlap and Region Holes Test Data + List> listOfRegion = new ArrayList<>(); + listOfRegion.add(new Pair<>(FIRST_META_REGIONINFO, FIRST_META_REGIONINFO)); + listOfRegion.add(new Pair<>(FIRST_META_REGIONINFO, FIRST_META_REGIONINFO)); + + // Unknown RegionServer Test Data + List> listOfUnknownServers = new ArrayList<>(); + listOfUnknownServers.add(new Pair<>(FIRST_META_REGIONINFO, server1)); + listOfUnknownServers.add(new Pair<>(FIRST_META_REGIONINFO, server2)); + + // Empty Region Info Test Data + List listOfEmptyRegionInfo = new ArrayList<>(); + listOfEmptyRegionInfo.add(regionId1.getBytes()); + listOfEmptyRegionInfo.add(regionId2.getBytes()); + + // Mock HBCK Report and CatalogJanitor Report + when(hbckReport.getCheckingStartTimestamp()) + .thenReturn(Instant.ofEpochMilli(reportStartTime)); + when(hbckReport.getCheckingEndTimestamp()).thenReturn(Instant.ofEpochSecond(reportEndTime)); + when(hbckReport.getOrphanRegionsOnFS()).thenReturn(mapOfOrphanRegionOnFS); + when(hbckReport.getOrphanRegionsOnRS()).thenReturn(mapOfOrphanRegionsOnRS); + when(hbckReport.getInconsistentRegions()).thenReturn(mapOfInconsistentRegions); + when(catalogJanitorReport.getHoles()).thenReturn(listOfRegion); + when(catalogJanitorReport.getOverlaps()).thenReturn(listOfRegion); + when(catalogJanitorReport.getUnknownServers()).thenReturn(listOfUnknownServers); + when(catalogJanitorReport.getEmptyRegionInfo()).thenReturn(listOfEmptyRegionInfo); + + Mockito.doReturn(hbckReport).when(hbckChore).getLastReport(); + Mockito.doReturn(catalogJanitorReport).when(catalogJanitorChore).getLastReport(); + final String baseUrl = admin.getMaster().thenApply(ServerName::getHostname).thenCombine(admin.getMasterInfoPort(), (hostName, infoPort) -> "http://" + hostName + ":" + infoPort).get(); @@ -143,12 +271,14 @@ protected void after() { public void testGetRoot() { final String response = classRule.getTarget().request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(containsString("\"hbck_report_start_time\":"), - containsString("\"hbck_report_end_time\":"), containsString("\"hbck_orphan_regions_on_fs\":"), - containsString("\"hbck_orphan_regions_on_rs\":"), - containsString("\"hbck_inconsistent_regions\":"), containsString("\"hbck_holes\":"), - containsString("\"hbck_overlaps\":"), containsString("\"hbck_unknown_servers\":"), - containsString("\"hbck_empty_region_info\":"))); + LOG.info("HBCK JSON Response : " + response); + assertThat(response, + allOf(containsString(hbckReportStartTime), containsString(hbckReportEndTime), + containsString(hbckOrphanRegionOnFS), containsString(hbckOrphanRegionOnRS), + containsString(hbckInconsistentRegion), containsString(hbckHoles), + containsString(hbckOverlaps), containsString(hbckUnknownServers), + containsString(hbckEmptyRegionInfo), containsString(Objects.toString(reportStartTime)), + containsString(Objects.toString(reportEndTime)))); } @Test @@ -162,7 +292,11 @@ public void testGetOrphanRegionOnFS() { final String response = classRule.getTarget().path("orphan-regions-on-fs").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + LOG.info("HBCK Response for resource orphan-regions-on-fs : " + response); + assertThat(response, + allOf(startsWith(dataStartsWith), endsWith(dataEndsWith), containsString(regionId), + containsString(regionHdfsPath), containsString(regionId1), containsString(regionId2), + containsString(path1), containsString(path2))); } @Test @@ -177,7 +311,13 @@ public void testGetOrphanRegionOnRS() { final String response = classRule.getTarget().path("orphan-regions-on-rs").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + LOG.info("HBCK Response for resource orphan-regions-on-rs : " + response); + assertThat(response, + allOf(startsWith(dataStartsWith), endsWith(dataEndsWith), containsString(regionId), + containsString(rsName), containsString(hostName), containsString(hostPort), + containsString(startCode), containsString(regionId1), containsString(regionId2), + containsString(localhost1), containsString(localhost2), containsString(port), + containsString(hostStartCode))); } @Test @@ -192,7 +332,13 @@ public void testGetInconsistentRegions() { final String response = classRule.getTarget().path("inconsistent-regions").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + LOG.info("HBCK Response for resource inconsistent-regions : " + response); + assertThat(response, + allOf(startsWith(dataStartsWith), endsWith(dataEndsWith), containsString(hostName), + containsString(hostPort), containsString(startCode), containsString(listOfServers), + containsString(regionId1), containsString(regionId2), containsString(regionId), + containsString(serverNameInMeta), containsString(localhost1), containsString(localhost2), + containsString(port), containsString(hostStartCode))); } @Test @@ -207,7 +353,11 @@ public void testGetRegionHoles() { final String response = classRule.getTarget().path("region-holes").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + LOG.info("HBCK Response for resource region-holes : " + response); + assertThat(response, + allOf(startsWith(dataStartsWith), endsWith(dataEndsWith), containsString(region1Info), + containsString(region2Info), containsString(regionId), containsString(tableName), + containsString(metaRegionID), containsString(metaTableName))); } @Test @@ -221,7 +371,11 @@ public void testGetRegionOverlaps() { final String response = classRule.getTarget().path("region-overlaps").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + LOG.info("HBCK Response for resource region-overlaps : " + response); + assertThat(response, + allOf(startsWith(dataStartsWith), endsWith(dataEndsWith), containsString(regionId), + containsString(tableName), containsString(region2Info), containsString(region2Info), + containsString(metaRegionID), containsString(metaTableName))); } @Test @@ -235,7 +389,13 @@ public void testGetUnkownServers() { final String response = classRule.getTarget().path("unknown-servers").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + LOG.info("HBCK Response for resource unknown-servers : " + response); + assertThat(response, + allOf(startsWith(dataStartsWith), endsWith(dataEndsWith), containsString(regionInfo), + containsString(regionId), containsString(tableName), containsString(serverName), + containsString(serverName), containsString(port), containsString(startCode), + containsString(metaRegionID), containsString(metaTableName), containsString(localhost1), + containsString(localhost2), containsString(port), containsString(startCode))); } @Test @@ -249,7 +409,9 @@ public void testGetEmptyRegionInfo() { final String response = classRule.getTarget().path("empty-regioninfo").request(MediaType.APPLICATION_JSON_TYPE) .header("X-Jersey-Tracing-Accept", true).get(String.class); - assertThat(response, allOf(startsWith("{\"data\":["), endsWith("]}"))); + LOG.info("HBCK Response for resource empty-regioninfo : " + response); + assertThat(response, allOf(startsWith(dataStartsWith), endsWith(dataEndsWith), + containsString(regionInfo), containsString(regionId1), containsString(regionId2))); } @Test From e2593548629c0cc055d55273288189cb86b75709 Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Fri, 22 Mar 2024 18:09:37 -0700 Subject: [PATCH 7/9] build fix for Checkstyle checks --- .../apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java index 48f4ceae01c5..32dfd4a23b9c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/HbckConfigFactory.java @@ -29,7 +29,7 @@ import org.apache.hbase.thirdparty.org.glassfish.jersey.server.TracingConfig; @InterfaceAudience.Private -public class HbckConfigFactory { +public final class HbckConfigFactory { private HbckConfigFactory() { } From f077685b863c4664307683529c0e575ee3786a9b Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Mon, 25 Mar 2024 10:22:30 -0700 Subject: [PATCH 8/9] Move POJO classes to hbck-client package and adding Class description/comments --- .../hadoop/hbase}/HbckEmptyRegionInfo.java | 8 +++++-- .../hbase}/HbckInconsistentRegions.java | 8 +++++-- .../hadoop/hbase}/HbckOrphanRegionsOnFS.java | 8 +++++-- .../hadoop/hbase}/HbckOrphanRegionsOnRS.java | 8 +++++-- .../hadoop/hbase}/HbckOverlapRegions.java | 8 +++++-- .../hadoop/hbase}/HbckRegionDetails.java | 7 +++++-- .../apache/hadoop/hbase}/HbckRegionHoles.java | 8 +++++-- .../apache/hadoop/hbase}/HbckServerName.java | 7 +++++-- .../hadoop/hbase}/HbckUnknownServers.java | 8 +++++-- .../master/http/hbck/model/HbckMetrics.java | 10 +++++++++ .../hbck/resource/HbckMetricsResource.java | 21 +++++++++++-------- 11 files changed, 74 insertions(+), 27 deletions(-) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckEmptyRegionInfo.java (79%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckInconsistentRegions.java (85%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckOrphanRegionsOnFS.java (82%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckOrphanRegionsOnRS.java (82%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckOverlapRegions.java (82%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckRegionDetails.java (91%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckRegionHoles.java (82%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckServerName.java (91%) rename {hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model => hbase-client/src/main/java/org/apache/hadoop/hbase}/HbckUnknownServers.java (82%) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckEmptyRegionInfo.java similarity index 79% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckEmptyRegionInfo.java index 835178abb8a2..ebe4518cdf59 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckEmptyRegionInfo.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckEmptyRegionInfo.java @@ -15,11 +15,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO to present Empty Region Info from Catalog Janitor Inconsistencies Report via REST API. + * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + */ +@InterfaceAudience.Public public class HbckEmptyRegionInfo { private final String regionInfo; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckInconsistentRegions.java similarity index 85% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckInconsistentRegions.java index 2d165cdef36c..24878d9af5b6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckInconsistentRegions.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckInconsistentRegions.java @@ -15,12 +15,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import java.util.List; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO to present HBCK Inconsistent Regions from HBCK Inconsistencies Report via REST API. + * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK inconsistencies. + */ +@InterfaceAudience.Public public class HbckInconsistentRegions { private final String regionId; private final HbckServerName serverNameInMeta; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java similarity index 82% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java index e6ed22b179f4..cb1961cbc65d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnFS.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java @@ -15,11 +15,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO to present Orphan Region on FS from HBCK Inconsistencies Report via REST API. + * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK Inconsistencies. + */ +@InterfaceAudience.Public public class HbckOrphanRegionsOnFS { private final String regionId; private final String regionHdfsPath; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java similarity index 82% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java index 66b48a2f83e3..9981ff1031bb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOrphanRegionsOnRS.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java @@ -15,11 +15,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO to present Orphan Region on RS from HBCK Inconsistencies Report via REST API. + * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK Inconsistencies. + */ +@InterfaceAudience.Public public class HbckOrphanRegionsOnRS { private final String regionId; private final HbckServerName rsName; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOverlapRegions.java similarity index 82% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOverlapRegions.java index cfa0340767be..ecff4248f26b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckOverlapRegions.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOverlapRegions.java @@ -15,11 +15,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO to present Region Overlap from Catalog Janitor Inconsistencies Report via REST API. + * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + */ +@InterfaceAudience.Public public class HbckOverlapRegions { private final HbckRegionDetails region1Info; private final HbckRegionDetails region2Info; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionDetails.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionDetails.java similarity index 91% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionDetails.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionDetails.java index 103f36460eea..a79245636276 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionDetails.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionDetails.java @@ -15,11 +15,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO class for HBCK RegionInfo in HBCK Inconsistencies report. + */ +@InterfaceAudience.Public public class HbckRegionDetails { private final String regionId; private final String tableName; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionHoles.java similarity index 82% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionHoles.java index 7b778872f544..0036b9111ef6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckRegionHoles.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionHoles.java @@ -15,11 +15,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO to present Region Holes from Catalog Janitor Inconsistencies Report via REST API. + * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + */ +@InterfaceAudience.Public public class HbckRegionHoles { private final HbckRegionDetails region1Info; private final HbckRegionDetails region2Info; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckServerName.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckServerName.java similarity index 91% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckServerName.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckServerName.java index 1834d8208f91..2c6b899fb15c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckServerName.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckServerName.java @@ -15,11 +15,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO class for ServerName in HBCK Inconsistencies report. + */ +@InterfaceAudience.Public public class HbckServerName { private final String hostName; private final int hostPort; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckUnknownServers.java similarity index 82% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java rename to hbase-client/src/main/java/org/apache/hadoop/hbase/HbckUnknownServers.java index c291c8da64e2..7d32b457d4fc 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckUnknownServers.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckUnknownServers.java @@ -15,11 +15,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.hadoop.hbase.master.http.hbck.model; +package org.apache.hadoop.hbase; import org.apache.yetus.audience.InterfaceAudience; -@InterfaceAudience.Private +/** + * POJO to present Unknown Regions from Catalog Janitor Inconsistencies Report via REST API. + * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + */ +@InterfaceAudience.Public public class HbckUnknownServers { private final HbckRegionDetails regionInfo; private final HbckServerName serverName; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java index 9d7a20d4f7ca..ba4cfecdcf4c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/model/HbckMetrics.java @@ -18,8 +18,18 @@ package org.apache.hadoop.hbase.master.http.hbck.model; import java.util.List; +import org.apache.hadoop.hbase.HbckEmptyRegionInfo; +import org.apache.hadoop.hbase.HbckInconsistentRegions; +import org.apache.hadoop.hbase.HbckOrphanRegionsOnFS; +import org.apache.hadoop.hbase.HbckOrphanRegionsOnRS; +import org.apache.hadoop.hbase.HbckOverlapRegions; +import org.apache.hadoop.hbase.HbckRegionHoles; +import org.apache.hadoop.hbase.HbckUnknownServers; import org.apache.yetus.audience.InterfaceAudience; +/** + * This class exposes hbck.jsp report as JSON Output via /hbck/hbck-metrics API. + */ @InterfaceAudience.Private public class HbckMetrics { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java index 2b969a430787..403b789bea5a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java @@ -24,16 +24,16 @@ import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.master.hbck.HbckReport; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckEmptyRegionInfo; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckInconsistentRegions; +import org.apache.hadoop.hbase.HbckEmptyRegionInfo; +import org.apache.hadoop.hbase.HbckInconsistentRegions; import org.apache.hadoop.hbase.master.http.hbck.model.HbckMetrics; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckOrphanRegionsOnFS; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckOrphanRegionsOnRS; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckOverlapRegions; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckRegionDetails; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckRegionHoles; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckServerName; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckUnknownServers; +import org.apache.hadoop.hbase.HbckOrphanRegionsOnFS; +import org.apache.hadoop.hbase.HbckOrphanRegionsOnRS; +import org.apache.hadoop.hbase.HbckOverlapRegions; +import org.apache.hadoop.hbase.HbckRegionDetails; +import org.apache.hadoop.hbase.HbckRegionHoles; +import org.apache.hadoop.hbase.HbckServerName; +import org.apache.hadoop.hbase.HbckUnknownServers; import org.apache.hadoop.hbase.master.janitor.CatalogJanitorReport; import org.apache.hadoop.hbase.util.Bytes; import org.apache.yetus.audience.InterfaceAudience; @@ -43,6 +43,9 @@ import org.apache.hbase.thirdparty.javax.ws.rs.Produces; import org.apache.hbase.thirdparty.javax.ws.rs.core.MediaType; +/** + * The root object exposing hbck.jsp page as JSON Output. + */ @Path("hbck-metrics") @Produces({ MediaType.APPLICATION_JSON }) @InterfaceAudience.Private From 0a6e1f64931a63456c85b2c3498de3b7136960a1 Mon Sep 17 00:00:00 2001 From: Mihir Monani Date: Mon, 25 Mar 2024 10:23:55 -0700 Subject: [PATCH 9/9] mvn spotless:apply changes --- .../org/apache/hadoop/hbase/HbckEmptyRegionInfo.java | 5 +++-- .../apache/hadoop/hbase/HbckInconsistentRegions.java | 4 ++-- .../org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java | 4 ++-- .../org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java | 4 ++-- .../org/apache/hadoop/hbase/HbckOverlapRegions.java | 5 +++-- .../java/org/apache/hadoop/hbase/HbckRegionHoles.java | 5 +++-- .../org/apache/hadoop/hbase/HbckUnknownServers.java | 5 +++-- .../master/http/hbck/resource/HbckMetricsResource.java | 10 +++++----- 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckEmptyRegionInfo.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckEmptyRegionInfo.java index ebe4518cdf59..5d1ca54bf1be 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckEmptyRegionInfo.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckEmptyRegionInfo.java @@ -20,8 +20,9 @@ import org.apache.yetus.audience.InterfaceAudience; /** - * POJO to present Empty Region Info from Catalog Janitor Inconsistencies Report via REST API. - * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + * POJO to present Empty Region Info from Catalog Janitor Inconsistencies Report via REST API. These + * inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor + * inconsistencies. */ @InterfaceAudience.Public public class HbckEmptyRegionInfo { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckInconsistentRegions.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckInconsistentRegions.java index 24878d9af5b6..f32f73a73d15 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckInconsistentRegions.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckInconsistentRegions.java @@ -21,8 +21,8 @@ import org.apache.yetus.audience.InterfaceAudience; /** - * POJO to present HBCK Inconsistent Regions from HBCK Inconsistencies Report via REST API. - * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK inconsistencies. + * POJO to present HBCK Inconsistent Regions from HBCK Inconsistencies Report via REST API. These + * inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK inconsistencies. */ @InterfaceAudience.Public public class HbckInconsistentRegions { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java index cb1961cbc65d..43a045fb2933 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnFS.java @@ -20,8 +20,8 @@ import org.apache.yetus.audience.InterfaceAudience; /** - * POJO to present Orphan Region on FS from HBCK Inconsistencies Report via REST API. - * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK Inconsistencies. + * POJO to present Orphan Region on FS from HBCK Inconsistencies Report via REST API. These + * inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK Inconsistencies. */ @InterfaceAudience.Public public class HbckOrphanRegionsOnFS { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java index 9981ff1031bb..2d442b7a9e40 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOrphanRegionsOnRS.java @@ -20,8 +20,8 @@ import org.apache.yetus.audience.InterfaceAudience; /** - * POJO to present Orphan Region on RS from HBCK Inconsistencies Report via REST API. - * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK Inconsistencies. + * POJO to present Orphan Region on RS from HBCK Inconsistencies Report via REST API. These + * inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of HBCK Inconsistencies. */ @InterfaceAudience.Public public class HbckOrphanRegionsOnRS { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOverlapRegions.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOverlapRegions.java index ecff4248f26b..4170932bf563 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOverlapRegions.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckOverlapRegions.java @@ -20,8 +20,9 @@ import org.apache.yetus.audience.InterfaceAudience; /** - * POJO to present Region Overlap from Catalog Janitor Inconsistencies Report via REST API. - * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + * POJO to present Region Overlap from Catalog Janitor Inconsistencies Report via REST API. These + * inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor + * inconsistencies. */ @InterfaceAudience.Public public class HbckOverlapRegions { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionHoles.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionHoles.java index 0036b9111ef6..643e014735a0 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionHoles.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckRegionHoles.java @@ -20,8 +20,9 @@ import org.apache.yetus.audience.InterfaceAudience; /** - * POJO to present Region Holes from Catalog Janitor Inconsistencies Report via REST API. - * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + * POJO to present Region Holes from Catalog Janitor Inconsistencies Report via REST API. These + * inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor + * inconsistencies. */ @InterfaceAudience.Public public class HbckRegionHoles { diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckUnknownServers.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckUnknownServers.java index 7d32b457d4fc..c070f84e69fe 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckUnknownServers.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HbckUnknownServers.java @@ -20,8 +20,9 @@ import org.apache.yetus.audience.InterfaceAudience; /** - * POJO to present Unknown Regions from Catalog Janitor Inconsistencies Report via REST API. - * These inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor inconsistencies. + * POJO to present Unknown Regions from Catalog Janitor Inconsistencies Report via REST API. These + * inconsistencies are shown on hbck.jsp page on Active HMaster UI as part of Catalog Janitor + * inconsistencies. */ @InterfaceAudience.Public public class HbckUnknownServers { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java index 403b789bea5a..96924aa126d3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/http/hbck/resource/HbckMetricsResource.java @@ -20,13 +20,8 @@ import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; -import org.apache.hadoop.hbase.ServerName; -import org.apache.hadoop.hbase.client.RegionInfo; -import org.apache.hadoop.hbase.master.MasterServices; -import org.apache.hadoop.hbase.master.hbck.HbckReport; import org.apache.hadoop.hbase.HbckEmptyRegionInfo; import org.apache.hadoop.hbase.HbckInconsistentRegions; -import org.apache.hadoop.hbase.master.http.hbck.model.HbckMetrics; import org.apache.hadoop.hbase.HbckOrphanRegionsOnFS; import org.apache.hadoop.hbase.HbckOrphanRegionsOnRS; import org.apache.hadoop.hbase.HbckOverlapRegions; @@ -34,6 +29,11 @@ import org.apache.hadoop.hbase.HbckRegionHoles; import org.apache.hadoop.hbase.HbckServerName; import org.apache.hadoop.hbase.HbckUnknownServers; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.client.RegionInfo; +import org.apache.hadoop.hbase.master.MasterServices; +import org.apache.hadoop.hbase.master.hbck.HbckReport; +import org.apache.hadoop.hbase.master.http.hbck.model.HbckMetrics; import org.apache.hadoop.hbase.master.janitor.CatalogJanitorReport; import org.apache.hadoop.hbase.util.Bytes; import org.apache.yetus.audience.InterfaceAudience;