From 3b112e579264d686e666a38d474958a97183621a Mon Sep 17 00:00:00 2001 From: Andrew Purtell Date: Mon, 16 Oct 2023 15:52:50 -0700 Subject: [PATCH] HBASE-28157. hbck should report previously reported regions with null region location Ensure that hbck will report as inconsistent regions where previously a location was reported but now the region location is null, if it is not expected to be offline. --- .../org/apache/hadoop/hbase/master/hbck/HbckChore.java | 5 +---- .../src/main/resources/hbase-webapps/master/hbck.jsp | 4 ++++ .../hadoop/hbase/master/assignment/TestHbckChore.java | 7 +++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/hbck/HbckChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/hbck/HbckChore.java index 3a0fd15d6ead..75df2da5a71e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/hbck/HbckChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/hbck/HbckChore.java @@ -230,10 +230,7 @@ private void loadRegionsFromRSReport(final HbckReport report) { for (Map.Entry entry : report.getRegionInfoMap().entrySet()) { HbckRegionInfo hri = entry.getValue(); - ServerName locationInMeta = hri.getMetaEntry().getRegionServer(); - if (locationInMeta == null) { - continue; - } + ServerName locationInMeta = hri.getMetaEntry().getRegionServer(); // can be null if (hri.getDeployedOn().size() == 0) { // skip the offline region which belong to disabled table. if (report.getDisabledTableRegions().contains(hri.getRegionNameAsString())) { diff --git a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp index 7a385a0a2a64..38e16ca8e28f 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/hbck.jsp @@ -355,9 +355,13 @@ * If a live server reference, make it a link. * If dead, make it italic. * If unknown, make it plain. + * If null, make it "null". */ private static String formatServerName(HMaster master, ServerManager serverManager, ServerName serverName) { + if (serverName == null) { + return "null"; + } String sn = serverName.toString(); if (serverManager.isServerOnline(serverName)) { int infoPort = master.getRegionServerInfoPort(serverName); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChore.java index b99bdb0090de..70afeae4c6ea 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChore.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestHbckChore.java @@ -150,6 +150,13 @@ public void testForUserTable() throws Exception { hbckChore.choreForTesting(); inconsistentRegions = hbckChore.getLastReport().getInconsistentRegions(); assertFalse(inconsistentRegions.containsKey(regionName)); + + // Test for case4: No region location for a previously reported region. Probably due to + // TRSP bug or bypass. + am.offlineRegion(hri); + hbckChore.choreForTesting(); + inconsistentRegions = hbckChore.getLastReport().getInconsistentRegions(); + assertTrue(inconsistentRegions.containsKey(regionName)); } @Test