Skip to content

Commit e08c367

Browse files
authored
HBASE-29715: AssignmentManager is trying to pick up the active cluster's tables before refreshing meta and hfiles (#7474)
Signed-off-by: Tak Lon (Stephen) Wu <taklwu@apache.org> Signed-off-by: Andor Molnár <andor@apache.org> Reviewed by: Kota-SH <shanmukhaharipriya@gmail.com>
1 parent 2a2c25d commit e08c367

File tree

2 files changed

+73
-11
lines changed

2 files changed

+73
-11
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3116,16 +3116,9 @@ public ClusterMetrics getClusterMetricsWithoutCoprocessor(EnumSet<Option> option
31163116
if (isActiveMaster() && isInitialized() && assignmentManager != null) {
31173117
try {
31183118
Map<TableName, RegionStatesCount> tableRegionStatesCountMap = new HashMap<>();
3119-
Map<String, TableDescriptor> tableDescriptorMap = getTableDescriptors().getAll();
3120-
for (TableDescriptor tableDescriptor : tableDescriptorMap.values()) {
3119+
List<TableDescriptor> tableDescriptors = listTableDescriptors(null, null, null, true);
3120+
for (TableDescriptor tableDescriptor : tableDescriptors) {
31213121
TableName tableName = tableDescriptor.getTableName();
3122-
if (
3123-
tableName.isSystemTable() && tableName.getQualifierAsString().startsWith("meta")
3124-
&& !tableName.equals(TableName.META_TABLE_NAME)
3125-
) {
3126-
LOG.info("Skipping foreign meta table {} in cluster metrics", tableName);
3127-
continue;
3128-
}
31293122
RegionStatesCount regionStatesCount =
31303123
assignmentManager.getRegionStatesCount(tableName);
31313124
tableRegionStatesCountMap.put(tableName, regionStatesCount);
@@ -3828,7 +3821,7 @@ public List<TableName> listTableNames(final String namespace, final String regex
38283821
}
38293822

38303823
/**
3831-
* Return a list of table table descriptors after applying any provided filter parameters. Note
3824+
* Return a list of table descriptors after applying any provided filter parameters. Note
38323825
* that the user-facing description of this filter logic is presented on the class-level javadoc
38333826
* of {@link NormalizeTableFilterParams}.
38343827
*/
@@ -3839,7 +3832,7 @@ private List<TableDescriptor> getTableDescriptors(final List<TableDescriptor> ht
38393832
// request for all TableDescriptors
38403833
Collection<TableDescriptor> allHtds;
38413834
if (namespace != null && namespace.length() > 0) {
3842-
// Do a check on the namespace existence. Will fail if does not exist.
3835+
// Do a check on the namespace existence. Will fail if it does not exist.
38433836
this.clusterSchemaService.getNamespace(namespace);
38443837
allHtds = tableDescriptors.getByNamespace(namespace).values();
38453838
} else {

hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestMasterMetrics.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,17 @@
2222

2323
import java.io.IOException;
2424
import java.io.UncheckedIOException;
25+
import java.util.ArrayList;
2526
import java.util.EnumSet;
2627
import java.util.HashMap;
28+
import java.util.List;
2729
import java.util.Map;
2830
import org.apache.hadoop.conf.Configuration;
2931
import org.apache.hadoop.hbase.ClusterMetrics;
3032
import org.apache.hadoop.hbase.CompatibilityFactory;
3133
import org.apache.hadoop.hbase.HBaseClassTestRule;
3234
import org.apache.hadoop.hbase.HBaseTestingUtil;
35+
import org.apache.hadoop.hbase.NamespaceDescriptor;
3336
import org.apache.hadoop.hbase.ServerMetricsBuilder;
3437
import org.apache.hadoop.hbase.ServerName;
3538
import org.apache.hadoop.hbase.SingleProcessHBaseCluster;
@@ -225,4 +228,70 @@ public void testClusterMetricsMetaTableSkipping() throws Exception {
225228
master.getTableDescriptors().remove(replicaMetaTable);
226229
}
227230
}
231+
232+
@Test
233+
public void testClusterMetricsForeignTableSkipping() throws Exception {
234+
List<TableName> allTables = new ArrayList<>();
235+
236+
// These tables, including the cluster's meta table, should not be foreign to the cluster.
237+
// The cluster should be able to find their state.
238+
allTables.add(TableName.META_TABLE_NAME);
239+
List<TableName> familiarTables = new ArrayList<>();
240+
familiarTables.add(TableName.valueOf(null, "familiarTable1"));
241+
familiarTables.add(TableName.valueOf("", "familiarTable2"));
242+
familiarTables.add(TableName.valueOf("default", "familiarTable3"));
243+
familiarTables.add(TableName.valueOf("familiarNamespace", "familiarTable4"));
244+
familiarTables.add(TableName.valueOf("familiarNamespace", "familiarTable5"));
245+
246+
// Create these "familiar" tables so their state can be found
247+
TEST_UTIL.getAdmin().createNamespace(NamespaceDescriptor.create("familiarNamespace").build());
248+
for (TableName familiarTable : familiarTables) {
249+
TEST_UTIL.createTable(familiarTable, "cf");
250+
allTables.add(familiarTable);
251+
}
252+
253+
// These tables should be foreign to the cluster.
254+
// The cluster should not be able to find their state.
255+
allTables.add(TableName.valueOf("hbase", "meta_replica"));
256+
allTables.add(TableName.valueOf(null, "defaultNamespaceTable1"));
257+
allTables.add(TableName.valueOf("", "defaultNamespaceTable2"));
258+
allTables.add(TableName.valueOf("default", "defaultNamespaceTable3"));
259+
allTables.add(TableName.valueOf("customNamespace", "customNamespaceTable1"));
260+
allTables.add(TableName.valueOf("customNamespace", "customNamespaceTable2"));
261+
allTables.add(TableName.valueOf("anotherNamespace", "anotherNamespaceTable"));
262+
allTables.add(TableName.valueOf("sharedNamespace", "sharedNamespaceTable1"));
263+
allTables.add(TableName.valueOf("sharedNamespace", "sharedNamespaceTable2"));
264+
265+
// Update master's table descriptors to have all tables
266+
TableDescriptor foreignTableDescriptor;
267+
for (TableName tableName : allTables) {
268+
foreignTableDescriptor = TableDescriptorBuilder.newBuilder(tableName)
269+
.setColumnFamily(ColumnFamilyDescriptorBuilder.of("cf")).build();
270+
master.getTableDescriptors().update(foreignTableDescriptor, true);
271+
}
272+
273+
// The state of the meta table and the familiar tables we created should exist.
274+
// The other tables' state should not exist.
275+
for (TableName tableName : allTables) {
276+
try {
277+
ClusterMetrics metrics = master.getClusterMetricsWithoutCoprocessor(
278+
EnumSet.of(ClusterMetrics.Option.TABLE_TO_REGIONS_COUNT));
279+
Map<TableName, RegionStatesCount> tableRegionStatesCount =
280+
metrics.getTableRegionStatesCount();
281+
282+
if (
283+
tableName.equals(TableName.META_TABLE_NAME)
284+
|| tableName.getQualifierAsString().startsWith("familiar")
285+
) {
286+
assertTrue("Expected this table's state to exist: " + tableName,
287+
tableRegionStatesCount.containsKey(tableName));
288+
} else {
289+
assertFalse("This foreign table's state should not exist: " + tableName,
290+
tableRegionStatesCount.containsKey(tableName));
291+
}
292+
} finally {
293+
master.getTableDescriptors().remove(tableName);
294+
}
295+
}
296+
}
228297
}

0 commit comments

Comments
 (0)